PowerShell を使用して Active Directory 内の非アクティブなコンピューターとユーザーを識別する方法

Active Directory 内の非アクティブなアカウントの処理は、非常に一般的なタスクです。管理者は、ドメインを整理し、潜在的なセキュリティリスクを軽減し、AD データベースの過剰な負荷を防ぐために、使用されていないユーザーアカウントやコンピューターアカウントをクリーンアップする必要があることがよくあります。長期間ログインしていないアカウントを見つけるには? PowerShell が最適です。柔軟性が高く、多数のオブジェクトをバッチ処理できます。ただし、適切な属性やフィルターを取得するのは少し難しい場合があります。特に lastLogonTimestamp がリアルタイムではなく、レプリケーションに依存している場合はなおさらです。そのため、実際には非アクティブな古いアカウントを確実に特定する方法を見つけることが非常に重要です。

このガイドでは、PowerShell(およびいくつかの特定のコマンド)を使用して、非アクティブなユーザーアカウントとコンピューターアカウントを特定する方法について説明します。このガイドを最後まで読めば、定期的なクリーンアップや監査用のレポート生成、さらには不要になった古いアカウントの無効化や削除など、明確な方法を習得できます。最終ログオン時刻などの情報を含む古いアカウントのリストを取得でき、さらに徹底的なクリーンアップを自動化することも可能です。PowerShellやADモジュールを初めて使用する場合は、最初に一部の機能(RSATやActive Directoryモジュールなど)を有効にする必要がある場合があります。また、特定のWindows環境では、RSATを手動でインストールするか、簡単なコマンドを実行してすべてをロードする必要がある場合もあります。

Active Directory で非アクティブな(古い)コンピュータとユーザーを見つける方法

方法1: LastLogonTimeStampで非アクティブなコンピュータを見つける

これはおそらく、AD内の古いコンピュータを特定する最も一般的な方法です。LastLogonTimeStampはドメインコントローラー間で複製されますが、およそ1週間に1回程度です。リアルタイムではありませんが、大まかな情報を得るには十分です。重要なのは、LastLogonTimeStampの値を例えば180日前などの日付と比較し、その期間何が停止していたかを確認することです。

おそらく必要になるコマンドの一覧は次のとおりです。

$LastLogonDate = (Get-Date).AddDays(-180) Get-ADComputer -Properties LastLogonTimeStamp -Filter {LastLogonTimeStamp -lt $LastLogonDate} -SearchBase "OU=Computers, OU=Mun, DC=woshub, DC=com" | Sort-Object LastLogonTimeStamp | Format-Table Name, @{N='LastLogon'; E={[DateTime]::FromFileTime($_. LastLogonTimeStamp)}} -AutoSize

このコマンドは、指定されたOU内で半年以上ログインしていないコンピューターのリストを生成します。この出力が役に立つと思われる場合は、適切なフィルターを指定したGet-ADComputerを追加するだけで十分です。CSV形式でエクスポートしたり、これらのコンピューターをすぐに無効化したりすることも可能です。

Get-ADComputer...| Export-Csv C:\ps\inactive_computers.csv -NoTypeInformation

本当に積極的に行動したい場合は、次の方法でこれらのコンピューターを無効にすることもできます。

Get-ADComputer...| Disable-ADAccount

または、「Disabled Computers」OU などの場所に移動します。

Get-ADComputer...| Move-ADObject -TargetPath "OU=Disabled Computers, DC=woshub, DC=com"

時々、これらのコマンドを実行した後でも、アカウントがまだアクティブだったり、lastLogonTimestamp が少し古くなっているように見えることがあります。これは当然ですが、Windows は必要以上に困難にしているからです。

方法2: 非アクティブなユーザーアカウントを見つける

ユーザーについても同様です。LastLogonTimeStamp が役立ちます。半年間アクティブでないユーザーアカウントを一覧表示するコマンドを簡単に作成できます。

$LastLogonDate = (Get-Date).AddDays(-180) Get-ADUser -Properties LastLogonTimeStamp -Filter {LastLogonTimeStamp -lt $LastLogonDate} -SearchBase "OU=Users, OU=Mun, DC=woshub, DC=com" | Where-Object {$_. Enabled -eq $true} | Format-Table Name, @{N='LastLogon'; E={[DateTime]::FromFileTime($_. LastLogonTimeStamp)}} -AutoSize

繰り返しになりますが、古いアカウントを無効化したり、リストをエクスポートして確認したりすることも可能です。大胆な場合は、Disable-ADAccountまたはRemove-ADUser をパイプで渡すだけで済みます。

方法3:Search-ADAccountを使ってすべてをカバーする

これは本当に助かります。属性をいじったり手動でフィルタリングしたりする代わりに、Search-ADAccount は無効化、期限切れ、ロック、または非アクティブなオブジェクトを一度に検索できるオールインワンコマンドです。AD クリーンアップの万能ツールのようなものです。

たとえば、無効なユーザー アカウントを見つけるには、次のコマンドを実行します。

Search-ADAccount -UsersOnly -AccountDisabled

特定の OU に絞り込みたい場合は、次のようにします。

Search-ADAccount -UsersOnly -AccountDisabled -SearchBase "OU=Admins, OU=Accounts, DC=woshub, DC=com"

より多くのデータを管理しやすい形式で表示するには、それを Format-Table にパイプします。

Search-ADAccount -UsersOnly -AccountDisabled -SearchBase "OU=Admins, OU=Accounts, DC=woshub, DC=com" | Format-Table Name, LastLogonDate, Enabled -AutoSize

このコマンドレットは、ロックアウトされたアカウントや一定期間非アクティブなアカウントの検索もサポートしており、本格的なクリーンアップやセキュリティ監査の際に非常に役立ちます。

フィルターや検索ベースの指定など、多少の調整が必要になる場合もありますが、Search-ADAccount は、すべての属性を手動で操作したくない AD プロフェッショナルにとって、操作をシンプルにしてくれます。設定によっては完璧なリアルタイム結果が得られない場合もありますが、十分な情報に基づいた意思決定を行うには十分です。

まとめ

  • 未使用のマシンを見つけるには、 LastLogonTimeStampGet-ADComputerと一緒に使用します。
  • 古いユーザー アカウントにはLastLogonTimeStampGet-ADUserを活用します。
  • Search-ADAccountAD オブジェクトのより包括的なスキャンを試みてください。
  • Disable-ADAccountまたはRemove-ADUserを使用して、アカウントの無効化または削除をアクティブ化します。

まとめ

全体的に見て、非アクティブなアカウントを見つけるのはそれほど難しいことではありませんが、PowerShellとAD属性に関する知識は多少必要です。これらのチェックを定期的に実行していれば、不要なオブジェクトがすぐに見つかり、安全に無効化または削除できるようになります。ただし、lastLogonTimestampは完璧な値ではなく、あくまでも概算値であるため、正当なアカウントが実際には非アクティブと表示される場合や、その逆の場合があることに注意してください。とはいえ、これらの方法はほとんどのクリーンアップ作業には十分です。この方法が、一見大変な作業が管理しやすいものになることを願っています。