Проверка результирующих прав на директории \ файлы (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 -> ConvertNameToBinarySid
msdn -> 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