Функция 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. Этот параметр может быть сочетанием следующих значений.
Значение | Значение |
---|---|
|
Функция не проверка допустимость владельца в результирующем NewDescriptor, как описано в примечаниях ниже. Если также установлен флаг SEF_AVOID_PRIVILEGE_CHECK, параметр Token может иметь значение NULL. |
|
Все ограничения, заданные ParentDescriptor , которые ограничивают возможность вызывающей стороны указывать DACL в CreatorDescriptor , игнорируются. |
|
Функция не выполняет проверку привилегий. Если флаг SEF_AVOID_OWNER_CHECK также установлен, параметр Token может иметь значение NULL. Этот флаг полезен при реализации автоматического наследования, чтобы избежать проверки привилегий для каждого обновляемого дочернего элемента. |
|
Новый список управления доступом на уровне пользователей (DACL) содержит ACE, унаследованные от DACL ParentDescriptor, а также все явные ACE, указанные в daCL CreatorDescriptor. Если этот флаг не задан, новый daCL не наследует ACE. |
|
CreatorDescriptor — дескриптор по умолчанию для типа объекта, заданного objectType. Таким образом, CreatorDescriptor игнорируется, если ParentDescriptor имеет какие-либо объекты ACE для типа объекта, указанного параметром ObjectType . Если такие ACE не наследуются, CreatorDescriptor обрабатывается так, как если бы этот флаг не был указан. |
|
Группа NewDescriptor по умолчанию является группой из ParentDescriptor. Если значение не задано, группа NewDescriptor по умолчанию соответствует группе маркера, указанной параметром Token . Группа маркера указывается в самом маркере. В любом случае, если параметр CreatorDescriptor не равен NULL, группе NewDescriptor присваивается группа из CreatorDescriptor. |
|
По умолчанию владельцем NewDescriptor является владелец из ParentDescriptor. Если значение не задано, владелец NewDescriptor по умолчанию будет владельцем маркера, указанного параметром Token . Владелец маркера указывается в самом маркере. В любом случае, если параметр CreatorDescriptor не равен NULL, для владельца NewDescriptor устанавливается владелец из CreatorDescriptor. |
|
Если этот флаг установлен, обязательная метка ACE в CreatorDescriptor не используется для создания обязательной метки ACE в NewDescriptor. Вместо этого в NewDescriptor добавляется новый SYSTEM_MANDATORY_LABEL_ACE с маской доступа SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP и идентификатором безопасности безопасности целостности маркера. |
|
Если этот флаг установлен, обязательная метка ACE в CreatorDescriptor не используется для создания обязательной метки ACE в NewDescriptor. Вместо этого в NewDescriptor добавляется новый SYSTEM_MANDATORY_LABEL_ACE с маской доступа SYSTEM_MANDATORY_LABEL_NO_READ_UP и идентификатором безопасности из идентификатора безопасности целостности маркера. |
|
Если этот флаг установлен, обязательная метка ACE в CreatorDescriptor не используется для создания обязательной метки ACE в NewDescriptor. Вместо этого в NewDescriptor добавляется новый SYSTEM_MANDATORY_LABEL_ACE с маской доступа SYSTEM_MANDATORY_LABEL_NO_WRITE_UP и идентификатором безопасности безопасности целостности маркера. |
|
Новый системный список управления доступом (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. Некоторые расширенные коды ошибок и их значения перечислены в следующей таблице.
Код возврата | Описание |
---|---|
|
Функция не может получить владельца для нового дескриптора безопасности или идентификатор безопасности не может быть назначен в качестве владельца. Это происходит при проверке идентификатора безопасности владельца для переданного маркера. |
|
Функция не может получить первичную группу для нового дескриптора безопасности. |
|
Функция получила значение NULL вместо маркера для проверки владельца или проверки привилегий. |
|
Задается список 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.
Для списков DACL и SACCL определенные типы ACE в ParentDescriptor и CreatorDescriptor будут управляться и, возможно, заменены двумя ACE в NewDescriptor. В частности, наследуемое ACE, содержащее по крайней мере один из следующих сопоставляемых элементов, может привести к по два ACE в дескрипторе безопасности вывода. К сопоставляемым элементам относятся:
- Универсальные права доступа в ACCESS_MASK
- ИД владельца создателя или идентификатор безопасности группы создателей в качестве идентификатора субъекта ACE
- ACE, который является копией оригинала, но с установленным флагом INHERIT_ONLY. Однако этот ACE не будет создан, если существует одно из следующих двух условий:
- Параметр IsContainerObject имеет значение FALSE. Наследуемые ACE не имеют смысла для неконтейнерных объектов.
- Исходный ACE содержит флаг NO_PROPAGATE_INHERIT. Исходный ACE предназначен для наследования в качестве действующего ACE для дочерних элементов, но не может наследоваться ниже этих дочерних элементов.
- Действующее ACE, в котором включается бит INHERITED_ACE, а универсальные элементы сопоставляются с определенными элементами, в том числе:
- Универсальные права доступа заменяются соответствующими стандартными и конкретными правами доступа, указанными во входных параметрах GenericMapping.
- Идентификатор безопасности владельца создателя заменяется владельцем в результирующем элементе NewDescriptor.
- Идентификатор безопасности группы создателя заменяется на Группу в результирующем newDescriptor.
Вызывающие абоненты, у которых нет доступа к маркеру клиента, который в конечном итоге будет задавать владельцу, могут пропустить проверку владельца.
Чтобы создать дескриптор безопасности для нового объекта, вызовите Метод 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 |
См. также раздел
Функции контроль доступа клиента и сервера