2013-10-28 76 views
0

簡單的測試程序來說明想法:從SECURITY_DESCRIPTOR轉換爲字符串,然後再返回不起作用

「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中調試視圖爲piSecDescpiNewSecDesc用於上述程序; Debug view of piSecDescDebug view of piNewSecDesc

所以我的問題是爲什麼轉換後的SECURITY_DESCRIPTOR沒有正確的數據?

鑑於this狀態(關於ConverStringSecurityDescriptorToSecurityDescriptor)「此函數檢索ConvertSecurityDescriptorToStringSecurityDescriptor函數轉換爲字符串格式的安全描述符。」我會假設這個簡單的程序將工作。

一些背景 我的工作需要我檢索一個SECURITY_DESCRIPTOR,然後通過管道傳遞給另一個程序。最簡單的方法似乎是轉換爲字符串,將其傳遞,然後轉換回另一端。

+0

你檢查了Convert函數的返回值嗎? –

回答

1

我強烈懷疑您看到的差異是因爲MyBuildSecurityDescriptor構建了absolute security descriptor,而ConvertStringSecurityDescriptorToSecurityDescriptor構建了self-relative安全描述符。您可以使用MakeAbsoluteSD將自相關安全描述符轉換爲絕對安全描述符,但說實話,這沒有實際意義。所有的Windows API都接受絕對或自相關的安全描述符。

MSDN explicitly notes在用於SECURITY_DESCRIPTOR結構的描述:

由於安全性描述符的內部格式可以變化,我們 建議應用程序不直接修改SECURITY_DESCRIPTOR 結構。要創建和操作安全描述符,請使用另請參閱中列出的功能。

我會使用IsValidSecurityDescriptor函數(以及檢查返回值)來驗證描述符的一致性。

+0

沒問題。在一個自相關的安全描述符中,「指針」包含一個偏移量而不是實際的指針。調試器不知道這一點,試圖將其解釋爲指針。 –

+0

正是我需要的!雖然我猜我實際上並不需要使用MakeAbsoluteSD,如果所有的API都接受這兩種類型的話。在真正的代碼中,我檢查返回值,這是我成功返回時出現的一些混淆,但我將添加對IsValidSecurityDescriptor的檢查。謝謝你的幫助。 – Ralara

+0

@ralara - 關於自相關安全描述符的好處在於它們是一個blob,這意味着您可以通過管道發送自相關SD而不必進行字符串編碼/解碼。您可以使用[MakeSelfRelativeSD](http://msdn.microsoft.com/en-us/library/windows/desktop/aa379265(v = vs.85).aspx)將絕對SD轉換爲自相關格式。 –

相關問題