PowerShell で Active Directory アカウントのロックアウトを解決する方法

ロックされた Active Directory アカウントを追跡して解決するにはどうすればよいですか? 何が行われるのか、特定のイベントを見つける方法、およびイベントを解析する方法を確認します。

Active Directory (AD) は素晴らしいサービスです。 ネットワーク上のどこからでも、同じユーザー名とパスワードを使ってログオンできます。 リモート デスクトップ セッションを閉じるのを忘れたり、ワームがネットワークに広がったり、自分のユーザー アカウントでスケジュール タスクを実行しているのを忘れたりするまでは、これ以上ないほど簡単です。 まあ、言いたいことはわかるだろう。 ADは非常に便利な製品であり、これが導入率が高い理由でもある。 問題は、何の理由もなくアカウントがロックアウトされるようになった場合です。

AD アカウント ロックアウト ポリシー

多くの組織がアカウント ロックアウト ポリシーを持っています (あるいは持つべきです)。 このポリシーは、権限のない第三者が継続的にパスワードを推測しようとしたり、ブルートフォースでパスワードを取得したりすることを防ぐためのセキュリティ対策です。 アカウントロックアウト・ポリシーは、Active Directoryでは一般的なもので、セキュリティ上の大きな問題に対処するためのシンプルなアプローチで構成されています。 間違ったパスワードを一定回数試行すると、管理者が手動で再び有効にするまで、そのアカウントは使用できなくなる。

状況によっては、特にパスワードが変更されると、明白な理由もなく、アカウントが突然一貫してロックアウトされ始めることがあります。 ユーザーはヘルプ デスクを呼び出し、ヘルプ デスクはアカウントを再度有効にし、少し後に再びアカウントがロックアウトされます。 これは、ユーザーとヘルプデスクの両方にとってフラストレーションのたまる経験です。 ロックアウトの原因が不明なために、問題が悪化することもあります。 どこかで、何らかの形で、人、スクリプト、またはプロセスが、同じ間違ったパスワードを何度も何度も試し続けているのですが、誰もその場所を知らないのです。 1 つの方法は、PowerShell スクリプトを使用することです。

Resolving A Locked AD Account

Windows Server 2008 以降の環境では、クライアント システム、クライアント システムのドメイン コントローラー、およびプライマリドメインコントローラー (PDC) エミュレーターの役割を持つドメインコントローラーの間で短いやり取りが行われています。 これは次のように発生します。

  1. ユーザーアカウントの認証が試みられるたびに、資格情報はクライアントシステムのサブネットの適切なドメインコントローラーに送信されます。
  2. パスワードが間違っている場合、クライアントシステムのドメインコントローラーは、PDCエミュレーターの役割を持つドメインコントローラーに要求を転送する。 これは、クライアントシステムのドメインコントローラーが最新のパスワードを持っていない可能性があり、Active Directoryの設計機能として、PDCエミュレーターの役割を保持するドメインコントローラーが常に持っているためである。
  3. PDCエミュレーターはパスワードを再試行し、まだ間違っていることがわかった場合、PDCエミュレーターはユーザーアカウントのbadPwdCount属性を増加させます。
  4. イベントID 4740は、元の要求を開始したクライアントシステムIPアドレスとユーザーアカウントのPDCエミュレーターで生成されます。
  5. その後、PDCエミュレーターはクライアントシステムのドメインコントローラーに、パスワードが実際に間違っていることを通知します。

ソースを見つけるのに最も良い場所はどこでしょうか。 答えはPDCエミュレーターにある。 その理由は、すべてのアカウントロックアウトがセキュリティイベントログにそこに記録されるからです。 PDC エミュレーターは、すべてのアカウント ロックアウト イベントについて照会できる中心的な場所です。

Using PowerShell To Track Down The Source Of AD Account Lockouts

PDC エミュレーターを照会するために、PowerShell の Get-WinEvent コマンドレットを使用しましょう。 これは、サーバー上の1つまたは複数のイベントログを素早く解析するための非常に便利なコマンドレットです。 ここでは、4740というイベントIDを探します。 最初に、PDCエミュレーターの役割を保持しているドメインコントローラーを見つける必要があります。 これを行う 1 つの方法は、Get-AdDomain コマンドレットを使用することです。

PDC エミュレーターがわかったら、あとはイベント ID 4740 についてそのセキュリティ イベント ログをクエリすればよいだけです。

PDCエミュレーターを入手したので、PowerShellスクリプトでそのセキュリティログを照会してみましょう。

## ロックアウトされているユーザー名を定義します
$Username = ‘abertram’
## ドメインコントローラーPDCeロールを見つけます
$Pdce = (Get-AdDomain).PDCEmulator
## Get-WinEvent に渡すパラメータを構築する
$GweParams = @{
‘Computername’ = $Pdce
‘LogName’ = ‘Security’
‘FilterXPath’ = “* and EventData=’$Username’]”}
## セキュリティイベントログを照会
$Events = Get-
$Event = Get-
## セキュリティイベントログを照会するには、次のようにします。WinEvent @GweParams

これにより、ロックアウトイベントが得られます。

しかし、まだ発信元のクライアントシステムはわかっていないのです。 それを得るには、もう少し深く掘り下げる必要があります。 実際のユーザー名は、各イベントの Properties 値の中に埋もれています。 各イベントでユーザー名を見つけるには、次の行を使用します。

$Events.Properties.Value

これは、最初のイベントと Properties 値の最初のインスタンスでユーザー名を見つけるものです。 幸運にも、クライアント システムは Properties の 2 番目のインスタンスにあります。

$Events.Properties.Value

クライアント システム名がある場所がわかれば、あとはループに挿入するだけで、犯人を見つけることができました。

これで、次にヘルプ デスクからロックアウトされ続ける AD ユーザー アカウントについて問い合わせがあったとき、武装して対応する準備が整いました。

コメントを残す

メールアドレスが公開されることはありません。