セキュリティ記述子(SecurityDescriptor)の出力の.NETクラス使用版(VB、C#)の説明です。
※COM対応版の説明はこちら => COM対応版の変更点の説明(セキュリティ記述子:SecurityDescriptor)
まずは呼出し側。(OutputProperties メソッド)
セキュリティ記述子(nTSecurityDescriptor 属性)かどうかの判断を、値の型からプロパティ(属性)名に変更し、それをループの先頭で行うようにしました。
出力部分はメソッド化しました。(OutputSecurityDescriptor メソッド)
このメソッドがセキュリティ記述子、アクセス制御リスト(ACL)、アクセス制御エントリ(ACE)を扱っていて、ADSI から .NET のクラスに変更した部分です。
※ADSI に対応する .NET のクラスはこちら
セキュリティ記述子のオブジェクトは DirectoryEntry.ObjectSecurity プロパティの値(セキュリティ記述子情報)を表すバイト配列を取得(ActiveDirectorySecurity.GetSecurityDescriptorBinaryForm メソッド)、それを基に CommonSecurityDescriptor クラスのインスタンスを作ってます。
次に随意アクセス制御リスト(CommonSecurityDescriptor.DiscretionaryAcl プロパティ)を、その要素であるアクセス制御エントリ(ACE)のコレクションにしてます。
QualifiedAce クラスにキャストしてるのは、ACE のインスタンスが ObjectAce か CommonAce(どちらも QualifiedAce の継承クラス)だからです。
このコレクションから一意な SID(文字列)のコレクションを作ってます。
この SID のコレクションから SID/アカウント名のコレクションを作ってます。(メソッド化してます)
なんでこんなにコレクションを作ってるかというと、ACE の Trustee(セキュリティの設定対象となるユーザやグループの名前部分)を取得するためです。
IADsAccessControlEntry には Trustee プロパティがあったので、その値からユーザ名やグループ名を取得できたんですが、.NET の ACE クラスには Trustee プロパティがないので、QualifiedAce.SecurityIdentifier.Value(SID の文字列)を基に SID/アカウント名のコレクション(キー:SID、値:アカウント名)を取得してます。
出力する 5 つの項目について、プロパティ値でグループ化した ACE を作る手順と出力については COM 対応版と同じですが、Trustee と Flags の取得・出力の仕方が違います。
Trustee については上記 SID/アカウント名のコレクションから SID をキーにアカウント名を取得してます。
Flags については、QualifiedAce のインスタンスの型で分けてます。 ObjectAce クラスだと ObjectAceFlags プロパティがあるので、ディレクトリ オブジェクトに関連付けられた ACE の場合は取得できるんですが、CommonAce クラスだと Flags を表すプロパティがないので、その場合は 0 にしてます。
ToEnumValueText メソッドに渡す列挙体の型も 対応する .NET の列挙体に変更しました。
SID/アカウント名のコレクションを作成する CreateSidNameDictionary メソッド(追加作成)と、列挙体のプロパティ値をテキスト化する ToEnumValueText メソッド(変更)は別途書きます。