[ADSI プログラミング] VBScript: Directory からオブジェクトを探し出せ! - 2

こんにちは、ILM 一家のパパ(お父さん)です。

次期バージョン ILM “2” のリリースを控えている事もありますが、現バージョン ILM 2007(MIIS 2003) については、サポート窓口へのお問い合わせは落ち着いている状況です。

現在、ILM 一家は若干の余裕がありますので、サポート契約をお持ちのお客様、ILM、ADSI関連で何か不明な点がございましたら、ぜひ、マイクロソフト サポートサービスをご利用下さい。

さて、今回は前回の続きでLDAP プロバイダ、OLE DB プロバイダを使用した、Directory サーバからのオブジェクト抽出手法についてお話します。

前回、ご紹介したスクリプトサンプルをもう一度見てみましょう。

< スクリプトサンプル >

Set conn = CreateObject("ADODB.Connection")

conn.Provider = "ADSDSOObject"

conn.Open "ADs Provider"

Set rs = conn.Execute( _

            "<LDAP://dc=ilmtest,dc=microsoft,dc=com>;" _

            & "(objectCategory=*);ADsPath,description;subtree")

Do Until rs.EOF

Wscript.Echo rs.Fields(0).Value & “:” & rs.Fields(1).Value

rs.MoveNext

Loop

conn.Close

オブジェクト抽出するための、接続先、抽出条件、結果セット構成は、Execute メソッドの引数に接続文字列として受け渡す形式でご紹介しました。非常にシンプルだと思いますが、この形式のデメリットとして、接続文字列以外の項目設定ができない事が上げられます。

ここで、ADODB.Command クラスを使用して、接続文字列をプロパティとして指定する方法にサンプルを変更してみたいと思います。

< スクリプトサンプル : ADODB.Command 使用- 1 >

Set conn = CreateObject("ADODB.Connection")

Set cmd = CreateObject("ADODB.Command")

conn.Provider = "ADSDSOObject"

conn.Open "ADs Provider"

Set cmd.ActiveConnection = conn

cmd.CommandText ="<LDAP://dc=ilmtest,dc=microsoft,dc=com>;" _

            & "(objectCategory=*);ADsPath,description;subtree"

Set rs = cmd.Execute

Do Until rs.EOF

Wscript.Echo rs.Fields(0).Value & “:” & rs.Fields(1).Value

rs.MoveNext

Loop

conn.Close

ADODB.Command クラス のCommandTextプロパティに接続文字列を設定し、検索実行は引数なしの Execute メソッドのみとなります。

ここまでを見ると、Executeメソッドの引数で指定するか、CommandText プロパティに指定するかの違いのみに見えますが、ADODB.Command クラスを使用することで、以下のようなプロパティの併用が可能となります。

< ADODB.Command提供プロパティ >

Asynchronous

CacheResults

Chase referrals

Column Names Only

Deref Aliases

Page size

SearchScope

Size Limit

Sort on

Time Limit

Timeout

< 参考資料 >

Searching with ActiveX Data Objects (ADO)

https://msdn.microsoft.com/en-us/library/aa746471(VS.85).aspx

このプロパティ中で使用頻度が高いものは、Page size、SearchScope などでしょう。

1000件以上の抽出を行う場合、1000件単位のレコード参照を行う意味合いでPage Size 設定を行います。また、 SearchScope で以下のような検索範囲の指定が可能です。

これを考慮した、改変を追加したものが以下内容となります。

< スクリプトサンプル : ADODB.Command 使用 - 2 >

Const ADS_SCOPE_BASE = 0

Const ADS_SCOPE_ONELEVEL = 1

Const ADS_SCOPE_SUBTREE = 2

Set conn = CreateObject("ADODB.Connection")

Set cmd = CreateObject("ADODB.Command")

conn.Provider = "ADSDSOObject"

conn.Open "ADs Provider"

Set cmd.ActiveConnection = conn

cmd. Properties("Page Size") = 1000

cmd. Properties("SearchScope") = ADS_SCOPE_SUBTREE

cmd.CommandText ="<LDAP://dc=ilmtest,dc=microsoft,dc=com>;" _

            & "(objectCategory=*);ADsPath,description"

Set rs = cmd.Execute

Do Until rs.EOF

Wscript.Echo rs.Fields(0).Value & “:” & rs.Fields(1).Value

rs.MoveNext

Loop

conn.Close

ここで、注意が必要なのは、ADODB.Command クラスのCommandTextプロパティを使用する場合は、Execute メソッドも ADODB.Command クラス(スクリプト中の変数 cmd)を対象に使用する点です。

以上、いかがでしたでしょうか、前回よりちょっとだけ細かい設定ができるようになりますね。
また、近い内に Active Directory 関連の話でお会いしましょう。

ダイエットにより、肉体年齢が実年齢 +3 まで下がった

~ お父さんより ~