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

Листинги / Листинги / 44-02-AddAccessDeniedAceEx

.cpp
Скачиваний:
4
Добавлен:
24.03.2016
Размер:
6.56 Кб
Скачать
#define _WIN32_WINNT 0x0500

#ifndef UNICODE
#define UNICODE
#endif

#include <windows.h>
#include <stdio.h>
#include <lm.h>

int main()
{
  ACL *lpDacl;           // указатель на список доступа
  DWORD dwDaclLength;    // длина списка доступа

  wchar_t wchUserName[UNLEN];    // имя пользователя
  wchar_t wchDirName[248];       // имя каталога

  DWORD dwLengthOfDomainName = 0;  // длина имени домена

  DWORD dwLengthOfSid = 0;   // длина SID
  SID *lpSid = NULL;         // указатель на SID
  LPTSTR lpDomainName = NULL;    // указатель на имя домена

  SID_NAME_USE typeOfSid;    // тип учетной записи

  SECURITY_DESCRIPTOR sd;    // дескриптор безопасности каталога
  SECURITY_ATTRIBUTES sa;    // атрибуты защиты каталога

  DWORD dwRetCode;           // код возврата

  // вводим имя пользователя, которому разрешим доступ к каталогу
  printf("Input a user name: ");
  _getws(wchUserName);

  // определяем длину SID пользователя
  if (!LookupAccountName(
    NULL,            // ищем имя на локальном компьютере
    wchUserName,     // имя пользователя
    NULL,            // определяем длину SID
    &dwLengthOfSid,  // длина SID
    NULL,            // определяем имя домена
    &dwLengthOfDomainName,   // длина имени домена
    &typeOfSid))     // тип учетной записи
  {
    dwRetCode = GetLastError();

    if (dwRetCode == ERROR_INSUFFICIENT_BUFFER)
    {
      // распределяем память для SID и имени домена
      lpSid = (SID*) new char[dwLengthOfSid];
      lpDomainName = (LPTSTR) new wchar_t[dwLengthOfDomainName];
    }
    else
    {
      // выходим из программы
      printf("Lookup account name failed.\n");
      printf("Error code: %d\n", dwRetCode);

      return dwRetCode;
    }
  }

  // определяем SID и имя домена пользователя
  if(!LookupAccountName(
    NULL,            // ищем имя на локальном компьютере
    wchUserName,     // имя пользователя
    lpSid,           // указатель на SID
    &dwLengthOfSid,  // длина SID
    lpDomainName,    // указатель на имя домена
    &dwLengthOfDomainName,   // длина имени домена
    &typeOfSid))     // тип учетной записи
  {
    dwRetCode = GetLastError();

    printf("Lookup account name failed.\n");
    printf("Error code: %d\n", dwRetCode);

    return dwRetCode;
  }

  // определем длину списка DACL
  dwDaclLength = sizeof(ACL)
    + sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD) + dwLengthOfSid
    + sizeof(ACCESS_DENIED_ACE) - sizeof(DWORD) + dwLengthOfSid;

  // распределяем память под DACL
  lpDacl = (ACL*)new char[dwDaclLength];

  // инициализируем список DACL
  if (!InitializeAcl(
    lpDacl,          // адрес DACL
    dwDaclLength,    // длина DACL
    ACL_REVISION))   // версия DACL
  {
    dwRetCode = GetLastError();

    printf("Lookup account name failed.\n");
    printf("Error code: %d\n", dwRetCode);

    return dwRetCode;
  }

  // добавляем запрещающий элемент в список DACL
  if (!AddAccessDeniedAceEx(
    lpDacl,          // адрес DACL
    ACL_REVISION,    // версия DACL
    CONTAINER_INHERIT_ACE,   // контейнерные объекты наследуют элемент
    WRITE_OWNER,     // запрещаем изменять владельца объекта
    lpSid))          // адрес SID
  {
    dwRetCode = GetLastError();
    perror("Add access denied ace failed.\n");
    printf("The last error code: %u\n", dwRetCode);

    return dwRetCode;
  }

  // добавляем разрешающий элемент в список DACL
  if (!AddAccessAllowedAceEx(
    lpDacl,          // адрес DACL
    ACL_REVISION,    // версия DACL
    CONTAINER_INHERIT_ACE,   // контейнерные объекты наследуют элемент
    GENERIC_ALL,     // разрешаем все родовые права доступа
    lpSid))          // адрес SID
  {
    dwRetCode = GetLastError();
    perror("Add access allowed ace failed.\n");
    printf("The last error code: %u\n", dwRetCode);

    return dwRetCode;
  }

  // инициализируем версию дескриптора безопасности
  if (!InitializeSecurityDescriptor(
    &sd,
    SECURITY_DESCRIPTOR_REVISION))
  {
    dwRetCode = GetLastError();
    printf("Initialize security descroptor failed.\n");
    printf("Error code: %d\n", dwRetCode);

    return dwRetCode;
  }

  // устанавливаем SID владельца объекта
  if (!SetSecurityDescriptorOwner(
    &sd,       // адрес дескриптора безопасности
    NULL,      // не задаем владельца
    SE_OWNER_DEFAULTED))   // определить владельца по умолчанию
  {
    dwRetCode = GetLastError();
    perror("Set security descriptor owner failed.\n");
    printf("The last error code: %u\n", dwRetCode);

    return dwRetCode;
  }

  // устанавливаем SID первичной группы владельца
  if (!SetSecurityDescriptorGroup(
    &sd,         // адрес дескриптора безопасности
    NULL,        // не задаем первичную группу
    SE_GROUP_DEFAULTED))   // определить первичную группу по умолчанию
  {
    dwRetCode = GetLastError();
    perror("Set security descriptor group failed.\n");
    printf("The last error code: %u\n", dwRetCode);

    return dwRetCode;
  }
  // устанавливаем DACL  в дескриптор безопасности
  if (!SetSecurityDescriptorDacl(
    &sd,       // адрес дескриптора безопасности
    TRUE,      // DACL присутствует
    lpDacl,    // указатель на DACL
    FALSE))    // DACL не задан по умолчанию
  {
    dwRetCode = GetLastError();
    perror("Set security descriptor group failed.\n");
    printf("The last error code: %u\n", dwRetCode);

    return dwRetCode;
  }

  // проверяем структуру дескриптора безопасности
  if (!IsValidSecurityDescriptor(&sd))
  {
    dwRetCode = GetLastError();
    perror("Security descriptor is invalid.\n");
    printf("The last error code: %u\n", dwRetCode);

    return dwRetCode;
  }

  // инициализируем атрибуты безопасности
  sa.nLength = sizeof(sa);     // устанавливаем длину атрибутов защиты
  sa.lpSecurityDescriptor = &sd;   // устанавливаем адрес SD
  sa.bInheritHandle = FALSE;   // дескриптор каталога не наследуемый
  
  // читаем имя создаваемого каталога
  printf("Input a new directory name: ");
  _getws(wchDirName);       // вводим имя каталога

  // создаем каталог
  if (!CreateDirectory(wchDirName, &sa))
  {
    dwRetCode = GetLastError();
    perror("Security descriptor is invalid.\n");
    printf("The last error code: %u\n", dwRetCode);

    return dwRetCode;
  }

  printf("The directory is created.\n");

  // освобождаем память
  delete[] lpSid;
  delete[] lpDomainName;
  delete[] lpDacl;

  return 0;
}
Соседние файлы в папке Листинги