Форум программистов, компьютерный форум CyberForum.ru

Получить список пользователей из <разрешения для общего доступа> - C++

Восстановить пароль Регистрация
 
Azamatt
0 / 0 / 0
Регистрация: 27.05.2013
Сообщений: 10
25.04.2016, 22:16     Получить список пользователей из <разрешения для общего доступа> #1
Пока собственно не очень понимаю как задать вопрос, сталкиваюсь впервые
Имеется папка с общим доступом, для нее в "разрешения для общего доступа" можно предоставлять пользователям права(Полный доступ/Запись/Чтение). Можно ли получить список всех пользователей которые там находятся и что им разрешено?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.04.2016, 22:16     Получить список пользователей из <разрешения для общего доступа>
Посмотрите здесь:

Динамический список (нарушение прав доступа) C++
C++ Даны сведения о результатах сессии. Вывести список группы по убыванию общего балла.
C++ Линейный список прямого доступа в связанной памяти
C++ Как посмотреть список прав доступа (ACL) к конкретному файлу?
C++ Распечатать список студентов со средним баллом выше общего среднего балла
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4303 / 3724 / 1255
Регистрация: 14.04.2014
Сообщений: 14,581
25.04.2016, 22:27     Получить список пользователей из <разрешения для общего доступа> #2
Можно. Через функции Windows.
Azamatt
0 / 0 / 0
Регистрация: 27.05.2013
Сообщений: 10
26.04.2016, 07:45  [ТС]     Получить список пользователей из <разрешения для общего доступа> #3
Пожалуйста напишите с помощью каких, от чего отталкиваться?
jupman
172 / 75 / 11
Регистрация: 10.11.2015
Сообщений: 209
26.04.2016, 15:09     Получить список пользователей из <разрешения для общего доступа> #4
Цитата Сообщение от Azamatt Посмотреть сообщение
от чего отталкиваться?
Если коротко, то устроено примерно так. Охраняемый объект в Windows (файл, папка, процесс и т.д.) имеет так называемый дескриптор безопасности. В этом дескрипторе безопасности содержится определенная информация включая так называемый DACL (список контроля доступа). Каждый элемент этого списка (ACE) содержит информацию: идентификатор безопасности (SID) субъекта, маску доступа (GENERIC_READ и т.д.), флаг определяющий тип (allowed/denied) элемента и т.д. Каждый процесс имеет токен (выдается пользователю при входе в систему). При обращении к охраняемому объекту система сверяет информацию заданную в маркере (SID пользователя и групп) с информацией в дескрипторе безопасности (в элементах ACE). Ну и на основании сверки выносит вердикт (разрешать доступ или нет). В общем вам нужно список DACL получить. Хорошее описание данной темы есть в книге "Системное программирование в Windows" (А. Побегайло) в соответствующей главе. Книга есть в сети.
Azamatt
0 / 0 / 0
Регистрация: 27.05.2013
Сообщений: 10
26.04.2016, 20:50  [ТС]     Получить список пользователей из <разрешения для общего доступа> #5
Получается в маске которая находится DACL-е, и хранится все права которые даны пользователю, разрешенному выполнять действия с объектом?
Если так то у Побегайло описаны права находящиеся в маске, которые может иметь пользователь. Не понимаю только как узнать по маске какие права, если они в битовой форме. В книге описаны какой диапазон битов какие группы прав хранит.
В Побегайло описаны как праметры выводить только все в разброс.

нашел код в просторах интернета, выводит некоторые данные DACL, в том числе маску, маска выводится набором цифр, загуглил цифры, некоторые нашел, они характеризовали группу безопасности(пользователи, администратор и т.д.). Не увидел в выведенном списке пользователей, которые видны в "разрешения для общего доступа".
То нашел? можно этот код как пример использовать или он есть мое решение, но из-за не знания как его использовать не получается вывести необходимое?
функции используемые в примере посмотрел в книге Побегайло.
Кликните здесь для просмотра всего текста

