Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Листинги / Листинги / 44-05-GetAclInformation

.cpp
Скачиваний:
5
Добавлен:
24.03.2016
Размер:
3.37 Кб
Скачать
#include <windows.h>
#include <stdio.h>

int main()
{
  char chDirName[248];   // имя файла
  
  PSECURITY_DESCRIPTOR lpSd = NULL;  // указатель на SD
  
  PACL lpDacl = NULL;    // указатель на список управления доступом
  BOOL bDaclPresent;     // признак присутствия списка DACL     
  BOOL bDaclDefaulted;   // признак списка DACL по умолчанию
  
  ACL_REVISION_INFORMATION ari;  // версия списка DACL
  ACL_SIZE_INFORMATION asi;      // размер списка DACL

  DWORD dwLength;      // длина дескриптора безопасности

  DWORD dwRetCode;     // код возврата
  
  // вводим имя файла
  printf("Input a directory or file name: ");
  gets(chDirName);
  
  // получаем длину дескриптора безопасности
  if (!GetFileSecurity(
    chDirName,         // имя файла
    DACL_SECURITY_INFORMATION,   // получаем DACL
    lpSd,              // адрес дескриптора безопасности
    0,                 // определяем длину буфера
    &dwLength))        // адрес для требуемой длины
  {
    dwRetCode = GetLastError();
    
    if (dwRetCode == ERROR_INSUFFICIENT_BUFFER)
      // распределяем память для буфера
      lpSd = (SECURITY_DESCRIPTOR*) new char[dwLength];
    else
    {
      // выходим из программы
      printf("Get file security failed.\n");
      printf("Error code: %d\n", dwRetCode);
      
      return dwRetCode;
    }
  }
  
  // распределяем память для дескриптора безопасности
  lpSd = (PSECURITY_DESCRIPTOR) new char[dwLength];
  
  // читаем дескриптор безопасности
  if (!GetFileSecurity(
    chDirName,         // имя файла
    DACL_SECURITY_INFORMATION,   // получаем DACL
    lpSd,              // адрес дескриптора безопасности
    dwLength,          // длину буфера
    &dwLength))        // адрес для требуемой длины
  {
    dwRetCode = GetLastError();
    printf("Get file security failed.\n");
    printf("Error code: %d\n", dwRetCode);
    
    return dwRetCode;
  }
  
  // получаем список DACL из дескриптора безопасности
  if (!GetSecurityDescriptorDacl(
    lpSd,              // адрес дескриптора безопасности
    &bDaclPresent,     // признак присутствия списка DACL
    &lpDacl,           // адрес указателя на DACL
    &bDaclDefaulted))  // признак списка DACL по умолчанию
  {
    dwRetCode = GetLastError();
    printf("Get security descriptor DACL failed.\n");
    printf("Error code: %d\n", dwRetCode);
    
    return dwRetCode;
  }
  
  // проверяем, есть ли DACL
  if (!bDaclPresent)
  {
    printf("Dacl is not present.");

    return 0;
  }
  
  // получаем версию списка DACL
  GetAclInformation(
    lpDacl,        // адрес DACL
    &ari,          // адрес буфера
    sizeof(ari),   // размер буфера
    AclRevisionInformation);   // информация о версии

  // печатаем версию списка DACL
  printf("Acl Revision Information: %u\n", ari.AclRevision);

  // получаем размеры списка DACL
  GetAclInformation(
    lpDacl,        // адрес DACL
    &asi,          // адрес буфера
    sizeof(asi),   // размер буфера
    AclSizeInformation);   // информация о размерах DACL

  // печатаем информацию о размерах списка DACL
  printf("Ace Count: %u\n", asi.AceCount);
  printf("AclBytesInUse: %u\n", asi.AclBytesInUse);
  printf("Acl Bytes Free: %u\n", asi.AclBytesFree);

  // освобождаем память
  delete[] lpSd;
  
  return 0;
}
Соседние файлы в папке Листинги