Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
пасоиб.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
325.28 Кб
Скачать

Программная реализация методов защиты в Windows Избирательное управление доступом

Б езопасность объекта определяется следующей схемой

SID – Security Identifier (идентификатор безопасности) – это структура данных в двоичном формате переменной длины, использующаяся, для однозначной идентификации пользователя, группы или компьютера. Структура SID используется Windows в следующих элементах безопасности:

  • дескриптор безопасности (SD) – для идентификации владельца объекта и его первичной группы;

  • запись управления доступом (АСЕ) – для идентификации субъектов, которым разрешён или запрещён доступ к объекту;

  • маркер доступа – для идентификации пользователя и групп, к которым он принадлежит.

Во время аутентификации для пользователя создаётся маркер доступа (маркер безопасности), который хранит информацию о коде SID пользователя и обо всех кодах SID групп, к которым он принадлежит.

Структуру SID можно проиллюстрировать следующим рисунком

Число доп. принадлежности

Резерв

Версия

Главная принадлежность

Основная

Доп. принадлежность [1]

}Относительные права (RID)

.

.

.

Доп. принадлежность [n]

Когда пользователь пытается получить доступ к ресурсу, все коды SID, указанные в его маркере сравниваются с записями DACL этого ресурса. Если требуемое разрешение соответствует одной из записей ACE, доступ предоставляется. Особенностью проверки является то, что сначала проверяется наличие явного отказа в доступе, а затем проверка наличия разрешения на доступ.

Определены, так называемые, общеизвестные (Well-Known) SID. Они описывают предопределённые группы и пользователей. Например, общеизвестные SID идентифицируют следующее группы и пользователей:

  • Everyone или World – группа, которая включает всех пользователей.

  • CREATOR_OWNER – создатель объекта.

  • Administrators – группа администраторов.

  • Network – группа сетевых пользователей.

Win32 API Определяет набор констант для установки принадлежности общеизвестных SID.

1. Структура SECURITY_ATTRIBUTES содержит дескриптор безопасности для объекта и определяет возможность наследования хендла родителя.

typedef struct _SECURITY_ATTRIBUTES {

DWORD nLength; // Определяет размер структуры в байтах

LPVOID lpSecurityDescriptor; // Указатель на дескриптор безопасности объекта. Если NULL, то

объекту назначается по умолчанию дескриптор безопасности вызвавшего процесса.

BOOL binheritHadle; // Определяет наследование при создании процесса. Если значение

- TRUE, новый процесс наследует хендл родителя.

} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES;

2. Структура SECURITY_DESCRIPTOR содержит информацию о доступе, связанную с объектом. Приложения используют эту структуру, чтобы устанавливать и запрашивать ста­тус безопасности объекта.

typedef struct _SECURITY_DESCRIPTOR {

BYTE Revision; // Значение версии структуры SD. Всем SD созданным в NT и

2000 – присвоен уровень исправленного издания 1.

BYTE Sbz1; //Определяет байт заполнения, для выравнивания на границу слова.

SECURITY_DESCRIPTOR_CONTROL Control; // набор битовых флагов, которые

квалифицируют значение дескриптора безопасности и его компонентов.

PSID Owner; //Указатели на SID - уникальное значение, которое описывает

PSID Group; // пользователя и группу. SID создаётся при регистрации пользователя в

его маркере доступа и позволяет идентифицировать его, и выделять ему

соответствующие права.

PACL Sacl; // Указатели на списки

PACL Dacl; // доступа

} SECURITY_DESCRIPTOR;

typedef PVOID PSECURITY_DESCRIPTOR;

3. Структура SID (идентификатор безопасности) – это структура для однозначной принадлежности субъекта доступа (пользователя, группы или компьютера).

typedef struct _SID {

BYTE Revision; // Версия, для Windows NT/2000 – всегда 1

BYTE SubAuthorityCount; // Число дополнительных принадлежностей

SID_IDENTIFIER_AUTHORITY IdentifierAuthority; //главная принадлежность субъекта

DWORD SubAuthority[ANYSIZE_ARRAY]; //Дополнительные принадлежности

} SID;

typedef PVOID PSID;

4. Структура SID_IDENTIFIER_AUTHORITY представляет главную принадлежность субъекта.

