前々回、前回に続いて最後は 列挙体のプロパティ値をテキスト化する ToEnumValueText メソッドです。
このメソッドは内部実装を一部変更しました。
列挙体の型が ADSI から .NET に変わったので、AceType(ACE の型)の列挙型を AceType に変更しました。
設定されている値の列挙体文字列を取得するとこ(Enum.GetValues メソッド)は Cast メソッドの型パラメータを Integer/int から Object/object に変更して、直後に Select メソッドを追加して値を Integer/int に変換してます。
なんでこんなことしてるかというと、AceFlags 列挙体が Byte/byte 型だからです。
あとは、取得した列挙体文字列のコレクションから「None」を削除してます。(値がないのを表す列挙値だから)
実際に COM 対応版(ADSI 使用版)と .NET クラス使用版の出力を較べてみました。(どれもクリックすると新しいウィンドウで拡大図が表示されます。)
まずはユーザ。列挙値の文字列は変わりましたが値は変わってないのが判ります。
次はグループ。こちらも列挙値の文字列は変わりましたが値は変わってないのが判ります。
最後はコンピュータ。こちらは ADSI 使用版の方が Domain Admins の ACE 1 つ分多く出てました。(中央の図)
デバッグ実行して調べてみたら、SecurityDescriptor(ADSI:IADsSecurityDescriptor 、.NET:CommonSecurityDescriptor)の DiscretionaryAcl プロパティ(随意アクセス制御リスト)に含まれるアクセス制御エントリ(ACE)の数が ADSI の方が 1 つ多かったです。
.NET 版は 23 個出力されてて、このコンピュータのアクセス許可エントリの数と同じではあるんですが、プロパティ画面の項目と一致してる訳じゃないので、一致するよう出力するためには色々と調べる必要がありますね。