0

クラスを使用して Windows レジストリからセキュリティ記述子を読み取り、それを変更して、変更された記述子を元に戻すコードをここからいじっています。RawSecurityDescriptorこれは基本的に、"dcomperm" Microsoft SDK サンプルが行うことと同じです。

それでも、「dcomperm」サンプルは 2 つの変換を行います。記述子がレジストリから読み取られると、「selt-relative」から「absolute」を使用してMakeAbsoluteSD()変換され、その形式で変更されます。変更が完了すると、「self」に変換されます。 -relative」を使用MakeSelfRelativeSD()し、「self-relative」形式で保存します。

リンク先のコードには、そのような変換はありません。

それらはC#でどのように行われますか? それらは .NET フレームワークによって内部的に行われますか、それとも P/Invoke を使用して独自に行う必要がありますか?

4

1 に答える 1

1

私が理解しているように、などのSystem.Security.AccessControl名前空間のクラスは、対応する Win32 コンストラクト内の情報の管理された表現を提供します。したがって、 のインスタンスは .NET オブジェクトであり、フィールドも .NET オブジェクトです (たとえば、DACL と SACL の 2 つのオブジェクトを含みます)。このマネージ表現は、 unmanaged の絶対形式または自己相対形式とは直接関係ありません。RawSecurityDescriptorRawAclRawSecurityDescriptorRawAclSecurityDescriptor

このRawSecurityDescriptorクラスは、マネージド表現との間の変換を提供します.1つはテキストSDDL表現(質問には関係ありません)、もう1つは「BinaryForm」と呼ばれるもので、Win32の自己相対構造に対応し、SDを連続したものとして表しますバイト配列。

マネージド コード サンプルでは、​​レジストリに格納されている自己相対バイト配列からマネージド表現に変換するctorforを使用しています。RawSecurityDescriptor次に、.NET コードを使用してマネージド表現に変更が加えられ、最後にGetBinaryFormメソッドが呼び出されて、修正された SD が自己相対アンマネージド形式に変換され、レジストリに格納されます。したがって、マネージ コードは絶対 SD 構造に関与する必要はありません。

SD を変更するために呼び出される Win32 API の一部は絶対形式を必要とするため、アンマネージ コードはそれぞれの方法で変換を行う必要があります。

于 2012-08-01T16:59:50.057 に答える