typedef struct _SID_IDENTIFIER_AUTHORITY {

BYTE Value[6];

} SID_IDENTIFIER_AUTHORITY, *PSID_IDENTIFIER_AUTHORITY;

Массив из шести байт, определяющий основную принадлежность.

Значение этой структуры определяет принадлежность SID. Для назначения принадлежностей общеизвестным субъектам – пользователям или группам определены следующие константы:

Идентификатор

Значение

Описание

SECURITY_NULL_SID_AUTHORITY

0,0,0,0,0,0

Группа, не имеющая пользователей. Ис­по­ль­зуется в случаях, когда SID не из­вестен.

SECURITY_WORLD_SID_AUTHORITY

0,0,0,0,0,1

Группа, включающая всех пользователей

SECURITY_LOCAL_SID_AUTHORITY

0,0,0,0,0,2

Пользователи, вошедшие в систему на данной физической КС.

SECURITY_CREATOR_SID_AUTHORITY

0,0,0,0,0,3

Создатель объекта

SECURITY_NT_AUTHORITY

0,0,0,0,0,5

WinNT/2000 используется для создания общеизвестных SID

Первые четыре константы определяют универсальные константы общеизвестных SID, а пятая – для создания общеизвестных SID, комбинируя его с дополнительными принадлежностями.

SID должен содержать значение основной принадлежности и, по крайней мере, значение одной дополнительной принадлежности Relative Identifier (RID), которые бы вместе однозначно определяли субъекта доступа.

Для построения набора принадлежностей, заданных в SID часто используется их строковое представление вместо бинарного. Чтобы посмотреть SID в строковом представлении, можно использовать функцию ConvertSidToStringSid function to convert a binary SID to string format. Для обратного преобразования используется функция ConvertStringSidToSid.

Эти функции используют специальную нотацию для записи SID:

S-R-I-S-S...

Здесь S обозначает, что представлен SID, R– версия, I – значение основного полномочия, S... – одно или более дополнительных полномочий. Например, строковые значения для приведённой выше таблицы:

S-1-0-0 S-1-1-0 S-1-2-0 S-1-3-0 S-1-5-0

Строковое представление SID S-1–5-32-544 можно расшифровать как

версия 1;

основная принадлежность SECURITY_NT_AUTHORITY (5);

Первая дополнительная принадлежность SECURITY_BUILTIN_DOMAIN_RID (32);

Вторая дополнительная принадлежность DOMAIN_ALIAS_RID_ADMINS (544).

Все константы общеизвестных принадлежностей определены в "winnt.h".

Вот некоторые константы для RID, используемые с общеизвестными принадлежностями

SECURITY_NETWORK_RID (S-1–5–2)

Пользователи, вошедшие в систему по сети. Это групповой идентификатор. Используется с основной системной принадлежностью SECURITY_NT­_AU­THORITY .

SECURITY_WORLD_RID

(S-1-1[-0])

RID, для группы, включающей всех пользователей. Применяется совместно с SECURI­TY­_­WOR­LD_­SID­_­AUTHORITY, так как SID должен содержать хотя бы одну RID.

SECURITY_BUILTIN_DOMAIN_RID

(S-1–5–32)

Встроенный системный домен.

DOMAIN_ALIAS_RID_ADMINS (544)

Локальная группа для администрирования домена.

3. Структура EXPLICIT_ACCESS определяет возможности доступа к управляющей информации для указанного лица. Функции управления доступом используют эту структуру, чтобы иметь доступ к записи ACE списка ACL.

typedef struct _EXPLICIT_ACCESS {

DWORD grfAccessPermission; // Набор битовых флагов, использует формат

ACCESS_MASK, чтобы определить права

доступа, которые разрешаются или запрещаются АСЕ для данного лица.

ACCESS_MODE grfAccessMode; // Определяет права доступа, указанные в списке

ACCESS_MODE. Независимо от значения записей в ACL позволяет или запрещает методы доступа.

DWORD grfInheritance; // Набор битовых флагов сигнализирует, что другие объекты

могут наследовать ACL от первичного объекта.

TRUSTEE Trustee; // идентифицирует пользователя, группу или программу, к которой

относится ACE.

} EXPLICIT_ACCESS, *PEXPLICIT_ACCESS;

