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

Листинги / Листинги / 40-09-SetSecurityDescriptorControl

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

#ifndef PROTECTED_DACL_SECURITY_INFORMATION
#define PROTECTED_DACL_SECURITY_INFORMATION  0x80000000L
#endif

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

int main()
{
  char chFileName[256];    // имя файла
  HANDLE hFile;            // дескриптор файла

  PSECURITY_DESCRIPTOR pSecurityDescriptor;  // указатель на SD
  PACL pDacl;          // указатель на DACL

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

  // вводим полное имя файла, например: C:\\test.txt
  printf("Input a full path to your file: ");
  gets(chFileName);

  // открываем файл
  hFile = CreateFile(
    chFileName,      // имя файла
    READ_CONTROL | WRITE_DAC,  // доступ к дескриптору безопасности
    0,               // не разделяем доступ
    NULL,            // не наследуемый дескриптор
    OPEN_EXISTING,   // открываем существующий файл
    FILE_ATTRIBUTE_NORMAL,   // обычный файл
    NULL);           // шаблона нет
  if(hFile == INVALID_HANDLE_VALUE)
  {
    dwRetCode = GetLastError();
    printf("Create file failed.\n");
    printf("Error code: %u\n", dwRetCode);

    return dwRetCode;
  }

  // получаем дескриптор безопасности файла
  dwRetCode = GetSecurityInfo(
    hFile,           // дескриптор файла
    SE_FILE_OBJECT,  // объект файл
    DACL_SECURITY_INFORMATION,   // тип информации
    NULL,            // указатель на SID владельца не нужен
    NULL,            // указатель на первичную группу не нужен
    &pDacl,          // указатель на DACL
    NULL,            // указатель на SACL не нужен
    &pSecurityDescriptor);   // адрес указателя на SD
  if (dwRetCode != ERROR_SUCCESS)
  {
    printf("Get named security info failed.\n");
    printf("Error code: %u\n", dwRetCode);

    return dwRetCode;
  }

  // сбрасываем флаг автоматического наследования DACL
  if(!SetSecurityDescriptorControl(
    pSecurityDescriptor,
    SE_DACL_PROTECTED,
    0))
  {
    dwRetCode = GetLastError();
    printf("Set security descriptor control failed.");
    printf("Error code: %u\n", dwRetCode);

    return dwRetCode;
  }

  // устанавливаем новые свойства DACL
  dwRetCode = SetSecurityInfo(
    hFile,         // дескриптор файла
    SE_FILE_OBJECT,    // объект файл
    DACL_SECURITY_INFORMATION | 
    PROTECTED_DACL_SECURITY_INFORMATION,   // изменяем информацию о DACL
    NULL,          // владельца не изменяем
    NULL,          // первичную группу не изменяем
    pDacl,         // DACL изменяем
    NULL);         // SACL не изменяем
  if (dwRetCode != ERROR_SUCCESS)
  {
    printf("Set named security info failed.\n");
    printf("Error code: %u\n", dwRetCode);

    return dwRetCode;
  }

  // освобождаем память для дескриптора
  LocalFree(pSecurityDescriptor);

  printf("The flag SE_DACL_PROTECTED is reset.\n");

  // закрываем файл
  CloseHandle(hFile);

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