#include <iostream>
#include <iomanip>

#include <windows.h>
#include <aclapi.h>

using namespace std;

void finish( int error )
{
if (error) exit( EXIT_FAILURE );
else exit( EXIT_SUCCESS );
}

int main( int argc, char* argv[] )
{
/* File/Directory name is passed as a first parameter */
if (argc < 2) {
cout << "object names is not specified" << endl;
finish( 1 );
}

PSECURITY_DESCRIPTOR pSD;
PACL pDACL;
ACL_SIZE_INFORMATION aclSize;
DWORD result;

// Get DACL for the specified named object.
result = GetNamedSecurityInfo( argv[1], SE_FILE_OBJECT,
DACL_SECURITY_INFORMATION,
NULL, NULL, &pDACL, NULL, &pSD );
if(ERROR_SUCCESS != result) {
cout << "GetNamedSecurityInfo failed (" << result << ")" << endl;
finish( 1 );
}

// Permissions are not specified (you have FAT ;-))
if (NULL == pDACL) {
cout << argv[1] << " has no DACL" << endl;
finish( 0 );
}

// Here we have valid DACL with a list of ACEs (with SIDs).
// Let's get number of ACEs.
if(!GetAclInformation( pDACL, &aclSize, sizeof(aclSize), AclSizeInformation )) {
cout << "GetAclInformation failed (" << GetLastError() << ")" << endl;
finish( 1 );
}

// Walk through ACEs and display information about each entry
for ( DWORD ace_idx = 0; ace_idx < aclSize.AceCount; ace_idx++) {
ACCESS_ALLOWED_ACE* pACE;

if (GetAce( pDACL, ace_idx, (PVOID*)&pACE )) {
char user[256] = "";
char domain[256] = "";
DWORD user_len = sizeof(user);
DWORD domain_len = sizeof(domain);
SID_NAME_USE sid_name_use;
PSID pSID =(PSID)(&(pACE->SidStart));

// Take SID from ACE and get accoount name
cout << setw(3) << ace_idx << ") ";
if (LookupAccountSid( NULL, pSID, user, &user_len,
domain, &domain_len, &sid_name_use)){
cout << domain << "" << user;
}
else {
cout << "unknown";
}

// Display ACE type
switch (pACE->Header.AceType) {
case ACCESS_ALLOWED_ACE_TYPE:
cout << " allowed";
break;
case ACCESS_DENIED_ACE_TYPE:
cout << " denied";
break;
default:
cout << " audit"; // in fact, never happens in this example
}

// Display access MASK
cout << " mask " << pACE->Mask << endl;
}
else {
cout << "GetAce failed at index " << ace_idx << endl;
}

}
finish( 0 );
}
jupman
172 / 75 / 11
Регистрация: 10.11.2015
Сообщений: 209
27.04.2016, 16:43     Получить список пользователей из <разрешения для общего доступа> #6
Цитата Сообщение от Azamatt Посмотреть сообщение
Получается в маске которая находится DACL-е, и хранится все права которые даны пользователю, разрешенному выполнять действия с объектом?
DACL это список из ACE. В каждом элементе ACE маска доступа для конкретного субъекта (пользователь или группа).
Цитата Сообщение от Azamatt Посмотреть сообщение
Если так то у Побегайло описаны права находящиеся в маске, которые может иметь пользователь. Не понимаю только как узнать по маске какие права, если они в битовой форме. В книге описаны какой диапазон битов какие группы прав хранит.
В Побегайло описаны как праметры выводить только все в разброс.
У Побегайло они описаны в разделе 36.7 Списки управления доступом.

Добавлено через 18 минут
Цитата Сообщение от Azamatt Посмотреть сообщение
То нашел?
Да. Ну вот и читайте у Побегайло (36.7) про маску доступа и разбирайте маску.
Yandex
Объявления
27.04.2016, 16:43     Получить список пользователей из <разрешения для общего доступа>
Ответ Создать тему
Опции темы

Текущее время: 16:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru