Active Directory データのプロパティ出力の COM 対応版について、4 つの変更点のうち 3 つ目の説明です。
大きい整数、セキュリティ記述子(SecurityDescriptor)の次は、構造化例外処理を使わないで値がないかを確認する部分です。(コードはこちら VB C#) ※セキュリティ記述子部分のコードと説明を修正しました。
どこかというと、オプションのプロパティ出力(OutputOptionalProperties)の最初のループの直後です。(以前のコードはこちら VB C#)
以前は
1. DirectoryEntry.NativeObject を ADSI の基本インターフェイスである IADs にキャスト
2. DirectoryEntry.SchemaEntry.NativeObject を IADsClass にキャスト
3. IADsClass.OptionalProperties を Object 配列にキャストしたものを引数にして IADs.GetInfoEx メソッドで プロパティをディレクトリ ストアから読込み
4. ループ内 : IADs.GetEx メソッドでプロパティ(属性)の値を取得(Object 型)
5. プロパティ(属性)が設定されてないと例外が発生するので、その時は「未設定」を出力
という処理でした。
今回は
1. DirectoryEntry.SchemaEntry.NativeObject を IADsClass にキャスト
2. IADsClass.OptionalProperties を Object 配列にキャスト
3. DirectoryEntry.Invoke メソッドで IADs.GetInfoEx メソッドを呼び出して プロパティをディレクトリ ストアから読込み
4. ループ内 : DirectoryEntry.Properties.Item で プロパティ(型は PropertyValueCollection)を取得
5. PropertyValueCollection.Value (Object 型)が null 参照なら「未設定」を出力
という処理にしました。
ADSI のインターフェイスは値が設定されてないプロパティについて、IADs.GetEx メソッドでの取得操作や、IADs を継承してる IADsUser や IADsGroup に定義されてるプロパティ(Description など)へのアクセスをすると例外が発生します。
一方 DirectoryEntry の方は、DirectoryEntry.Properties.Item の Value プロパティで プロパティにアクセス・値を取得しても例外は発生せず、null が返されるだけです。
今回変更したことで、パフォーマンスは劇的によくなりました。まぁ当然といえば当然なんですけどね。
特にユーザの場合はプロパティの数が多いので、プロパティを全然設定してないと時間かかってましたから。
やっと構造化例外処理を使わなくていいようになりました。