PowerShellでユーザーの認証情報を確認するのは、特に特定のアクションを実行する前に認証情報を検証しようとすると、少々厄介です。無効なログインを早期に検出せずにスクリプトが先に進んでしまうと、処理が中断したり拒否されたりして非常に厄介です。秘訣は、機密性の高い操作を行う直前に、ユーザー名とパスワードが正しいかどうかを確認する方法を作成することです。こうすることで、即座にフィードバックが得られ、下流のエラーを回避できます。
Active Directory PowerShellモジュールに依存せずにPowerShellを使ってADの認証情報をテストする方法は、(ワークグループ内を含むあらゆるWindowsマシンで動作するため、メリットと考える人もいますが)一度コツをつかめば非常に簡単です。基本的な考え方は、DirectoryEntry指定されたユーザー名とパスワードでオブジェクトを作成してみることです。成功した場合(つまり、エラーが発生せず、有効な名前が返された場合)、認証情報はおそらく適切です。
PowerShell で Active Directory ユーザーの資格情報を確認する方法
方法1: DirectoryEntryを使用した基本的な資格情報の検証
このメソッドは、追加のモジュールを必要とせずに、ユーザー名とパスワードの組み合わせが現在のドメインに対して有効かどうかを確認するのに役立ちます。特にドメイン環境の場合など、簡単な検証だけが必要な場合に便利です。資格情報が正しい場合、スクリプトはTrue を返します。そうでない場合はFalse を返します。
一部の設定では、資格情報が無効な場合にエラーが発生する可能性があるため、try-catch でラップすることをお勧めしますが、簡単にするために、これが基本的な考え方です。
$creds = Get-Credential Function Test-ADCreds { param ($username, $password) try { return (New-Object DirectoryServices. DirectoryEntry "", $username, $password).psbase.name -ne $null } catch { return $false } } Test-ADCreds -username $creds. UserName -password $creds. GetNetworkCredential().Password
これを実行し、ドメインの資格情報を入力して、True が返されるかどうかを確認してください。返された場合は、資格情報が有効です。返されない場合は、ユーザー名/パスワードが間違っているか、アカウントがロック/無効化されているかのいずれかです。ちなみに、このスクリプトはActive Directoryモジュールに依存しておらず、ネイティブの. NETクラスのみを使用しているため、Active Directoryモジュールがインストールされていないマシンでも動作します。
方法2: 特定のドメインまたはLDAPサーバーに接続する
ドメインコントローラーやドメイン外のマシンを扱っている場合(または特定のLDAPサーバーで検証したい場合)、LDAP文字列を直接指定する必要があります。ここで少し奇妙な点があります。LDAPパスを自分のドメインまたはDCを指すように変更する必要があるのです。例:
(New-Object System. DirectoryServices. DirectoryEntry 'LDAP://DC=woshub, DC=loc', $username, $password).psbase.name -ne $null
または、IP 経由で接続する場合も同様です。
(New-Object System. DirectoryServices. DirectoryEntry 'LDAP://192.168.100.10', $username, $password).psbase.name -ne $null
これにより、異なるサーバー間やネットワーク設定の異なる環境でも資格情報を検証できます。ただし、ユーザーがProtected Usersグループに属している場合は、userPrincipalName(メールの形式)または を使用する必要があることに注意してくださいdomain\username。正しく設定するとKerberosが有効化され、場合によってはNTLMよりも安全で信頼性が高くなります。
もちろん、Windows は必要以上に物事を難しくする傾向がありますが、このアプローチを使用すると、多くの追加モジュールを導入することなく、資格情報をほぼ検証できます。