セキュリティ記述子(nTSecurityDescriptor 属性)について DirectoryEntry.ObjectSecurityプロパティのとこで ADSI の 3 つのインターフェイスの名前に似たクラスが .NET にあるはずと思ったので調べてみました。
セキュリティ記述子である IADsSecurityDescriptor ですが、対応するのは CommonSecurityDescriptor クラスで、説明は次のように書かれてます。
セキュリティ記述子を表します。 セキュリティ記述子には、所有者、プライマリ グループ、随意アクセス制御リスト (DACL: Discretionary Access Control List)、システム アクセス制御リスト (SACL: System Access Control List) が含まれます。
この説明にある 4 つは順に Owner、Group、DiscretionaryAcl、SystemAcl プロパティで IADsSecurityDescriptor インターフェイスのメンバと同じです。(型は違います)
SecurityDescriptor 関連クラスの継承階層は次のようになってます。
System.Object
System.Security.AccessControl.GenericSecurityDescriptor
System.Security.AccessControl.CommonSecurityDescriptor
System.Security.AccessControl.RawSecurityDescriptor
CommonSecurityDescriptor.DiscretionaryAcl プロパティの型は DiscretionaryAcl クラスで、IADsAccessControlList に対応する 随意アクセス制御リストを表すクラスです。
ちなみに CommonSecurityDescriptor.SystemAcl プロパティの型は SystemAcl クラスで、IADsAccessControlList に対応する システム アクセス制御リストを表すクラスです。
ACL 関連クラスの継承階層は次のようになってます。
System.Object
System.Security.AccessControl.GenericAcl
System.Security.AccessControl.CommonAcl
System.Security.AccessControl.DiscretionaryAcl
System.Security.AccessControl.SystemAcl
System.Security.AccessControl.RawAcl
随意アクセス制御リストの各要素であるアクセス制御エントリは IADsAccessControlEntry で、これに対応するクラスは 2 つあります。
1 つは アクセス制御エントリを表す CommonAce クラスです。
もう 1 つは ディレクトリ オブジェクトに関連付けられたアクセス制御エントリを表す ObjectAce クラスです。
ACE 関連クラスの継承階層は次のようになってます。
System.Object
System.Security.AccessControl.GenericAce
System.Security.AccessControl.CustomAce
System.Security.AccessControl.KnownAce
System.Security.AccessControl.CompoundAce
System.Security.AccessControl.QualifiedAce
System.Security.AccessControl.CommonAce
System.Security.AccessControl.ObjectAce
MSDN ライブラリを見ると DiscretionaryAcl.Item プロパティ(CommonAcl から継承)は次のように書かれてます。(下は原文)
指定したインデックス位置にある CommonAce を取得または設定します。
Gets or sets the CommonAce at the specified index.
プロパティの型は GenericAce で、GenericAcl.Item をオーバーライドしてます。
GenericAcl.Item の方は「CommonAce」じゃなく「GenericAce」となってます。
DiscretionaryAcl(随意アクセス制御リスト)内には ObjectAce クラスのアクセス制御エントリもあるので、「CommonAce を取得または設定」よりは「QualifiedAce を取得または設定」の方がまだいいのではないかと思いますね。
少なくても 説明まで上書きしなくても・・・
ひとまずこれらのクラスを使って ADSI の時と同じ内容(列挙値の文字列が異なるだけ)の出力ができるようにしてみます。
コードの量は確実に増えると思いますが・・・