Определены 7 флагов наследования grfInheritance. Вот некоторые из них:

CONTAINER_INHERIT_ACE

Другие контейнеры (папки), содержащие первичный объект наследуют АСЕ.

INHERIT_ONLY_ACE

ACE не поддерживается первичным объектом в котором ACL подключён, но объекты, включенные в первичный объект наследуют ACE.

OBJECT_INHERIT_ACE

Объекты, содержащиеся в первичном объекте наследуют АСЕ.

4. Структура TRUSTEE идентифицирует пользователя, группу, или сеанс к которым относится ACE. Структура может использовать имя или идентификатор безопасности (SID), чтобы идентифицировать доверенное лицо.

typedef struct _TRUSTEE {

PTRUSTEE pMultipleTrustee; // не поддерживается

MULTIPLE_TRUSTEE_OPERATION MultipleTrusteeOperation; //не поддерживается

TRUSTEE_FORM TrusteeForm; // указывает тип данных имени доверенного лица

TRUSTEE_TYPE TrusteeType; // указывает тип доверенного лица

LPTSTR ptstrName; // буфер, содержащий имя доверенного лица

} TRUSTEE, *PTRUSTEE;

TRUSTEE FORM

Значение

TRUSTEE_IS_SID

ptstrName указывает на SID.

TRUSTEE_IS_NAME

The ptstrName указывает на строку с именем доверенного лица.

TRUSTEE TYPE

Значение

TRUSTEE_IS_USER

Доверенное лицо – пользователь.

TRUSTEE_IS_GROUP

Доверенное лицо – группа.

TRUSTEE_IS_DOMAIN

Доверенное лицо – домен.

TRUSTEE_IS_COMPUTER

Доверенное лицо – компьютер.

TRUSTEE_IS_WELL_KNOWN_GROUP

Доверенное лицо – общеизвестная группа

Имя доверенного лица может быть следующего формата

Полное имя – "g:\remotedir\abc".

Имя домена – "redmond\xyz".

Одно из предопределённых имён "EVERYONE" or "GUEST".

Специальное имя:

Name

Meaning

"CREATOR GROUP"

Указывает SID CREATOR_GROUP. Этот SID используется в наследуемых АСЕ. При создании нового объекта система размещает этот SID как SID первичной группы пользователя, создавшего объект.

"CREATOR OWNER"

Указывает SID CREATOR_OWNER. Этот SID используется в наследуемых АСЕ. При создании нового объекта система размещает этот SID как SID пользователя, создавшего объект.

"CURRENT_USER"

Указывает владельца, вызвавшего нить или процесс.

Доверенный SID может быть каким-либо пользовательским или групповым. Он может быть универсальным, общеизвестным SID.

5. Тип перечисление ACCESS_MODE содержит флаги, которые указывают как права доступа в EXPLICIT_ACCESS применяются к пользователю.

typedef enum _ACCESS_MODE {

NOT_USED_ACCESS = 0,

GRANT_ACCESS, // флаг, который создает ACCESS_ALLOWED_ACE. Новый ACE объединяет

определенные им права с любыми уже существующими разрешёнными или запрещёнными правами.

SET_ACCESS, // Указывает ACCESS_ALLOWED_ACE, который разрешает указанные права. Флаг

отвергает любой уже существующий доступ к объекту.

DENY_ACCESS, // Указывает ACCESS_DENIED_ACE, который запрещает указанные права. Флаг

запрещает указанные права в дополнение к текущим запрещениям. Он модифицирует или удаляет существующие разрешающие АСЕ.

REVOKE_ACCESS, // Удаляет все существующие ACE для определенного пользователя

SET_AUDIT_SUCCESS, // Устанавливает АСЕ аудита для регистрации успешных попыток.

SET_AUDIT_FAILURE // Устанавливает АСЕ аудита для регистрации неудачных попыток.

} ACCESS_MODE;

????????????????????????????????????????????????????? Другие структуры

