Функция CreatePrivateObjectSecurityWithMultipleInheritance (securitybaseapi.h)

Функция CreatePrivateObjectSecurityWithMultipleInheritance выделяет и инициализирует самостоятельный дескриптор безопасности для нового частного объекта, созданного диспетчером ресурсов, вызывающим эту функцию. Эта функция поддерживает частные объекты (например, объекты службы каталогов с присоединенными вспомогательными классами), состоящие из нескольких типов объектов или классов.

Синтаксис

BOOL CreatePrivateObjectSecurityWithMultipleInheritance(
  [in, optional] PSECURITY_DESCRIPTOR ParentDescriptor,
  [in, optional] PSECURITY_DESCRIPTOR CreatorDescriptor,
  [out]          PSECURITY_DESCRIPTOR *NewDescriptor,
  [in, optional] GUID                 **ObjectTypes,
  [in]           ULONG                GuidCount,
  [in]           BOOL                 IsContainerObject,
  [in]           ULONG                AutoInheritFlags,
  [in, optional] HANDLE               Token,
  [in]           PGENERIC_MAPPING     GenericMapping
);

Параметры

[in, optional] ParentDescriptor

Указатель на дескриптор безопасности для родительского контейнера объекта . Если родительский контейнер отсутствует, этот параметр имеет значение NULL.

[in, optional] CreatorDescriptor

Указатель на дескриптор безопасности, предоставленный создателем объекта . Если создатель объекта не передает сведения о безопасности для нового объекта явным образом, этот параметр может иметь значение NULL. Кроме того, этот параметр может указывать на дескриптор безопасности по умолчанию.

[out] NewDescriptor

Указатель на переменную для получения указателя на только что выделенный самостоятельный дескриптор безопасности. Завершив использование дескриптора безопасности, освободите его, вызвав
Функция DestroyPrivateObjectSecurity .

[in, optional] ObjectTypes

Массив указателей на структуры GUID , которые идентифицируют типы объектов или классы объекта, связанного с NewDescriptor. Для объектов Active Directory этот массив содержит указатели на идентификаторы GUID класса структурного класса объекта и все присоединенные вспомогательные классы. Задайте для ObjectTypesзначение NULL , если у объекта нет GUID.

[in] GuidCount

Количество идентификаторов GUID, присутствующих в параметре ObjectTypes .

[in] IsContainerObject

Указывает, может ли новый объект содержать другие объекты. Значение TRUE указывает, что новый объект является контейнером. Значение FALSE указывает, что новый объект не является контейнером.

[in] AutoInheritFlags

Набор битовых флагов, управляющих тем, как записи управления доступом (ACE) наследуются от ParentDescriptor. Этот параметр может быть сочетанием следующих значений.

Значение Значение
SEF_DACL_AUTO_INHERIT
0x01
Новый список управления доступом на уровне пользователей (DACL) содержит ACE, унаследованные от DACL ParentDescriptor, а также все явные ACE, указанные в daCL CreatorDescriptor. Если этот флаг не задан, новый daCL не наследует ACE.
SEF_SACL_AUTO_INHERIT
0x02
Новый системный список управления доступом (SACL) содержит ACE, унаследованные от списка управления доступом parentDescriptor, а также любые явные ACE, указанные в списке управления доступом CreatorDescriptor. Если этот флаг не задан, новый saCL не наследует ACE.
SEF_DEFAULT_DESCRIPTOR_FOR_OBJECT
0x04
CreatorDescriptor — это дескриптор по умолчанию для типов объектов , заданных objectTypes. Таким образом, CreatorDescriptor игнорируется, если ParentDescriptor имеет какие-либо объекты ACE для типов объектов, указанных в параметре ObjectTypes . Если такие ACE не наследуются, CreatorDescriptor обрабатывается так, как если бы этот флаг не был указан.
SEF_AVOID_PRIVILEGE_CHECK
0x08
Функция не выполняет проверку привилегий. Если флаг SEF_AVOID_OWNER_CHECK также установлен, параметр Token может иметь значение NULL. Этот флаг полезен при реализации автоматического наследования, чтобы избежать проверки привилегий для каждого обновляемого дочернего элемента.
SEF_AVOID_OWNER_CHECK
0x10
Функция не проверка допустимость владельца в результирующем NewDescriptor, как описано в разделе Примечания. Если также установлен флаг SEF_AVOID_PRIVILEGE_CHECK, параметр Token может иметь значение NULL.
SEF_DEFAULT_OWNER_FROM_PARENT
0x20
По умолчанию владельцем NewDescriptor является владелец из ParentDescriptor. Если значение не задано, владелец NewDescriptor по умолчанию будет владельцем маркера, указанного параметром Token . Владелец маркера указывается в самом маркере. В любом случае, если параметр CreatorDescriptor не равен NULL, для владельца NewDescriptor устанавливается владелец из CreatorDescriptor.
SEF_DEFAULT_GROUP_FROM_PARENT
0x40
Группа NewDescriptor по умолчанию является группой из ParentDescriptor. Если значение не задано, группа NewDescriptor по умолчанию соответствует группе маркера, указанной параметром Token . Группа маркера указывается в самом маркере. В любом случае, если параметр CreatorDescriptor не равен NULL, группе NewDescriptor присваивается группа из CreatorDescriptor.
SEF_MACL_NO_WRITE_UP
0x100
Субъект с обязательным уровнем ниже, чем у объекта , не может выполнять запись в объект .
SEF_MACL_NO_READ_UP
0x200
Субъект с обязательным уровнем ниже, чем у объекта , не может считать объект.
SEF_MACL_NO_EXECUTE_UP
0x400
Субъект с обязательным уровнем ниже, чем у объекта , не может выполнить объект .
SEF_AVOID_OWNER_RESTRICTION
0x1000
Все ограничения, заданные параметром ParentDescriptor , которые ограничивают возможность вызывающей стороны указывать DACL в CreatorDescriptor , игнорируются.

