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 | ExplicitDescriptor 是 ObjectType 指定的对象类型的默认描述符。 如果 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。 |
工作分配说明
- 未指定SEF_DEFAULT_DESCRIPTOR_FOR_OBJECT标志。
- 指定SEF_DEFAULT_DESCRIPTOR_FOR_OBJECT标志。
- ACL 的自动继承标志 (SEF_DACL_AUTO_INHERIT 或SEF_SACL_AUTO_INHERIT) 指定。
- 未指定 ACL 的自动继承标志。
- 在其 AceFlags 成员中设置了INHERITED_ACE位的 ACE 不会 复制到分配的安全描述符。
- 继承自父描述符的 ACE 追加到显式描述符指定的 ACE 之后。
[in] SubjectContext
指向正在创建对象的使用者的安全上下文的指针。 SubjectContext 用于检索新对象的默认安全信息,包括默认所有者、主组和自由访问控制。
[in] GenericMapping
指向访问掩码值数组的指针,该值指定每个泛型权限与对象特定权限之间的映射。
[in] PoolType
未使用此参数。 用于保存新安全描述符的缓冲区始终从分页池分配。
返回值
SeAssignSecurityEx 返回以下值之一:
返回代码 | 说明 |
---|---|
|
分配成功。 |
|
作为新安全描述符的所有者提供的 SID 不是调用方有权分配为对象的所有者的 SID。 |
|
调用方没有显式分配指定 SACL 所需的 seSecurityPrivilege (权限) 。 |
注解
SeAssignSecurityEx 通过以下方式扩展 SeAssignSecurity 的基本操作:
- ObjectType (可选)指定对象类型。 特定于对象的继承由特定于对象的 ACE 的以下成员控制: Flags、 InheritedObjectType 和 Header.AceFlags。
- AutoInheritFlags 指定所使用的 ACE 的自动继承类型。 AutoInheritFlags 还控制权限检查、所有者检查以及为 NewDescriptor 设置默认所有者和组。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | 从 Windows 2000 开始可用。 |
目标平台 | 通用 |
标头 | wdm.h(包括 Wdm.h、Ntddk.h、Ntifs.h) |
Library | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
DDI 符合性规则 | HwStorPortProhibitedDDI (storport) |