Для работы с ACL используются специальные функции

  1. GetExplicitEntriesFromAcl – извлекает массив структур EXPLICIT_ACCESS, которые описывают ACE. Она может быть полезна при копировании информации об ACE от одного ACL до другого.

  2. SetEntriesInAcl – создаёт по структурам EXPLICIT_ACCESS эквивалент ACE в новом ACL.

  3. AllocateAndInitializeSid – размещает и инициализирует идентификатор безопасности SID с одним основным и восемью дополнительными полномочиями.

  4. AllocateAndInitializeSid – размещает и инициализирует SID.

  5. SetEntriesInACLсоздает новый ACL или объединяет новый DACL или SACL c существующим ACL.

  6. SetSecurityDescriptorDacl – записывает информацию в DACL. Если DACL уже присутствует в SD, то он заменяется.

  7. SetSecurityDescriptorSacl – аналогична предыдущей для SACL.

  8. FreeSid – освобождает SID, выделенный функцией AllocateAndInitializeSid.

???????????????????????????Другие функции

Так как не все файловые системы поддерживают АСL необходимо определить возможности его использования.

#include <stdio.h>

#include <windows.h>

void main()

{

char *szVol =”c:\\”;

DWORD dwFlags=0;

GetVolumeInformation(

szVol, // корневой каталог тома

NULL, // буфер для приёма имени тома

0, // длина буфера имени

NULL, // серийный номер тома

NULL, // переменная, принимающая допустимую длину имени

&dwFlags, // переменная принимающая флаги, ассоциированные с данным томом, и, в частности, флаг FS_PERSISTENT_ACLS – поддержка АСL

NULL, // буфер для приёма имени файловой системы

0); // длина буфера имени файловой системы

if (dwFlags & FS_PERSISTENT_ACLS)

{printf(“том %s поддерживает АСL”, szVol)}

else {printf(“том %s не поддерживает АСL”, szVol);

}

Несмотря на все выгоды защиты объектов с помощью дискреционного метода, программисты ранних версий Windows NT старались избегать этой задачи. Она была сопряжена с созданием большого по объёму и поэтому подверженного ошибкам кода. Он требовал использование таких функций как malloc и AddAce. Эти функции, для совместимости, остались и в следующих версиях, но в их использовании уже нет необходимости. Начиная с версии Windows NT 4 были введены функции облегчающие создание и прикрепление ACL к объекту. В Windows 2000 и далее разработан специальный язык текстового представления ACL и дескриптора безопасности, что ещё больше облегчило создание дискреционного доступа. Следующий пример показывает создание дискреционного доступа к каталогу для Windows NT 4.

#include <stdio.h>

#include <windows.h>

#include <aclapi.h>

PSID pEveryoneSID = NULL, pAdminSID = NULL, pNetworkSID = NULL;

PACL pACL =NULL;

PSECURITY_DESCRIPTOR pSD = NULL;

/* ACL будет содержать три записи:

Network (Deny Access)

Everyone (Read)

Administrator (Full Control) */

void main()

{

const int NUM_ACES = 3; // число АСЕ

EXPLICIT_ACCESS ea[NUM_ACES];

ZeroMemory(&ea, NUM_ACES*sizeof(EXPLICIT_ACCESS));

//Создаём общеизвестный SID для группы сетевых пользователей

SID_IDENTIFIER_AUTHORITY SIDAuthNT = SECURITY_NT_AUTHORITY;

AllocateAndInitializeSid(

&SIDAuthNT, // главная принадлежность

1, // число дополнительных принадлежностей

SECURITY_NETWORK_RID, // дополнительная принадлежность

0, 0, 0, 0, 0, 0, 0, // остальные дополнительные принадлежности

&pNetworkSid);

// Заполняем структуру EXPLICIT_ACCESS

ea[0].grfAccessPermission = GENERIC_ALL;

ea[0].grfAccessMode = DENY_ACCESS;

ea[0].grfInheritance = NO_INHERITANCE;

ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID;

ea[0].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;

ea[0].Trustee.ptstrName= (LPTSTR) pNetworkSID;

//Создаём общеизвестный SID для группы Everyone

SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHO­RI­TY;

AllocateAndInitializeSid(

&SIDAuthWorld, // главная принадлежность

1, // число дополнительных принадлежностей

SECURITY_WORLD_RID, // дополнительная принадлежность

0, 0, 0, 0, 0, 0, 0, // остальные дополнительные принадлежности

& pEveryoneSID);

// Заполняем структуру EXPLICIT_ACCESS

ea[1].grfAccessPermission = GENERIC_READ;

ea[1].grfAccessMode = SET_ACCESS;

ea[1].grfInheritance = NO_INHERITANCE;

ea[1].Trustee.TrusteeForm = TRUSTEE_IS_SID;

ea[1].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;

ea[1].Trustee.ptstrName= (LPTSTR) pEveryoneSID;

//Создаём общеизвестный SID для встроенной группы BUILTIN\Administrators

AllocateAndInitializeSid(

&SIDAuthNT, // главная принадлежность

2, // число дополнительных принадлежностей

SECURITY_BUILTIN_DOMAIN_RID, // 1-е дополнительная принадлежность

DOMAIN _ALIAS_RID_ADMINS, // 2-е дополнительная принадлежность

0, 0, 0, 0, 0, 0, // остальные дополнительные принадлежности

& pAdminSID);

// Заполняем структуру EXPLICIT_ACCESS

ea[2].grfAccessPermission = GENERIC_ALL;

ea[2].grfAccessMode = SET_ACCESS;

ea[2].grfInheritance = NO_INHERITANCE;

ea[2].Trustee.TrusteeForm = TRUSTEE_IS_SID;

ea[2].Trustee.TrusteeType = TRUSTEE_IS_GROUP;

ea[2].Trustee.ptstrName= (LPTSTR) pAdminSID;

// Создаём новый АСL с тремя ACE записями

SetEntriesInACL(

NUM_ACES, // число записей

ea, // массив ACE

NULL, // указатель на существующий ACL, если NULL создаётся новый ACL

&pACL); // указатель на вновь созданный ACL

//Инициализируем дескриптор безопасности

pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(

LPTR, // комбинация флагов, обеспечивающая выделение фиксированной памяти, при

этом возвращаемая величина является указателем на выделенную память, которая обнуляется

SECURITY_DESCRIPTOR_MIN_LENGTH); //минимально необходимый размер

InitializeSecurityDescriptor(

pSD, // указатель на структуру дескриптора безопасности

SECURITY_DESCRIPTOR_REVISION); // версия, всегда указанная константа

// Добавляем ACL в дескриптор

SetSecurityDescriptorDacl(

pSD, // указатель на структуру дескриптора безопасности

TRUE, // Определяет флаг, указывающий наличие ACL в дескрипторе безопасности. Если этот параметр - TRUE, функция устанавливает флаг SE_DACL_PRESENT в структуре SECURITY_DESCRIPTOR_CONTROL и использует значение двух следующих параметров.

pACL, // указатель на структуру ACL

FALSE); // Определяет флаг, показывающий источник ACL. Если этот флаг - TRUE, ACL извлекается некоторым механизмом по умолчанию. Если FALSE, ACL явно определен пользователем.

SECURITY_ATTRIBUTES sa;

sa.nLength = sizeof(SECURITY_ATTRIBUTES);

sa.bInheritHandle = FASLSE;

sa. LpSecurityDescriptor = pSD;

CreateDirectory("C:\\MyDOC\\Dogovors",&sa);

If (pSD) LocalFree(pSD); If (pACL) LocalFree(pACL);

If (pEveryoneSID) FreeSID(pEveryoneSID); If (pNetworkSID) FreeSID(pNetworkSID);

If (pAdminSID) FreeSID(pAdminSID);

}

В Windows 2000 используется специальное средство текстового представления ACL и дескрипторов, получившее название Security Descriptor Definition Language (SDDL) ­– язык описания дескрипторов безопасности. Использование такого средства значительно облегчает создание дескриптора безопасности для объекта. В SDDL SID и ACE представляются в виде строковых констант. Две специальные функции ConvertSecurity­Descriptor­To­String­Security­Descrip­tor и ConvertStringSecurityDescriptorToSecurityDescriptor используются для преобразования строкового формата в стандартное представление.

Строковый Формат указывает четыре основных компонента SD: владелца (O:), первичной группы (G:), DACL (D:), и SACL (S:). Рассмотрим подробнее два последних.

D:dacl_flags(string_ace1)(string_ace2)... (string_acen) – записи ACE DACL

S:sacl_flags(string_ace1)(string_ace2)... (string_acen) – записи ACE SACL

Флаги SACK и DACL могут канкатинировать из следующго набора

Флаг

Значение

"P"

Флаг запрещения наследования

"AR"

Запрос на наследование.

"AI"

Автоматическое наследование.

Поля одной строки string_ace

ace_type;ace_flags;rights;object_guid;inherit_object_guid;account_sid

ace_type

"A"

Разрешающая АСЕ

"D"

Запрещающая ACE

flags

"CI"

Включить наследование контей­не­ра­ми

"OI"

Включить наследование объектами

rights

Общие права доступа

"GA"

GENERIC_ALL

"GR"

GENERIC_READ

"GW"

GENERIC_WRITE

"GX"

GENERIC_EXECUTE

Стандартные права доступа

"RC"

READ_CONTROL

"SD"

DELETE

"WD"

WRITE_DAC

"WO"

WRITE_OWNER

"CR"

ADS_RIGHT_DS_CONTROL_ACCESS

Права доступа к фалам

"FA"

FILE_ALL_ACCESS

"FR"

FILE_GENERIC_READ

"FW"

FILE_GENERIC_WRITE

"FX"

FILE_GENERIC_EXECUTE

Registry key access rights

"KA"

KEY_ALL_ACCESS

"KR"

KEY_READ

"KW"

KEY_WRITE

"KX"

KEY_EXECUTE

object_guid

Строка, представляющая GUID, который идентифицирует тип объекта.

inherit_object_guid

Строка представляющая GUID, который идентифицирует тип наследования объекта.

account_sid

Строка SID, которая идентифицирует доверенность ACE. Некоторые значения строки SID в SDDL

"BA"

Встроенная группа Администраторы

"BG"

Встроенная группа Гости

"SY"

Локальная система

"WD"

Группа, включающая всех пользователей

"IU"

Группа интерактивных пользователей

При записи АСЕ некоторые поля, могут не содержать символов.

Например,

D:P(D;OICI;GA;;;BG)(A;OICI;GA;;;SY)(A;OICI;GA;;;BA)(A;OICI;GRGWGX;;;IU)

D:P

D – DACL, P – флаг запрещающий наследование от ро­ди­тель­ских контейнеров

(D;OICI;GA;;;BG)

D – запрещающая АСЕ.

OICI – включить наследования потомками, то есть эта АСЕ будет присоединяться к объектам (файлам) и контейнерам (каталогам), расположенным ниже в иерархии.

GA – Generic ALL Access – полный доступ.

BG – встроенная группа Guests.

Эта АСЕ закрывает всем гостям доступ к данному объекту и расположенным ниже в иерархии.

(A;OICI;GA;;;SY)

А – разрешающая АСЕ.

SY – учётная запись SYSTEM.

Эта АСЕ открывает полный доступ пользователю SYSTEM.

(A;OICI;GA;;;BA)

ВА – встроенная группа Administrators.

(A;OICI;GRGWGX;;;IU)

GR – чтение, GW – запись, GX ­– исполнение.

IU – группа INTERACTIVE.

Пример программы, использующей SDDL.

#include <windows.h>

#include <sddl.h>

void main()

{

SECURITY_ATRIBUTES sa;

sa.nLength = sizof(SECURITY_ATRIBUTES);

sa.bInheritHandle = FALSE;

char *szSD = "D:P" //DACL

"(D;OICI;GA;;;BG)" // Запретить доступ группе Guests

"(A;OICI;GA;;;SY)" // Разрешить полный доступ пользователю SYSTEM

"(A;OICI;GA;;;BA)" // Разрешить полный доступ группе Admins

"(A;OICI;GRGWGX;;;IU)" // Разрешить доступ на чтение, запись и исполнение

// группе Interactive

ConvertSecurity­Descriptor­To­String­Security­Descrip­tor(

szSD, // строка, содержащая список доступа

SDDL_REVISION_1, // версия

&(sa.lpSecurityDescriptor), // указатель на преобразованный дескриптор безопасности

NULL); // Указатель на переменную, возвращающую размер в байтах,

преобразованного дескриптора безопасности. Этот параметр может быть NULL

CreateDirectory("C:\\MyDIR", &sa);

LocalFree(sa.lpSecurityDescriptor);

}