マイナーでもいいよね??

殆どVB系、でも .NET じゃない VB は知らないよん

目次

Blog 利用状況

書庫

日記カテゴリ

セキュリティ記述子(SecurityDescriptor)の出力の.NETクラス使用版の説明(1/3)

セキュリティ記述子(SecurityDescriptor)の出力の.NETクラス使用版(VBC#)の説明です。

※COM対応版の説明はこちら => COM対応版の変更点の説明(セキュリティ記述子:SecurityDescriptor)

 

まずは呼出し側。(OutputProperties メソッド)

セキュリティ記述子(nTSecurityDescriptor 属性)かどうかの判断を、値の型からプロパティ(属性)名に変更し、それをループの先頭で行うようにしました。

出力部分はメソッド化しました。(OutputSecurityDescriptor メソッド)

このメソッドがセキュリティ記述子、アクセス制御リスト(ACL)、アクセス制御エントリ(ACE)を扱っていて、ADSI から .NET のクラスに変更した部分です。

※ADSI に対応する .NET のクラスはこちら

 

セキュリティ記述子のオブジェクトは DirectoryEntry.ObjectSecurity プロパティの値(セキュリティ記述子情報)を表すバイト配列を取得(ActiveDirectorySecurity.GetSecurityDescriptorBinaryForm メソッド)、それを基に CommonSecurityDescriptor クラスのインスタンスを作ってます。

次に随意アクセス制御リスト(CommonSecurityDescriptor.DiscretionaryAcl プロパティ)を、その要素であるアクセス制御エントリ(ACE)のコレクションにしてます。

QualifiedAce クラスにキャストしてるのは、ACE のインスタンスが ObjectAceCommonAceどちらも 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 メソッド(変更)は別途書きます。

投稿日時 : 2013年12月26日 0:23

コメントを追加

No comments posted yet.
タイトル
名前
URL
コメント