Книга: Системное программирование в среде Windows

Пример: инициализация атрибутов защиты

Программа 15.3 представляет вспомогательную функцию InitializeUnixSA. Эта функция создает структуру атрибутов безопасности, которая содержит ACL с элементами АСЕ, эмулирующими разрешения на доступ к файлам в UNIX. Существует девять АСЕ, предоставляющих или запрещающих доступ по чтению, записи или запуску файлов на выполнение владельцу (owner), группе (group) и прочим пользователям (everyone). Эта структура не является локальной переменной функции и должна распределяться и инициализироваться, а затем возвращаться вызывающей программе; обратите внимание на массив AceMasks в программе 15.1.

Программа 15.3. InitUnFp: инициализация атрибутов защиты 

/* Задание режима доступа в стиле UNIX посредством элементов АСЕ, хранящихся в структуре SECURITY_ATTRIBUTES. */
#include "EvryThng.h"
#define ACL_SIZE 1024
#define INIT_EXCEPTION 0x3
#define CHANGE_EXCEPTION 0x4
#define SID_SIZE LUSIZE
#define DOM_SIZE LUSIZE
LPSECURITY_ATTRIBUTES InitializeUnixSA(DWORD UnixPerms, LPCTSTR UsrNam, LPCTSTR GrpNam, LPDWORD AceMasks, LPHANDLE pHeap) {
 HANDLE SAHeap = HeapCreate(HEAP_GENERATE_EXCEPTIONS, 0, 0);
 LPSECURITY_ATTRIBUTES pSA = NULL;
 PSECURITY_DESCRIPTOR pSD = NULL;
 PACL pAcl = NULL;
 BOOL Success;
 DWORD iBit, iSid, UsrCnt = ACCT_NAME_SIZE;
 /* Таблицы имен пользователя (User), группы (Group) и прочих пользователей (Everyone), идентификаторов SID и так далее для LookupAccountName и создания SID. */
 LPCTSTR pGrpNms[3] = {EMPTY, EMPTY, _T("Everyone")};
 PSID pSidTable[3] = {NULL, NULL, NULL};
 SID_NAME_USE sNamUse[3] = {SidTypeUser, SidTypeGroup, SidTypeWellKnownGroup};
 TCHAR RefDomain[3][DOM_SIZE];
 DWORD RefDomCnt[3] = {DOM_SIZE, DOM_SIZE, DOM_SIZE};
 DWORD SidCnt[3] = {SID_SIZE, SID_SIZE, SID_SIZE};
 __try { /* Блок try-except для исключений при распределении памяти. */
  *рНеар = SAHeap;
  pSA = HeapAlloc(SAHeap, 0, sizeof (SECURITY_ATTRIBUTES));
  pSA->nLength = sizeof(SECURITY_ATTRIBUTES);
  pSA->bInheritHandle = FALSE;
  /* Программист может выполнить эти установки позже. */
  pSD = HeapAlloc(SAHeap, 0, sizeof(SECURITY_DESCRIPTOR));
  pSA->lpSecurityDescriptor = pSD;
  InitializeSecurityDescriptor(pSD, SECURITY DESCRIPTOR REVISION); 
  /* Получить SID пользователя, группы и прочих пользователей.
   * Другие важные подробности можно найти на Web-сайте. */
  pGrpNms[0] = UsrNam;
  pGrpNms[1] = GrpNam;
  for (iSid = 0; iSid < 3; iSid++) {
   pSidTable[iSid] = HeapAlloc(SAHeap, 0, SID_SIZE);
   LookupAccountName(NULL, pGrpNms[iSid], pSidTable[iSid], &SidCnt[iSid], RefDomain[iSid], &RefDomCnt[iSid], &sNamUse[iSid]);
  }
  SetSecurityDescriptorOwner(pSD, pSidTable[0], FALSE);
  SetSecurityDescriptorGroup(pSD, pSidTable[1], FALSE);
  pAcl = HeapAlloc(ProcHeap, HEAP_GENERATE_EXCEPTIONS, ACL_SIZE);
  InitializeAcl(pAcl, ACL_SIZE, ACL_REVISION);
  /* Добавить все элементы АСЕ, разрешающие и запрещающие доступ. */
  for (iBit = 0; iBit < 9; iBit++) {
   if ((UnixPerms >> (8 – iBit) & 0x1) != 0 && AceMasks[iBit%3] != 0) AddAccessAllowedAce(pAcl, ACL_REVISION, AceMasks [iBit%3], pSidTable [iBit/3]);
   else if (AceMasks[iBit%3] != 0) AddAccessDeniedAce(pAcl, ACL_REVISION, AceMasks [iBit%3], pSidTable [iBit/3]);
  }
  /* Добавить запрет доступа для всех АСЕ категории "Прочие". */
  Success = Success && AddAccessDeniedAce(pAcl, ACL_REVISION, STANDARD_RIGHTS_ALL | SPECIFIC_RIGHTS_ALL, pSidTable[2]);
  /* Связать ACL с атрибутом защиты. */
  SetSecurityDescriptorDacl(pSD, TRUE, pAcl, FALSE);
  return pSA;
 } /* Конец блока try-except. */
 __except(EXCEPTION_EXECUTE_HANDLER) { /* Освободить все ресурсы. */
  if (SAHeap != NULL) HeapDestroy(SAHeap);
  pSA = NULL;
 }
 return pSA;
}
 

Оглавление книги

Оглавление статьи/книги

Генерация: 1.238. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз