2012-08-01 46 views
0

我正在玩code from here,它使用RawSecurityDescriptor類從Windows註冊表中讀取安全描述符,對其進行修改,然後將修改後的描述符存回。這與「dcomperm」Microsoft SDK示例所做的基本相同。在C#中,「絕對」和「自相關」安全描述符是如何操縱的?

然而「dcomperm」樣品做兩次轉換 - 一旦描述符從註冊表它是從「SELT相對」轉換讀「絕對」使用MakeAbsoluteSD(),然後以該形式改變了,一旦變更完成它轉換回「自我相對」使用MakeSelfRelativeSD()和存儲在「自我相對」的形式。

在我鏈接的代碼中沒有這樣的轉換。

它們是如何在C#中完成的?它們是由.NET框架在內部完成還是必須通過P/Invoke自己完成?

回答

1

據我所知,System.Security.AccessControl命名空間中的類如RawSecurityDescriptorRawAcl等在相應的Win32結構中提供了信息的託管表示。因此,RawSecurityDescriptor的一個實例是一個.NET對象,其中的字段也是.NET對象(包括例如DACL和SACL的兩個RawAcl對象)。這種管理的表述與非管理性的SecurityDescriptor的絕對或自我相關形式沒有直接關係。

RawSecurityDescriptor類爲託管表示提供轉換,其中一個轉換爲文本SDDL表示(與您的問題無關),另一個轉換爲與「Win32自相關結構」對應的所謂「BinaryForm」 SD作爲連續的字節數組。

託管代碼示例使用ctorRawSecurityDescriptor用於從存儲在註冊表中的自相關的字節數組,向被管理表示轉換。然後使用.NET代碼對受管表示進行更改,最後調用GetBinaryForm方法將修訂的SD轉換回自相關非託管表單以存儲在註冊表中。因此,託管代碼從不需要關注任何絕對的SD結構。

非託管代碼確實需要進行每種方式的轉換,因爲一些調用了更改SD的Win32 API需要絕對格式。