Поделиться через


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

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

Синтаксис

BOOL CreatePrivateObjectSecurityEx(
  [in, optional] PSECURITY_DESCRIPTOR ParentDescriptor,
  [in, optional] PSECURITY_DESCRIPTOR CreatorDescriptor,
  [out]          PSECURITY_DESCRIPTOR *NewDescriptor,
  [in, optional] GUID                 *ObjectType,
  [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] ObjectType

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

[in] IsContainerObject

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

[in] AutoInheritFlags

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

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

[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_OWNER
Функция не может получить владельца для нового дескриптора безопасности или идентификатор безопасности не может быть назначен в качестве владельца. Это происходит при проверке идентификатора безопасности владельца для переданного маркера.
ERROR_INVALID_PRIMARY_GROUP
Функция не может получить первичную группу для нового дескриптора безопасности.
ERROR_NO_TOKEN
Функция получила значение NULL вместо маркера для проверки владельца или проверки привилегий.
ERROR_PRIVILEGE_NOT_HELD
Задается список SACL, SEF_AVOID_PRIVILEGE_CHECK не был передан, а для переданного маркера не было включено SE_SECURITY_NAME.

Комментарии

Функция CreatePrivateObjectSecurity идентична вызову функции CreatePrivateObjectSecurityEx с параметром ObjectType , равным NULL , а AutoInheritFlags — нулю.

Параметр 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 помечаются как 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 для дочерних элементов, но не может наследоваться ниже этих дочерних элементов.
  • Действующее ACE, в котором включается бит INHERITED_ACE, а универсальные элементы сопоставляются с определенными элементами, в том числе:
    • Универсальные права доступа заменяются соответствующими стандартными и конкретными правами доступа, указанными во входных параметрах GenericMapping.
    • Идентификатор безопасности владельца создателя заменяется владельцем в результирующем элементе NewDescriptor.
    • Идентификатор безопасности группы создателя заменяется на Группу в результирующем newDescriptor.
Если autoInheritFlags не указывает бит SEF_AVOID_OWNER_CHECK, выполняется проверка допустимости владельца. Владелец в результирующем NewDescriptor должен быть юридически сформированным идентификатором безопасности и должен соответствовать TokenUser в token или соответствовать группе в TokenGroups в token , где атрибуты группы должны включать SE_GROUP_OWNER и не должны включать SE_GROUP_USE_FOR_DENY_ONLY.

Вызывающие абоненты, у которых нет доступа к маркеру клиента, который в конечном итоге будет задавать владельцу, могут пропустить проверку владельца.

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

Если дескриптор безопасности 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

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

Функции контроль доступа клиента и сервера

Общие сведения о клиенте и сервере контроль доступа

CreatePrivateObjectSecurity

DestroyPrivateObjectSecurity

GENERIC_MAPPING

GUID

GetTokenInformation

OpenProcessToken

SECURITY_DESCRIPTOR

SECURITY_DESCRIPTOR_CONTROL

SECURITY_IMPERSONATION_LEVEL

SetPrivateObjectSecurityEx