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

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

Программа 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;

} 

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

5.2.4 Инициализация

Из книги C++ автора Хилл Мюррей

5.2.4 Инициализация Использование для обеспечения инициализации объекта класса функций вроде set_date() (установить дату) неэлегантно и чревато ошибками. Поскольку нигде не утверждается, что обект должен быть инициализирован, то программист может забыть это сделать, или (что


7. Унификация атрибутов

Из книги Справочное руководство по C++ автора Страустрап Бьярн

7. Унификация атрибутов Если при миграции первичных ключей некоего родительского класса сущностей в один и тот же дочерний класс попадают совпадающие по смыслу атрибуты из разных родительских классов, то эти атрибуты необходимо «слить», т. е. необходимо провести так


R.12.6 Инициализация

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

R.12.6 Инициализация Объект класса без конструкторов, без частных или защищенных членов, без виртуальных функций и без базовых классов можно инициализировать с помощью списка инициализаторов (§R.8.4.1). Объект класса с конструктором должен инициализироваться или иметь


Потребители атрибутов

Из книги Основы объектно-ориентированного программирования автора Мейер Бертран

Потребители атрибутов Как вы можете догадаться, в комплекте с .NET Framework 2.0 SDK поставляется множество утилит, предназначенных для работы с различными атрибутами. Даже компилятор C# (csc.exe) запрограммирован на проверку определенных атрибутов в процессе компиляции. Например,


Роль атрибутов CIL

Из книги Системное программирование в среде Windows автора Харт Джонсон М

Роль атрибутов CIL Во многих случаях директивы CIL сами по себе оказываются недостаточно информативными, чтобы дать исчерпывающее определение соответствующего типа .NET или его члена. Поэтому многие директивы CIL сопровождаются различными атрибутами CIL, сообщающими о том,


Экспорт атрибутов

Из книги TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security) автора Фейт Сидни М

Экспорт атрибутов В завершение предшествующей дискуссии необходимо обсудить вопрос об экспорте атрибутов. Рассмотренный в этой лекции класс POINT имеет атрибуты x и y и экспортирует их клиентам, также как и функции rho и theta. Для получения значения атрибута некоторого


8.9.1 Инициализация RIP

Из книги Визуальное моделирование электронных схем в PSPICE автора Хайнеманн Роберт

8.9.1 Инициализация RIP При запуске каждый маршрутизатор должен знать только о сети, к которой он подключен. Маршрутизатор RIP отправляет эти сведения широковещательной рассылкой на все соседние с ним в локальной сети маршрутизаторы. Кроме того, эти же сведения посылаются


Инициализация

Из книги XSLT автора Хольцнер Стивен

Инициализация На этапе инициализации в зависимости от входных параметров устанавливаются переменные состояния, необходимые для валидации пути сертификации [70]. В переменных состояния сохраняются различные ограничения, учитываемые при валидации пути. Переменные


1.3. Установка атрибутов

Из книги Технология XSLT автора Валиков Алексей Николаевич

1.3. Установка атрибутов Для того чтобы ваша схема последовательной цепи точно соответствовала образцу на рис. 1.5, нужно дать сопротивлениям и источнику напряжения необходимые имена и указать их характеристики. При работе с редактором SCHEMATICS имена, значения и другие


Выбор атрибутов

Из книги Язык программирования Си для персонального компьютера автора Бочков C. О.

Выбор атрибутов Как было показано в главе 3, «Создание и применение шаблонов», можно выбирать атрибуты, если предварять их имена префиксом @. Вы уже работали с атрибутом UNITS, который поддерживают большинство детей элементов <PLANET>:<PLANET> <NAME>Earth</NAME> <MASS UNITS="(Earth =


Узлы атрибутов

Из книги QNX/UNIX [Анатомия параллелизма] автора Цилюрик Олег Иванович

Узлы атрибутов Атрибутам того или иного элемента соответствуют узлы атрибутов. Считается, что узел элемента является родителем узла своего атрибута, но вместе с тем узел атрибута не является дочерним узлом узла его элемента. Такая ситуация несколько отличает дерево


Инициализация

Из книги HTML, XHTML и CSS на 100% автора Квинт Игорь

Инициализация Переменной в объявлении может быть присвоено начальное значение посредством инициализатора. Записи инициализатора в объявлении предшествует знак равенства=<инициализатор>Можно инициализировать переменные любого типа. Функции не инициализируются.


Инициализация параметров

Из книги автора

Инициализация параметров int pthread_mutexattr_init(const pthread_mutexattr_t* attr);Функция инициализирует структуру атрибутов мьютекса, на которую указывает параметр attr. Тип данных pthread_mutexattr_t определен в файле <pthread.h> (производный от типа sync_attr_t, который в свою очередь определен в файле


Селекторы атрибутов

Из книги автора

Селекторы атрибутов CSS позволяет создавать правила, сопоставляемые элементам с атрибутами, определенными в исходном коде HTML-документа. Селекторы атрибутов могут сопоставляться в следующих четырех случаях.• [att] – если для элемента установлен атрибут att независимо от