【入門編】【Active Directory連携】ADsDSOObject (LDAPプロバイダ) を用いたドメインユーザー・グループ情報の高速抽出クエリ – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptでActive Directoryを「爆速」で叩く。ADsDSOObjectの極意

こんにちは。現場で泥臭い自動化を積み重ねてきたエンジニアの視点から、今日は「Active Directory(AD)管理」という、一見重厚なテーマをVBScriptでスマートに解決する方法を伝授します。

多くの初心者が、「ADのユーザー情報を抽出する」と聞くと、`GetObject(“LDAP://…”)` を使った再帰的なループ処理を想像します。しかし、何千人ものユーザーがいる組織でそれをやれば、スクリプトはタイムアウトし、ネットワークは悲鳴を上げます。

真のプロは、ADを「データベース」として扱い、SQLクエリで一括抽出します。 それを可能にするのが `ADsDSOObject` です。

1. なぜ「ADsDSOObject」なのか?

VBScriptでADを操作する際、最も強力な武器が「ADO (ActiveX Data Objects)」です。
ADはLDAPというプロトコルで動いていますが、これをSQLのように検索できるのが `ADsDSOObject` プロバイダです。

  • 高速性: サーバー側で検索が完結するため、クライアントへの転送量が最小限で済みます。
  • 柔軟性: `WHERE` 句を使って、「特定部署かつ期限切れ間近のアカウント」といった高度なフィルタリングが可能です。

2. 実践:AD高速抽出スクリプト

それでは、実際に「特定の部署の全ユーザー名」を抽出するスクリプトを見てみましょう。このコードを `GetADUsers.vbs` として保存してください。

‘ — AD高速抽出スクリプト —
Option Explicit

Dim conn, rs, cmd, query
Dim strBase, strFilter, strAttributes

‘ 1. ADO接続の準備
Set conn = CreateObject(“ADODB.Connection”)
Set cmd = CreateObject(“ADODB.Command”)
conn.Provider = “ADsDSOObject”
conn.Open “Active Directory Provider”
Set cmd.ActiveConnection = conn

‘ 2. 検索クエリの構築 (SQLライクな記述)
‘ 検索のベース(ドメインのルート)
strBase = “
‘ フィルタ:ユーザーのみ かつ 特定の部署
strFilter = “(&(objectCategory=person)(objectClass=user)(department=営業部))”
‘ 取得したい属性
strAttributes = “sAMAccountName,displayName,mail”

‘ クエリの合成
query = strBase & “;” & strFilter & “;” & strAttributes & “;subtree”
cmd.CommandText = query

‘ 3. 実行とパース
Set rs = cmd.Execute

WScript.Echo “— ユーザーリスト抽出開始 —”
Do Until rs.EOF
‘ 属性値にアクセス
WScript.Echo “ID: ” & rs.Fields(“sAMAccountName”).Value & _
” | 名前: ” & rs.Fields(“displayName”).Value
rs.MoveNext
Loop

‘ 4. 後片付け(リソース管理はエンジニアの嗜み)
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing

3. コードのポイントと陥りやすい罠

このコードを理解する上で、以下の3点だけは必ず押さえてください。

① `subtree` の意味

検索範囲を「現在の階層以下すべて」に指定しています。これが `base` だと対象のコンテナのみ、`onelevel` だと直下の階層のみになります。基本は `subtree` でOKです。

② なぜ `Option Explicit` を入れるのか?

VBScriptでは、変数を宣言せずに使うと自動的に「Variant型」が生成されます。これは非常に便利な反面、スペルミスがバグの温床になります。`Option Explicit` を先頭に書くことで、宣言忘れを防ぐ「型にはまった開発」が可能になります。

③ 権限と実行環境

このスクリプトは、実行するユーザーの権限でADにアクセスします。もし「アクセス拒否」が出る場合は、ドメイン管理者に問い合わせるか、自身の権限でアクセス可能な範囲を確認してください。

4. エンジニアとして「一歩先」へ行くために

このコードをマスターすれば、応用は無限大です。

  • 期限切れ間近のアカウント抽出:

`strFilter` を変更して `(pwdLastSet<=...` のような条件を付与すれば、パスワード変更期限が迫っているユーザーを一瞬でリストアップできます。

  • CSVへの書き出し:

`FileSystemObject` を組み合わせて、抽出した結果をCSVファイルとして保存すれば、そのままExcelでの管理資料に早変わりです。

最後に

VBScriptは古い言語だと言われることもありますが、Windows環境において、これほど「軽量・即席・強力」なツールは他にありません。

「マクロの記録」を卒業した今、あなたはもう、「ツールを使う人」から「ツールを作る人」へと進化しました。この `ADsDSOObject` を使いこなすことで、退屈な管理業務から解放され、よりクリエイティブな仕事に時間を割けるはずです。

何か詰まったら、いつでも戻ってきてください。また次のステップを一緒に考えましょう。