[ADSI] Exchangeメールボックスを持つ「ユーザー」「グループ」に付与されている "すべての" SMTP アドレスをゲットだぜ!
皆様こんにちは。今日はとっても寒いですね。
3 ヶ月前にポルトガルのエンジニアから「同僚の誕生日に日本で売っている掃除機マウスをプレゼントしたいのだが、贈って欲しい」と頼まれたのですが、昨日やっと届いたというメールがきました。なんつー遅さ!!税関おそっ。当然、彼女の誕生日なんてとっくに終わってたのですが、ポルトガル税関のせいですがなぜか日本人らしく謝ったところ「A few weeks ago we had some remodeling here, and the office was really dusty it would have been great timing!」とのことでした。まあ結果オーライ?楽しそうなパーティの写真が来てよかったよかった。
USB 掃除マウスが気になる方は、Live Search で “USB掃除マウス” でレッツ検索!
さてそんな私が行ったこともないポルトガルに海を渡って行ってしまった掃除機マウスを横目で見ながら今日はネタを考えていて、過去に対応したものから引っ張ってきて見ました。
今日のお題 :
「 Exchangeメールボックスを持つ「ユーザー」「グループ」に付与されている全ての SMTPアドレスをゲットだぜ!」
「LDIFDEコマンドを利用してアドレス情報をエクスポートすることはできたのですが、
ADSIを利用したスクリプト(VBScript)でもアドレス情報を抽出したいと思います。
SMTPアドレスを2つ以上設定してあるユーザーが存在します。
こういったケースで、すべてのSMTPアドレスを抽出する方法はありますか?」
… Yes。XXクリニック!
(1) ADSI を使用した情報取得方法について
SMTPアドレスの取得は、ユーザ /グループオブジェクトの Mail アトリビュートによ
り取得いただけます。まず、列挙したい情報の上位オブジェクトを取得し、子オブ
ジェクトを For Each ... In .... 構文で列挙します。その上で、子オブジェクト
の Mail プロパティを参照する事で、情報採取いただけます。
(2) プライマリ以外の SMTP アドレスの取得について
プライマリ以外の SMTP アドレスの取得は、ユーザ / グループオブジェクトの
proxyAddresses アトリビュートから取得する必要がございます。この属性は複数の
値を保持するコレクションオブジェクトであるため、さらに For Each ... In ...
構文で列挙されるアドレスから SMTPアドレスのみを抽出するコーディング実装によ
り実現いただきます。
これを踏まえるとこんなコードになります。以下をコピーして、拡張子 *.vbs で保存して実行してくださいです。
'----------------------------------------------------------
'ユーザ/グループ情報を持つ上位のCN/OU のオブジェクトを取得
'実際にご利用のDC、CN/OU を指定下さい
Set objDs = GetObject("LDAP://cn=users,dc=microsoft,dc=com")
'CN/OU 内のメンバ情報(子オブジェクト)を列挙
For Each objUser In objDs
'アカウント名取得
accName = objUser.samAccountName
'SMTP アドレスを取得
accMail = objUser.Mail
'アドレスの格納されているユーザを識別
If accMail <> "" Then
'プライマリSMTP アドレスを出力
wscript.echo accName & " : " & accMail
'プライマリ以外のアドレス情報を列挙
For Each objAddr In objUser.proxyAddresses
'smtp: で始まるアドレス値を識別
if left(objAddr,5) = "smtp:" then
'smtp:以降の文字を抽出
accMail2 = mid(objAddr, 6)
'プライマリ以外のSMTPアドレスを出力
wscript.echo accName & " :: " & accMail2
End if
Next
End If
Next
'----------------------------------------------------------
※ もし、要件にファイル出力を伴う場合、ADSI、VBScript 言語機能には
ファイル出力機能は含まれないため、その際は VBScript から FSO (File System
Object) を使用する等のコーディング実装が別途必要となります。
***
それでは皆様、嘔吐下痢がチーム全体に蔓延したのが「ういちゅ菌」呼ばわりされて甚だ不本意ですが、体調管理にはますますお気をつけくださいますよう。
~ ういこう@戻してもなんでも残さず根性で!~