SeSetSecurityDescriptorInfoEx 函数 (ntifs.h)

SeSetSecurityDescriptorInfoEx 例程修改对象的安全描述符,并指定对象是否支持自动继承访问控制项 (ACE) 。

语法

NTSTATUS SeSetSecurityDescriptorInfoEx(
  [in, optional] PVOID                 Object,
  [in]           PSECURITY_INFORMATION SecurityInformation,
                 PSECURITY_DESCRIPTOR  ModificationDescriptor,
  [in, out]      PSECURITY_DESCRIPTOR  *ObjectsSecurityDescriptor,
  [in]           ULONG                 AutoInheritFlags,
  [in]           POOL_TYPE             PoolType,
  [in]           PGENERIC_MAPPING      GenericMapping
);

参数

[in, optional] Object

指向要修改其安全描述符的 对象的指针。 这用于更新安全配额信息。

[in] SecurityInformation

指向一个值的指针,该值指定要设置的安全信息。 可以是以下一项或多项的组合。

含义
DACL_SECURITY_INFORMATION 指示正在设置对象的 DACL) (自由访问控制列表。 需要WRITE_DAC访问权限。
GROUP_SECURITY_INFORMATION 指示正在设置对象的主组标识符。 需要WRITE_OWNER访问权限。
OWNER_SECURITY_INFORMATION 指示正在设置对象的所有者标识符。 需要WRITE_OWNER访问权限。
SACL_SECURITY_INFORMATION 指示正在设置对象的系统 ACL (SACL) 。 需要ACCESS_SYSTEM_SECURITY访问权限。

ModificationDescriptor

要应用于 对象的输入安全描述符。 此例程的调用方应在调用之前探测和捕获传递的安全描述符,并在调用后释放它。

[in, out] ObjectsSecurityDescriptor

指向指向对象安全描述符的指针的指针。 安全描述符必须采用自相对格式。 此结构必须由调用方解除分配。

[in] AutoInheritFlags

控制 ACE 自动继承的位掩码。 设置为以下一个或多个位标志的逻辑 OR:

安全信息标志 含义
SEF_DACL_AUTO_INHERIT 如果设置了此标志,则 DACL 被视为自动继承 DACL,并按以下“备注”部分中所述进行处理。 如果未在 SecurityInformation 参数中设置DACL_SECURITY_INFORMATION,则忽略此位。
SEF_SACL_AUTO_INHERIT 如果设置了此标志,则 SACL 被视为自动继承 SACL,并按以下“备注”部分中所述进行处理。 如果未在 SecurityInformation 参数中设置SACL_SECURITY_INFORMATION,则忽略此位。

[in] PoolType

指定分配新的安全描述符时要使用的池类型,可以是以下其中一种:

  • NonPagedPool
  • PagedPool
  • NonPagedPoolCacheAligned
  • PagedPoolCacheAligned

通常,调用方指定 PagedPool,或者如果将在 IRQL >= DISPATCH_LEVEL 或在任意线程上下文中访问缓冲区,则指定 NonPagedPool

NonPagedPoolMustSucceedNonPagedPoolCacheAlignedMustS 池类型已过时,不应再使用。

[in] GenericMapping

指向GENERIC_MAPPING结构的指针,该结构指定所访问对象的泛型到特定和标准访问类型的映射。 此映射结构应该可以安全地访问 (即,在传递到此例程之前,如有必要) 捕获。

返回值

返回代码 说明
STATUS_SUCCESS 已成功修改对象的安全描述符。
STATUS_BAD_DESCRIPTOR_FORMAT 提供的对象的安全描述符不是自相对格式。
STATUS_NO_SECURITY_ON_OBJECT 对象没有安全描述符。

注解

如果 AutoInheritFlags 参数为零,则调用 SeSetSecurityDescriptorInfoEx 的效果与调用 SeSetSecurityDescriptorInfo 的效果相同。

如果 AutoInheritFlags 指定SEF_DACL_AUTO_INHERIT位, SeSetSecurityDescriptorInfoEx 会将以下规则应用于 DACL,以从当前描述符创建新的安全描述符:

  • 如果未在当前安全描述符或输入 SecurityDescriptor 的控制位中设置SE_DACL_PROTECTED标志, SeSetSecurityDescriptorInfoEx 将从继承的当前安全描述符的 ACE 和 SecurityDescriptor 的非继承 ACE 构造输出安全描述符。 也就是说,无法通过更改对象上的 ACL 来更改继承的 ACE。 此行为会保留继承的 ACE,因为它们是从父容器继承的。

  • 如果在输入 SecurityDescriptor 中设置了SE_DACL_PROTECTED,则忽略当前安全描述符。 输出安全描述符生成为输入 SecurityDescriptor 的副本,并关闭任何INHERITED_ACE位。

理想情况下,ACL 编辑器应关闭INHERITED_ACE位,向调用方指示从对象的父级继承的 ACE 现在正在对象上显式设置。

  • 如果在当前安全描述符而不是 SecurityDescriptor 中设置了SE_DACL_PROTECTED,则忽略当前安全描述符。 输出安全描述符生成为 SecurityDescriptor 的副本。 调用方负责确保正确的 ACE 已打开INHERITED_ACE位。

如果 AutoInheritFlags 指定SEF_SACL_AUTO_INHERIT位, SeSetSecurityDescriptorInfoEx 会将类似的规则应用于新的 SACL。

有关访问控制和 ACE 继承的详细信息,请参阅Microsoft Windows SDK文档的安全性部分。

要求

要求
最低受支持的客户端 Windows 2000
目标平台 通用
标头 ntifs.h (包括 Ntifs.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL

另请参阅

Ace

ACL

GENERIC_MAPPING

RtlCreateSecurityDescriptor

RtlCreateSecurityDescriptorRelative

RtlLengthSecurityDescriptor

RtlSetDaclSecurityDescriptor

RtlSetOwnerSecurityDescriptor

RtlValidSecurityDescriptor

SECURITY_DESCRIPTOR

SECURITY_INFORMATION

SeQuerySecurityDescriptorInfo

SeSetSecurityDescriptorInfo