🔍

ADSIでメールアドレスからWindowsドメインユーザー情報を取得する方法

2024/10/25に公開

解法

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"
}

解説

コードの詳細説明

  1. LDAP接続の確立

    $root = [ADSI]"LDAP://RootDSE"
    $domain = $root.defaultNamingContext
    
    • RootDSEに接続し、現在のドメインのDNSを取得します
    • 追加の認証情報なしで現在のユーザーコンテキストを使用します
  2. 検索フィルターの設定

    $search = [adsisearcher]"(&(objectClass=user)(mail=$email))"
    
    • objectClass=user: ユーザーオブジェクトのみを検索
    • mail=$email: 指定したメールアドレスに一致するものを検索
  3. 検索の実行と結果の取得

    $search.SearchRoot = "LDAP://$domain"
    $user = $search.FindOne()
    
    • SearchRootで検索範囲を現在のドメインに限定
    • FindOne()で最初に見つかった結果を取得

補足情報

メリット

  • 追加モジュールのインストールが不要
  • 標準的なWindows環境で動作
  • 軽量で高速な実行

注意点

  • 実行アカウントにActive Directory検索の権限が必要
  • メールアドレスは一意である必要がある
  • 大規模な環境では検索範囲を適切に設定する必要がある

よくあるエラーと対処方法

  1. アクセス拒否エラー

    • 原因:実行アカウントの権限不足
    • 対処:適切な検索権限を付与する
  2. ユーザーが見つからない

    • 原因:メールアドレスの不一致やユーザーの無効化
    • 対処:メールアドレスの正確性を確認
  3. 複数のユーザーが見つかる

    • 原因:重複したメールアドレス
    • 対処:FindOne()の代わりにFindAll()を使用して全件取得

Discussion