SeAssignSecurity 函数 (wdm.h)
SeAssignSecurity 例程为新对象生成一个自相对安全描述符,给定其父目录的安全描述符以及该对象最初请求的任何安全性。
语法
NTSTATUS SeAssignSecurity(
[in, optional] PSECURITY_DESCRIPTOR ParentDescriptor,
[in, optional] PSECURITY_DESCRIPTOR ExplicitDescriptor,
[out] PSECURITY_DESCRIPTOR *NewDescriptor,
[in] BOOLEAN IsDirectoryObject,
[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的指针。 SeAssignSecurity 从分页内存池分配缓冲区。
[in] IsDirectoryObject
指定新对象是否为目录对象。 TRUE 表示对象包含其他对象。
[in] SubjectContext
指向缓冲区的指针,该缓冲区包含创建对象的使用者的安全上下文。 这用于检索新对象的默认安全信息,例如默认所有者、主组和任意访问控制。
[in] GenericMapping
指向 GENERIC_MAPPING 结构的指针,该结构描述从每个泛型权限到隐含的非常规权限的映射。
[in] PoolType
未使用此参数。 用于保存新安全描述符的缓冲区始终从分页池分配。
返回值
SeAssignSecurity 可以返回以下项之一:
返回代码 | 说明 |
---|---|
|
分配成功。 |
|
为目标安全描述符的所有者提供的 SID 不是调用方有权分配为对象的所有者的 SID。 |
|
调用方没有显式分配指定系统 ACL 所需的 (SeSecurityPrivilege) 特权。 |
注解
返回给调用方的最终安全描述符可能包含混合信息,其中一些信息是从新对象的父级显式提供的。
SeAssignSecurity 假定尚未执行权限检查。 此例程执行权限检查。
系统 ACL 和任意 ACL 的分配受下表中所示的逻辑控制:
指定的显式 (非默认) ACL | 显式默认 ACL 指定 | 未指定 ACL | |
---|---|---|---|
可从父级继承 ACL | 分配指定的 ACL | 分配继承的 ACL | 分配继承的 ACL |
没有从父级继承的可继承 ACL | 分配指定的 ACL | 分配默认 ACL | 不分配 ACL |
显式指定的 ACL(无论是否为默认 ACL)可以为空或 null。 调用方必须是内核模式客户端或具有适当特权才能显式分配默认或非默认系统 ACL。
新对象的所有者和组的分配受以下逻辑控制:
- 如果传递的安全描述符包含所有者,则会将其分配为新对象的所有者。 否则,调用方令牌被视为确定所有者。 在令牌中,分配默认所有者(如果有)。 否则,将分配调用方的用户 ID。
- 如果传递的安全描述符包含组,则将其分配为新对象的组。 否则,将考虑调用方令牌来确定组。 在令牌中,分配默认组(如果有)。 否则,将分配调用方的主要组 ID。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | 在 Windows 2000 和更高版本的 Windows 中可用。 |
目标平台 | 通用 |
标头 | wdm.h(包括 Wdm.h、Ntddk.h、Ntifs.h) |
Library | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
DDI 符合性规则 | HwStorPortProhibitedDDI (storport) 、 PowerIrpDDis (wdm) |