SeAssignSecurityEx 函数 (wdm.h)

SeAssignSecurityEx 例程在给定以下可选参数的情况下为新对象生成自相对安全描述符:对象的父目录的安全描述符、对象的显式安全描述符和对象类型。

语法

NTSTATUS SeAssignSecurityEx(
  [in, optional] PSECURITY_DESCRIPTOR      ParentDescriptor,
  [in, optional] PSECURITY_DESCRIPTOR      ExplicitDescriptor,
  [out]          PSECURITY_DESCRIPTOR      *NewDescriptor,
  [in, optional] GUID                      *ObjectType,
  [in]           BOOLEAN                   IsDirectoryObject,
  [in]           ULONG                     AutoInheritFlags,
  [in]           PSECURITY_SUBJECT_CONTEXT SubjectContext,
  [in]           PGENERIC_MAPPING          GenericMapping,
  [in]           POOL_TYPE                 PoolType
);

参数

[in, optional] ParentDescriptor

指向包含所创建的新对象的父对象的 SECURITY_DESCRIPTOR 的指针。 ParentDescriptor 可以为 NULL,或者将 NULL 系统访问控制列表 (SACL) 或 NULL 任意访问控制列表 (DACL) 。

[in, optional] ExplicitDescriptor

指向应用于新对象的显式 SECURITY_DESCRIPTOR 的指针。 ExplicitDescriptor 可以为 NULL,也可以具有 NULL SACL 或 NULL DACL。

[out] NewDescriptor

接收指向返回 SECURITY_DESCRIPTOR的指针。 SeAssignSecurityEx 从分页内存池分配缓冲区。

[in, optional] ObjectType

指向要创建的对象类型的 GUID 的指针。 如果对象没有 GUID,则必须将 ObjectType 设置为 NULL

[in] IsDirectoryObject

指定新对象是否为目录对象。 如果 IsDirectoryObject 设置为 TRUE,则新对象是目录对象,否则新对象不是目录对象。

[in] AutoInheritFlags

指定应用于由 ParentDescriptor 指定的访问控制列表 (ACL) 中的访问控制项 (ACE) 的自动继承类型。 AutoInheritFlags 还控制权限检查、所有者检查以及为 NewDescriptor 设置默认所有者和组。 AutoInheritFlags 必须设置为以下一个或多个值的逻辑 OR:

含义
SEF_DACL_AUTO_INHERIT 除了 ExplicitDescriptor 指定的显式 ACE 外,NewDescriptor 还继承了 ParentDescriptor 的 DACL 中的 ACE。
SEF_SACL_AUTO_INHERIT 除 ExplicitDescriptor 指定的显式 ACE 外,NewDescriptor 还继承了 ParentDescriptor 的 SACL 中的 ACE。
SEF_DEFAULT_DESCRIPTOR_FOR_OBJECT ExplicitDescriptorObjectType 指定的对象类型的默认描述符。 如果 ACE 继承自 ParentDescriptor,则不使用 ExplicitDescriptor
SEF_AVOID_PRIVILEGE_CHECK 未执行权限检查。 此标志适用于自动继承,因为它可避免对需要更新的每个子级进行特权检查。
SEF_AVOID_OWNER_CHECK 未完成所有者检查。
SEF_DEFAULT_OWNER_FROM_PARENT 如果 所有者由 ExplicitDescriptor 指定,则不使用此标志,并且 NewDescriptor 的所有者设置为 ExplictDescriptor 指定的所有者。

如果 ExplicitDescriptor 未指定所有者,则按以下方式使用此标志:如果设置了标志, 则 NewDescriptor 的所有者将设置为 ParentDescriptor 的所有者。 否则,NewDescriptor 的所有者设置为 SubjectContext 指定的所有者。

SEF_DEFAULT_GROUP_FROM_PARENT 如果组由 ExplicitDescriptor 指定,则不使用此标志,并且 NewDescriptor 组设置为 ExplictDescriptor 指定的组。

如果 ExplicitDescriptor 未指定组,则按以下方式使用此标志:如果设置了标志, 则 NewDescriptor 的组设置为 ParentDescriptor 组。 否则,NewDescriptor 的组设置为 SubjectContext 指定的组。

 

下表描述了系统 ACL 和任意 ACL 的分配:

非默认显式描述符 (1) 默认显式描述符 (2) 显式描述符
ACL 继承自父描述符 (3) 。 分配继承的 ACL 和显式 ACL (5) (6) 。 分配继承的 ACL。 分配继承的 ACL。
ACL 不是从父描述符 (4) 继承的。 分配非默认 ACL。 分配默认 ACL。 不分配 ACL。
 

工作分配说明

  1. 未指定SEF_DEFAULT_DESCRIPTOR_FOR_OBJECT标志。
  2. 指定SEF_DEFAULT_DESCRIPTOR_FOR_OBJECT标志。
  3. ACL 的自动继承标志 (SEF_DACL_AUTO_INHERIT 或SEF_SACL_AUTO_INHERIT) 指定。
  4. 未指定 ACL 的自动继承标志。
  5. 在其 AceFlags 成员中设置了INHERITED_ACE位的 ACE 不会 复制到分配的安全描述符。
  6. 继承自父描述符的 ACE 追加到显式描述符指定的 ACE 之后。

[in] SubjectContext

指向正在创建对象的使用者的安全上下文的指针。 SubjectContext 用于检索新对象的默认安全信息,包括默认所有者、主组和自由访问控制。

[in] GenericMapping

指向访问掩码值数组的指针,该值指定每个泛型权限与对象特定权限之间的映射。

[in] PoolType

未使用此参数。 用于保存新安全描述符的缓冲区始终从分页池分配。

返回值

SeAssignSecurityEx 返回以下值之一:

返回代码 说明
STATUS_SUCCESS
分配成功。
STATUS_INVALID_OWNER
作为新安全描述符的所有者提供的 SID 不是调用方有权分配为对象的所有者的 SID。
STATUS_PRIVILEGE_NOT_HELD
调用方没有显式分配指定 SACL 所需的 seSecurityPrivilege (权限) 。

注解

SeAssignSecurityEx 通过以下方式扩展 SeAssignSecurity 的基本操作:

  • ObjectType (可选)指定对象类型。 特定于对象的继承由特定于对象的 ACE 的以下成员控制: FlagsInheritedObjectTypeHeader.AceFlags
  • AutoInheritFlags 指定所使用的 ACE 的自动继承类型。 AutoInheritFlags 还控制权限检查、所有者检查以及为 NewDescriptor 设置默认所有者和组。
有关安全性和访问控制的详细信息,请参阅Microsoft Windows SDK中有关这些主题的文档。

要求

要求
最低受支持的客户端 从 Windows 2000 开始可用。
目标平台 通用
标头 wdm.h(包括 Wdm.h、Ntddk.h、Ntifs.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI 符合性规则 HwStorPortProhibitedDDI (storport)

另请参阅

GENERIC_MAPPING

SECURITY_DESCRIPTOR

SeAssignSecurity

SeDeassignSecurity