Проверка результирующих прав на директории \ файлы (Windows)

Выводить русский язык (кодировка 1251) в консоли. Необходимо выбрать шрифт lucida console.

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