Вход/Регистрация
Системное программирование в среде Windows
вернуться

Харт Джонсон М.

Шрифт:
empty-line/>

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;

}
 

Комментарии к программе 15.3

Хотя структура программы 15.3 и может показаться несложной, выполняемую ею операцию вряд ли можно назвать простой. Кроме того, программа иллюстрирует целый ряд моментов, заслуживающих внимания, которые касаются использования средств безопасности Windows.

• Необходимо распределить в памяти несколько областей, предназначенных для хранения нужной информации, например, идентификаторов SID. Эти области создаются в специально выделенной для этих целей куче, которая по завершении работы должна быть уничтожена вызывающей программой.

• В данном примере структура атрибутов безопасности относится к файлам, но она также может использоваться с другими объектами, например именованными каналами (глава 11). В программе 15.4 показано, как встроить такую структуру при работе с файлами.

  • Читать дальше
  • 1
  • ...
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: