[ADSI プログラミング] VBScript: Directory からオブジェクトを探し出せ!- 1
こんにちは、ILM 一家のパパ(お父さん)です。
聞いてください!! 2週間で 3kg 減量しました。食事制限と、週 1回のスポーツジム通いだけで…
いままで、どんな不摂生だったか、わかろうというものです。
息子(ぴろとくん) も頑張っています。頑張れば、結果が出るということは嬉しいことですね。
また、わが ILM 一家のお隣さん、Multimedia(MM) チームのメンバー2名も、近日スポーツジムに一緒に通うことになっています。汗を流すって良いですね、お母さん(ういこさん)とも一緒したいです。
さて、前回、ADSI サービスプロバイダの種類と特徴をご紹介しました。その際に紹介させていただいた LDAP プロバイダ、OLE DB プロバイダを使用して、今回は、Directory サーバから任意の条件でオブジェクト抽出する方法についてご紹介したいと思います。
まず、本手法について、以下サポート技術情報があるのをご存知でしょうか。
このサポート技術情報のサンプルは、Visual Basic 6.0 を対象にしていますので、VBScript 対応に変更し、具体的なフィルタ方法と、LDAP プロバイダで参照した場合との動作の差異を見ていただきましょう。
< サポート技術情報 : 187529 >
ADO を使用して、 ADSI LDAP プロバイダ経由でオブジェクトにアクセスする方法
https://support.microsoft.com/kb/187529/ja
<VBScript対応への変更サンプル > (ダウンロードはこちら)
変更点:
VBScript は参照設定ができないため、オブジェクトインスタンス生成は実行時バインディング(CreateObject、GetObject)のみとなります。また、参照設定ができず、変数のデータ型は Variant のみとなるため、変数宣言を省略しています。While-Wend は Do until – Loop に変更します。
また、LDAP AdsPath は、‘,’(コンマ) 区切りに変更し、出力を Wscript.Echo に変更しています。
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 メソッドに、接続文字列を指定する手法で、この部分に検出先、検出条件と、結果セット(レコードセット) のフィールド(参照属性)を指定します。
この手法での接続文字列の構文は以下の通りです。
< 接続文字列 >
<LDAP://server/adsidn>;ldapfilter;attributescsv;scope
Server : ディレクトリをホストするサーバーの名前 (または IP アドレス) です。
コンマ区切りの相対識別名でホスト解決可能な場合、省略可能です。
adsidn : 名前空間のルートを左に置き "/" で区切られた、ADsPath 形式で表現
されたクエリの開始ポイントの DN (Distinguished Name) です。
名前空間のルートを右に置きコンマで区切られた相対識別名による
X.500 形式の属性名も使用できます。
ldapfilter : LDAP フィルタ文字列です
attributescsv:レコードセットの各行に返されるコンマ区切りの属性名の一覧です。
scope : base、onelevel、または subtree のいずれかを指定します。
< 変更例 : LDAP AdsPath( adsidn )>
サンプルでは、ilmtest.microsoft.com を検索ルートとして、下層を検索対象とします。
特定の、CN、OU下のみに絞込み対場合、以下のように変更すればよいわけです。
‘CN=Users 以下のみとする場合
Set rs = conn.Execute( _
"<LDAP://cn=Users,dc=ilmtest,dc=microsoft,dc=com>;" _
& "(objectCategory=*);ADsPath,description;subtree")
< 変更例 : 抽出条件 ( ldapfilter) >
サンプルでは、全ての objectCategory を取得するように ‘*’ (ワイルドカード) が設定されています。抽出条件には、属性名と属性情報を用いることが可能です。
User オブジェクトのみを抽出したいような場合、以下のように変更します。
‘Userオブジェクトのみを抽出する場合
Set rs = conn.Execute( _
"<LDAP://dc=ilmtest,dc=microsoft,dc=com>;" _
& "(objectCategory=User);ADsPath,description;subtree")
また、さらに、User オブジェクトの特定の名前で抽出するような場合は、次のような AND条件を負荷することが可能です。
‘Userオブジェクトで、cn に uiko が含まれるものを抽出する場合
Set rs = conn.Execute( _
"<LDAP://dc=ilmtest,dc=microsoft,dc=com>;" _
& "(&(objectCategory=User) (cn=uiko*));ADsPath,description;subtree")
< 変更例 : 参照属性 ( attributescsv) >
LDAP プロバイダで Directoryオブジェクトを参照する場合、全ての属性をクライアント側のプロパティキャッシュに一旦取り込みます。OLE DB プロバイダを使用する場合、抽出したいオブジェクト属性のみを、結果セット(レコードセット) の各レコードのフィールド値として取り込みます。サンプルでは、ADsPath,description の2つの属性のみをフィールド値として参照します。そのため、参照したい属性によって、フィールド構成を変更する必要があります。
‘参照フィールドをADsPath, description, distinguishedName とする場合
Set rs = conn.Execute( _
"<LDAP://dc=ilmtest,dc=microsoft,dc=com>;" _
& "(objectCategory=*);ADsPath,description,distinguishedName;subtree")
また、各フィールドは、指定順に 0 から始まる添字で指定する Fields() コレクションで参照します。そのため、今回追加した distinguishedName 属性は rs.Fields(2).Value で参照することなりますね。
抽出結果は結果セット(レコードセット)のコレクションとして扱い、EOF までループさせる事でレコード(オブジェクト)参照するスクリプト実装となります。
なお、抽出オブジェクトの全ての属性値を参照するような場合、全ての属性を接続文字列に指定したり、Fieldsコレクションでの参照は逆に面倒となります。この様な場合は、抽出オブジェクトから distinguishedName 属性のみを参照して、LDAP プロバイダで抽出オブジェクトのみに再接続し、オブジェクトの全属性を参照したほうが良いでしょう。
OLE DB プロバイダには、今回紹介した手法の他に、コマンド文字列を使った検索手法もありますので、また、お話しの機会があればご紹介したいと思います。
~ お父さんより ~