Проверка результирующих прав на директории \ файлы (Windows)
Выводить русский язык (кодировка 1251) в консоли. Необходимо выбрать шрифт lucida console.
Будем считать, что в качестве аргументов мы передаем объект системы (файл \ папка) и субъект (пользователь \ группа)
Получим SID пользователя или группы по его \ ее имени:
Далее нам будет нужен дескриптор безопасности файла \ папки:
Теперь осталось только проверить права с помощью функции GetEffectiveRightsFromAcl.
Для этого нужно создать структуру TRUSTEE по уже полученному SID:
И наконец сами права:
msdn -> LookupAccountSid
msdn -> BuildTrusteeWithSid
msdn -> GetNamedSecurityInfo
Пример интерпретации прав:
Пример запуска программы:
>acl.exe "C:\TestRoot\TestDir\TestFile.txt" testuser
SID: 00155928
Effective Allowed Access Mask : 1101FF
Обзор папок выполнение файлов
Содержание папки чтение данных
Чтение атрибутов
Чтение дополнительных атрибутов
Создание файлов запись данных
Создание папок дозапись данных
Запись атрибутов
Запись дополнительных атрибутов
Удаление подпапок и файлов
Удаление
sync
if (!SetConsoleOutputCP(1251)) return 1;
Будем считать, что в качестве аргументов мы передаем объект системы (файл \ папка) и субъект (пользователь \ группа)
Получим SID пользователя или группы по его \ ее имени:
PSID psid = NULL; psid = ConvertNameToBinarySid(argv[2]); cout << "SID: " << psid << "\n";
Далее нам будет нужен дескриптор безопасности файла \ папки:
PACL pDacl; PSECURITY_DESCRIPTOR psd = NULL; GetNamedSecurityInfo(argv[1], SE_FILE_OBJECT, DACL_SECURITY_INFORMATION | OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION, NULL, NULL, &pDacl, NULL, &psd);
Теперь осталось только проверить права с помощью функции GetEffectiveRightsFromAcl.
Для этого нужно создать структуру TRUSTEE по уже полученному SID:
PTRUSTEE trustee = new TRUSTEE(); BuildTrusteeWithSid(trustee, psid);
И наконец сами права:
ACCESS_MASK accessRights;
DWORD ResVal = 0;
ResVal = GetEffectiveRightsFromAcl(pDacl, trustee, &accessRights);
if (ResVal != ERROR_SUCCESS){
cout << "error";
return 0;
}
DisplayAccessMask(accessRights);
...
if(psid != NULL){
LocalFree(psid);
psid = NULL;
};
LocalFree(psd);
msdn -> ConvertNameToBinarySidmsdn -> LookupAccountSid
msdn -> BuildTrusteeWithSid
msdn -> GetNamedSecurityInfo
Пример интерпретации прав:
void DisplayAccessMask(ACCESS_MASK Mask)
{
wprintf_s(L"Effective Allowed Access Mask : %8X\n", Mask);
/* bit permission
0 FILE_READ_DATA
1 FILE_WRITE_DATA
2 FILE_APPEND_DATA
3 FILE_READ_EA
4 FILE_WRITE_EA
5 FILE_EXECUTE
6 FILE_DELETE_CHILD
7 FILE_READ_ATTRIBUTES
8 FILE_WRITE_ATTRIBUTES */
if (((Mask & GENERIC_ALL) == GENERIC_ALL)
|| ((Mask & FILE_ALL_ACCESS) == FILE_ALL_ACCESS))
{
cout << "Полный доступ\n";
return;
}
if (Mask & FILE_EXECUTE)
cout << "Обзор папок \\ выполнение файлов "<< endl;
if (Mask & FILE_READ_DATA)
cout << "Содержание папки \\ чтение данных " << endl;
if (Mask & FILE_READ_ATTRIBUTES)
cout << "Чтение атрибутов "<< endl;
if (Mask & FILE_READ_EA)
cout << "Чтение дополнительных атрибутов "<< endl;
if (Mask & FILE_WRITE_DATA)
cout << "Создание файлов \\ запись данных "<< endl;
if (Mask & FILE_APPEND_DATA)
cout << "Создание папок \\ дозапись данных "<< endl;
if (Mask & FILE_WRITE_ATTRIBUTES)
cout << "Запись атрибутов "<< endl;
if (Mask & FILE_WRITE_EA)
cout << "Запись дополнительных атрибутов "<< endl;
if (Mask & FILE_DELETE_CHILD)
cout << "Удаление подпапок и файлов "<< endl;
if (Mask & DELETE)
cout << "Удаление"<< endl;
if (Mask & SYNCHRONIZE)
cout << "sync "<< endl;
}
Пример запуска программы:
>acl.exe "C:\TestRoot\TestDir\TestFile.txt" testuser
SID: 00155928
Effective Allowed Access Mask : 1101FF
Обзор папок выполнение файлов
Содержание папки чтение данных
Чтение атрибутов
Чтение дополнительных атрибутов
Создание файлов запись данных
Создание папок дозапись данных
Запись атрибутов
Запись дополнительных атрибутов
Удаление подпапок и файлов
Удаление
sync