从SECURITY_DESCRIPTOR转换为字符串并再次返回不起作用

时间:2013-10-28 18:19:20

标签: c++ windows winapi

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

'MyBuildSecurityDescriptor'是从here复制的函数,用于创建基本安全描述符。

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;

以下是Visual Studio中针对上述程序的 piSecDesc piNewSecDesc 的调试视图; Debug view of piSecDesc Debug view of piNewSecDesc

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

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

某些背景 我的工作要求我检索SECURITY_DESCRIPTOR,然后通过管道将其传递给另一个程序。最简单的方法是转换为字符串,将其传递,然后转换回另一端。

1 个答案:

答案 0 :(得分:1)

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

SECURITY_DESCRIPTOR结构说明中的MSDN explicitly notes

  

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

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