🔍
ADSIでメールアドレスからWindowsドメインユーザー情報を取得する方法
解法
PowerShellのADSI(Active Directory Service Interfaces)を使用して、メールアドレスからドメインユーザー情報を取得する方法を紹介します。この方法は追加のモジュールインストールが不要で、標準的なWindows環境で利用できます。
$email = "example@domain.com"
$root = [ADSI]"LDAP://RootDSE"
$domain = $root.defaultNamingContext
$search = [adsisearcher]"(&(objectClass=user)(mail=$email))"
$search.SearchRoot = "LDAP://$domain"
$user = $search.FindOne()
if ($user) {
$samAccountName = $user.Properties["samaccountname"][0]
$domainName = $env:USERDOMAIN
Write-Output "$domainName\$samAccountName"
}
解説
コードの詳細説明
-
LDAP接続の確立
$root = [ADSI]"LDAP://RootDSE" $domain = $root.defaultNamingContext
-
RootDSE
に接続し、現在のドメインのDNSを取得します - 追加の認証情報なしで現在のユーザーコンテキストを使用します
-
-
検索フィルターの設定
$search = [adsisearcher]"(&(objectClass=user)(mail=$email))"
-
objectClass=user
: ユーザーオブジェクトのみを検索 -
mail=$email
: 指定したメールアドレスに一致するものを検索
-
-
検索の実行と結果の取得
$search.SearchRoot = "LDAP://$domain" $user = $search.FindOne()
-
SearchRoot
で検索範囲を現在のドメインに限定 -
FindOne()
で最初に見つかった結果を取得
-
補足情報
メリット
- 追加モジュールのインストールが不要
- 標準的なWindows環境で動作
- 軽量で高速な実行
注意点
- 実行アカウントにActive Directory検索の権限が必要
- メールアドレスは一意である必要がある
- 大規模な環境では検索範囲を適切に設定する必要がある
よくあるエラーと対処方法
-
アクセス拒否エラー
- 原因:実行アカウントの権限不足
- 対処:適切な検索権限を付与する
-
ユーザーが見つからない
- 原因:メールアドレスの不一致やユーザーの無効化
- 対処:メールアドレスの正確性を確認
-
複数のユーザーが見つかる
- 原因:重複したメールアドレス
- 対処:
FindOne()
の代わりにFindAll()
を使用して全件取得
Discussion