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。
NonPagedPoolMustSucceed 和 NonPagedPoolCacheAlignedMustS 池类型已过时,不应再使用。
[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 现在已在对象上显式设置。
- 如果在当前安全描述符中设置了SE_DACL_PROTECTED,而不是在 SecurityDescriptor中设置,则忽略当前安全描述符。 输出安全描述符生成为 SecurityDescriptor的副本。 调用方有责任确保正确的 ACE 已启用INHERITED_ACE位。
如果 AutoInheritFlags 指定SEF_SACL_AUTO_INHERIT位,SeSetSecurityDescriptorInfoEx 将类似的规则应用于新的 SACL。
有关访问控制和 ACE 继承的详细信息,请参阅 windows SDK 文档Microsoft的安全性部分。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | Windows 2000 |
目标平台 | 普遍 |
标头 | ntifs.h (include Ntifs.h) |
库 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |