0

简单的测试程序来说明想法:

“MyBuildSecurityDescriptor”是从此处复制的用于创建基本安全描述符的函数。

PSECURITY_DESCRIPTOR pSecDesc = MyBuildSecurityDescriptor();

// Convert to a PISECURITY_DESCRIPTOR to view the contents.
PISECURITY_DESCRIPTOR piSecDesc = (PISECURITY_DESCRIPTOR)pSecDesc;

LPTSTR szSecDesc;
ConvertSecurityDescriptorToStringSecurityDescriptor(pSecDesc, SECURITY_DESCRIPTOR_REVISION,
                                                    DACL_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | OWNER_SECURITY_INFORMATION | SACL_SECURITY_INFORMATION,
                                                    &szSecDesc,
                                                    NULL);

// At this point szSecDesc has the correct security descriptor in it.
// "D:(A;;KR;;;WD)(A;;KA;;;BA)" for those interested.

// Now to convert back from string version.
PSECURITY_DESCRIPTOR pSecurityDescriptor;
ConvertStringSecurityDescriptorToSecurityDescriptor(szSecDesc, SDDL_REVISION_1, &pSecurityDescriptor, NULL);

// Convert to a PISECURITY_DESCRIPTOR to view the contents.
PISECURITY_DESCRIPTOR piNewSecDesc = (PISECURITY_DESCRIPTOR)pSecurityDescriptor;

这是上述程序 的piSecDescpiNewSecDesc在 Visual Studio 中的调试视图;piSecDesc 的调试视图piNewSecDesc 的调试视图

所以我的问题是为什么转换后的 SECURITY_DESCRIPTOR 没有正确的数据?

鉴于状态(关于 ConverStringSecurityDescriptorToSecurityDescriptor)“此函数检索 ConvertSecurityDescriptorToStringSecurityDescriptor 函数转换为字符串格式的安全描述符。” 我会假设这个简单的程序会起作用。

一些上下文 我的工作需要我检索一个 SECURITY_DESCRIPTOR,然后通过管道将它传递给另一个程序。似乎最简单的方法是转换为字符串,将其传递,然后再转换回另一端。

4

1 回答 1

1

我强烈怀疑您看到的差异是因为MyBuildSecurityDescriptor构建了绝对安全描述符,而ConvertStringSecurityDescriptorToSecurityDescriptor构建了自相关安全描述符。您可以使用 将自相关安全描述符转换为绝对安全描述符MakeAbsoluteSD,但老实说,这没有任何意义;所有 Windows API 都接受绝对或自相关安全描述符。

MSDN在 SECURITY_DESCRIPTOR 结构的描述中明确指出:

由于安全描述符的内部格式可能不同,我们建议应用程序不要直接修改 SECURITY_DESCRIPTOR 结构。要创建和操作安全描述符,请使用另请参阅中列出的函数。

我将使用该IsValidSecurityDescriptor函数(以及检查返回值)来验证描述符的一致性。

于 2013-10-28T19:03:04.793 回答