0

我正在玩弄这里的代码,它使用RawSecurityDescriptor类从 Windows 注册表读取安全描述符,对其进行更改,然后将更改后的描述符存储回来。这与“dcomperm”Microsoft SDK 示例的功能基本相同。

然而,“dcomperm”样本进行了两次转换——一旦从注册表中读取描述符,它就会从“selt-relative”转换为“absolute” MakeAbsoluteSD(),然后以这种形式进行更改,一旦更改完成,它就会转换回“self” -relative”MakeSelfRelativeSD()以“自相关”形式使用和存储。

在我链接到的代码中没有这样的转换。

它们是如何在 C# 中完成的?它们是由 .NET 框架在内部完成的,还是我必须使用 P/Invoke 自己完成?

4

1 回答 1

1

据我了解,System.Security.AccessControl命名空间中的类(如RawSecurityDescriptor等)RawAcl提供了相应 Win32 构造中信息的托管表示。所以 .NET 对象的一个​​实例RawSecurityDescriptor,其字段也是 .NET 对象(包括,例如,RawAclDACL 和 SACL 的两个对象)。这种托管表示与 unmanaged 的​​绝对形式或自相关形式都没有直接关系SecurityDescriptor

该类RawSecurityDescriptor提供与托管表示的转换,一种是文本 SDDL 表示(与您的问题无关),另一种是它所谓的“BinaryForm”,它对应于 Win32 自相关结构,将 SD 表示为连续的字节数组。

您的托管代码示例使用从存储在注册表中的自相关字节数组转换为托管表示的ctorRawSecurityDescriptor然后使用 .NET 代码对托管表示进行更改,最后GetBinaryForm调用该方法将修改后的 SD 转换回自相关的非托管形式以存储在注册表中。因此托管代码永远不需要关注任何绝对的 SD 结构。

非托管代码确实需要以各种方式进行转换,因为调用以更改 SD 的某些 Win32 API 需要绝对形式。

于 2012-08-01T16:59:50.057 回答