[in, optional] Token

Дескриптор маркера доступа для клиентского процесса , от имени которого создается объект . Если это токен олицетворения, он должен быть на уровне SecurityIdentification или выше. Полное описание уровня олицетворения SecurityIdentification см. в SECURITY_IMPERSONATION_LEVEL перечислимом типе.

Маркер клиента содержит сведения о безопасности по умолчанию, такие как владелец по умолчанию, основная группа и DACL. Эта функция использует эти значения по умолчанию, если информация отсутствует во входных дескрипторах безопасности. Маркер должен быть открыт для TOKEN_QUERY доступа.

Если выполняются все указанные ниже условия, для доступа к TOKEN_DUPLICATE в дополнение к TOKEN_QUERY доступу необходимо открыть дескриптор.

  • Дескриптор маркера относится к основному маркеру.
  • Дескриптор безопасности маркера содержит один или несколько ACE с идентификатором безопасности OwnerRights .
  • Дескриптор безопасности указывается для параметра CreatorDescriptor .
  • Вызывающий объект этой функции не устанавливает флаг SEF_AVOID_OWNER_RESTRICTION в параметре AutoInheritFlags .

[in] GenericMapping

Указатель на структуру GENERIC_MAPPING , задающую сопоставление каждого универсального права с определенными правами для объекта.

Возвращаемое значение

Если функция выполняется успешно, функция возвращает ненулевое значение.

Если функция завершается сбоем, она возвращает ноль. Вызовите Метод GetLastError для получения расширенных сведений об ошибке. Некоторые расширенные коды ошибок и их значения перечислены в следующей таблице.

Код возврата Описание
ERROR_INVALID_PRIMARY_GROUP
Функция не может получить первичную группу для нового дескриптора безопасности.
ERROR_INVALID_OWNER
Функция не может получить владельца для нового дескриптора безопасности или идентификатор безопасности (SID) не может быть назначен владельцем. Это происходит при проверке идентификатора безопасности владельца для переданного маркера.
ERROR_NO_TOKEN
Функция получила значение NULL вместо маркера для проверки владельца или проверки привилегий .
ERROR_PRIVILEGE_NOT_HELD
Задается список SACL, SEF_AVOID_PRIVILEGE_CHECK не был передан, а для переданного маркера не было включено SE_SECURITY_NAME.

Комментарии

Функция CreatePrivateObjectSecurityEx идентична вызову функции CreatePrivateObjectSecurityWithMultipleInheritance с одним GUID в ObjectTypes.

Группы AutoInheritFlags отличаются от аналогично именованных битов в элементе Control структуры SECURITY_DESCRIPTOR . Описание битов элемента управления см. в разделе SECURITY_DESCRIPTOR_CONTROL.

Если AutoInheritFlags указывает бит SEF_DACL_AUTO_INHERIT, функция применяет следующие правила к DACL в новом дескрипторе безопасности:

  • Флаг SE_DACL_AUTO_INHERITED устанавливается в элементе Control нового дескриптора безопасности.
  • DACL нового дескриптора безопасности наследует ACE от ParentDescriptor независимо от того, является ли creatorDescriptor дескриптором безопасности по умолчанию или был явно указан создателем. Новый DACL представляет собой сочетание родительских и создаваемых списков DACL в соответствии с правилами наследования. В частности, все ACE в ParentDescriptor , которые наследуются либо ко всем дочерним объектам, либо к любому классу объектов, перечисленным в ObjectTypes, будут применены к новому daCL.
  • Наследуемые ACE помечаются как INHERITED_ACE.
Если AutoInheritFlags указывает бит SEF_SACL_AUTO_INHERIT, функция применяет аналогичные правила к новому saCL.

Для списков DACL и SACCL определенные типы ACE в ParentDescriptor и CreatorDescriptor будут управляться и, возможно, заменены двумя ACE в NewDescriptor. В частности, наследуемое ACE, содержащее по крайней мере один из следующих сопоставляемых элементов, может привести к по два ACE в дескрипторе безопасности вывода. К сопоставляемым элементам относятся:

  • Универсальные права доступа в ACCESS_MASK
  • ИД владельца создателя или идентификатор безопасности группы создателей в качестве идентификатора субъекта ACE
ACE с любым из этих сопоставляемых элементов приведет к следующим двум ACE в NewDescriptor:
  • ACE, который является копией оригинала, но с установленным флагом INHERIT_ONLY. Однако этот ACE не будет создан, если существует одно из следующих двух условий:
    • Параметр IsContainerObject имеет значение FALSE. Наследуемые ACE не имеют смысла для неконтейнерных объектов.
    • Исходный ACE содержит флаг NO_PROPAGATE_INHERIT. Исходный ACE предназначен для наследования в качестве действующего ACE для дочерних элементов, но не может наследоваться ниже этих дочерних элементов.
  • Действующий элемент управления доступом, в котором включается бит INHERITED_ACE, а универсальные элементы сопоставляются с определенными элементами:
    • Универсальные права доступа заменяются соответствующими стандартными и конкретными правами доступа, указанными во входных параметрах GenericMapping.
    • Идентификатор безопасности владельца создателя заменяется владельцем в результирующем элементе NewDescriptor.
    • Идентификатор безопасности группы создателя заменяется на Группу в результирующем newDescriptor.
Если параметр AutoInheritFlags не указывает бит SEF_AVOID_OWNER_CHECK, проверка допустимости владельца выполняется в соответствии со следующими правилами. Владелец в результирующем NewDescriptor должен быть юридически сформированным идентификатором безопасности и либо соответствовать TokenUser в token , либо соответствовать группе в TokenGroups in Token. Атрибуты в группе:
  • Должен включать SE_GROUP_OWNER
  • Не должно включать SE_GROUP_USE_FOR_DENY_ONLY
Вызывающие абоненты, у которых нет доступа к маркеру клиента, который в конечном итоге будет задавать владельцу, могут пропустить проверку владельца.

Чтобы создать дескриптор безопасности для нового объекта, вызовите Метод CreatePrivateObjectSecurityWithMultipleInheritance с параметром ParentDescriptor , равным дескриптору безопасности родительского контейнера, а для CreatorDescriptor — дескриптор безопасности, предложенный создателем объекта.

Чтобы проверить текущий дескриптор безопасности объекта, вызовите Метод CreatePrivateObjectSecurityWithMultipleInheritance с параметром ParentDescriptor для дескриптора безопасности родительского контейнера, а для CreatorDescriptor — текущий дескриптор безопасности объекта. Этот вызов гарантирует, что ACE соответствующим образом наследуются от родительских дескрипторов безопасности к дочерним.

Если дескриптор безопасности CreatorDescriptor содержит saCL, для маркера должна быть включена SE_SECURITY_NAME привилегия, или вызывающий объект должен указать флаг SEF_AVOID_PRIVILEGE_CHECK в AutoInheritFlags.

Требования

Требование Значение
Минимальная версия клиента Windows XP [только классические приложения]
Минимальная версия сервера Windows Server 2003 [только классические приложения]
Целевая платформа Windows
Header securitybaseapi.h (включая Windows.h)
Библиотека Advapi32.lib
DLL Advapi32.dll

См. также раздел

CreatePrivateObjectSecurityEx

DestroyPrivateObjectSecurity

GENERIC_MAPPING

GUID

SECURITY_DESCRIPTOR

SECURITY_DESCRIPTOR_CONTROL

SECURITY_IMPERSONATION_LEVEL