一定期間ログオンしていないADユーザーやコンピューターをリストアップする方法
本エントリーの目次
不要なADユーザーアカウントやコンピューターアカウントをリストアップしたい!
WindowsのActive Directoryを長期間運用していると、多数のユーザーアカウントやコンピューターアカウントが追加されているはずです。
そしてそれらADアカウントの中には、アカウントを作りはしたものの、半年や1年などの長い期間使用されていないアカウントもあるでしょう。
場合によっては、一度も使用(ログオン)していないアカウントもあるかもしれません。
こういった不要なアカウントをリストアップ(一覧を取得)し、削除したり無効化するなどの対応を行いたい!
というケースは少なくないでしょう。
そこで今回は、一定期間ログオンしていない(不要と思われる)ADのユーザーアカウントやコンピューターアカウントをリストアップする方法をご紹介します!
また併せて、ユーザーアカウントやコンピューターアカウントを無効化したり、削除する方法についても紹介していますので、ぜひ参考になさってください!
一定期間ログオンしていないADユーザーやコンピューターの一覧を取得する方法
一定期間ログオンしていないADユーザーアカウントやコンピューターアカウントをリストアップ(一覧を取得)する方法は、いくつか考えられます。
その中でも特におすすめしたいのが、PowerShellの『Search-ADAccount』コマンドレットを使う方法です。
『Search-ADAccount』コマンドレットには、一定期間ログオンしていないアカウントを取得する機能が用意されているため、簡単に一覧を取得できます。
直近30日以内にログオンしていないアカウントの一覧を、『Search-ADAccount』コマンドレットを使って取得するケースでは、『-TimeSpan』パラメーターを使って以下のようなコマンドを実行してください。
1 | Search-ADAccount -AccountInactive -TimeSpan 30.00:00:00 |
また『-DateTime』パラメーターを使うことで、以下のように特定の日付以後にログインしていないアカウントを取得することも可能です。
1 2 3 4 5 | #2020年1月12日以後にログオンしていないアカウントを取得する Search-ADAccount -AccountInactive -DateTime "1/12/2020" #2020年1月12日午前8時以後にログオンしていないアカウントを取得する Search-ADAccount -AccountInactive -DateTime "1/12/2020 8:00:00 AM" |
『Search-ADAccount』コマンドレットを実行すると、以下のような結果を取得できます。
1 2 3 4 5 6 7 8 9 | AccountExpirationDate : DistinguishedName : CN=AZUREADSSOACC,CN=Computers,DC=XXXX,DC=YYYY Enabled : True LastLogonDate : LockedOut : False Name : AZUREADSSOACC ObjectClass : computer 以下省略 … |
実行結果の『Name』にアカウント名が、そして『LastLogonDate』に最終ログオン時間が格納されています。
※上記実行例の『AZUREADSSOACC』は、Azure AD Connectでシームレス シングル サインオン(シームレス SSO)を有効化した際に、オンプレADに作成される特殊なコンピューターアカウントです。
ユーザーアカウントの一覧とコンピューターアカウントの一覧を個別に取得する方法
『Search-ADAccount -AccountInactive』構文を使ったコマンドでは、特に設定をしていない場合には、条件に該当するADユーザーアカウントと、ADコンピューターアカウントの両方が取得されます。
ADユーザーアカウントだけを取得したい場合には、『-UsersOnly』パラメーターを。
そしてADコンピューターアカウントだけを取得したい場合には、『-ComputersOnly』パラメーターを併用してください。
直近30日以内にログオンしていないユーザーアカウントや、コンピューターアカウントのみを取得する場合のコマンド例:
1 2 3 4 5 | #直近30日以内にログオンしていないユーザーアカウントを取得する Search-ADAccount -AccountInactive -TimeSpan 30.00:00:00 -UsersOnly #直近30日以内にログオンしていないコンピューターアカウントを取得する Search-ADAccount -AccountInactive -TimeSpan 30.00:00:00 -ComputersOnly |
有効なアカウントに限定して取得するなど、その他のコマンド例について
直近30日以内にログオンしていないアカウントを『Search-ADAccount』コマンドレットを使って取得した場合、有効なアカウントと無効なアカウントの両方が取得されます。
このうち、無効なアカウントについては除き、有効なコンピューターアカウントのみを取得したい場合には、以下のようなコマンドを実行してください。
1 | Search-ADAccount -AccountInactive -TimeSpan 30.00:00:00 -ComputersOnly | Where-Object {$_.Enabled -eq $true} |
何らかの理由により、アカウントを無効化している場合には、そのアカウントでのログインはできません。
そのため無効なアカウントについては、直近にログオンしていないとしても、おかしいことではないはずです。
したがって、一定期間ログオンしていないアカウントを列挙する際、有効なアカウントに限定して取得したい!
というケースは少なくないでしょう。
また『Search-ADAccount』コマンドレットの実行結果には、多数の情報が含まれています。
このうち一部の情報だけを取得したいといったケースでは、『Select-Object』コマンドを併用します。
以下コマンドでは、直近30日以内にログオンしていない有効状態のコンピューターアカウントについて、『Name』と『LastLogonDate』、『DistinguishedName』※の情報だけを取得しています。
1 | Search-ADAccount -AccountInactive -TimeSpan 30.00:00:00 -ComputersOnly | Where-Object {$_.Enabled -eq $true} | Select-Object Name,LastLogonDate,DistinguishedName |
※『DistinguishedName』は、後述の不要なアカウントを無効化したり、削除する方法で使用します。
さらに、実行結果を『LastLogonDate』の降順、『Name』の昇順で並び替えて取得したいときには、併せて『Sort-Object』コマンドを併用してください。
1 | Search-ADAccount -AccountInactive -TimeSpan 30.00:00:00 -ComputersOnly | Where-Object {$_.Enabled -eq $true} | Select-Object Name,LastLogonDate,DistinguishedName | Sort-Object @{Expression = "LastLogonDate";Descending = $true}, @{Expression="Name";Ascending = $true} |
一覧をファイル出力する方法
『Search-ADAccount』コマンドレットの実行結果を用いて何らかの対処を手動で行う場合には、実行結果をファイル出力しておくと便利です。
実行結果のうち『Name』と『LastLogonDate』、『DistinguishedName』の情報だけを、『C:\test\InactiveADComputers.csv』というパスにファイル出力する場合には、以下のようなコマンドを実行してください。
1 2 | $InactiveADComputers = Search-ADAccount -AccountInactive -TimeSpan 30.00:00:00 -ComputersOnly | Where-Object {$_.Enabled -eq $true} $InactiveADComputers | Select-Object Name, LastLogonDate, DistinguishedName | Export-Csv -Path "C:\test\InactiveADComputers.csv" -Encoding UTF8 -NoTypeInformation -Force |
不要なアカウントを無効化したり、削除する方法
一定期間ログオンしておらず不要と思われるアカウントについて、いきなり削除するのではなく無効化しておきたい!
というケースも考えられます。
ADアカウントの無効化は、『Disable-ADAccount』コマンドレットにより対応できます。
たとえば、直近30日以内にログオンしておらず有効状態のコンピューターアカウントを、すべて無効化したい場合には、以下のようなコマンドを実行してください。
1 2 3 4 5 6 | $InactiveADComputers = Search-ADAccount -AccountInactive -TimeSpan 30.00:00:00 -ComputersOnly | Where-Object {$_.Enabled -eq $true} foreach($Computer in $InactiveADComputers){ Disable-ADAccount -Identity $Computer.DistinguishedName Write-Host ("コンピューターアカウント:" + $Computer.Name + "を無効化しました。") } |
尚、『Disable-ADAccount』コマンドレットは、コンピューターアカウントだけではなく、ユーザーアカウントも無効化できます。
したがってユーザーアカウントを無効化したいときは、『Search-ADAccount』コマンドレットで対象のユーザーを取得。
そしてそのリストのアカウントに対して、『Disable-ADAccount』コマンドレットを使用すると良いでしょう。
またアカウントの削除については、『Remove-ADUser』と『Remove-ADComputer』を使用して以下のような構文のコマンドを実行します。
1 2 3 4 5 | #DistinguishedNameで指定したユーザーを削除する Remove-ADUser -Identity <DistinguishedName> #DistinguishedNameで指定したコンピューターを削除する Remove-ADComputer -Identity <DistinguishedName> |
『DistinguishedName』は『Search-ADAccount』コマンドレットで取得可能です。
『LastLogonDate』との15日程度のズレについて
『Search-ADAccount』コマンドレットと、『-TimeSpan』や『-DateTime』パラメーターを使って一定期間ログオンしていないADアカウントを取得する際、一般的に想定されるであろう挙動とは異なる動作を確認しています。
たとえば手元のテスト環境では、以下のような現象を確認しています。
あるアカウントの『LastLogonDate』が、コマンド実行日の549日前の日付であった。
事前の想定では、『-TimeSpan 545.00:00:00』パラメーターを使い、直近545日の間ログインされていないアカウントを取得することで、リストアップされると考えていた。
しかしこれではリストアップされず、直近533日の間ログインされていないアカウントを取得するようなコマンドを、『-TimeSpan』や『-DateTime』パラメーターを併用して実行したところ、リストアップされた。
日付と時間の関係から日数指定では、想定との15~16日程度のズレが起こるようです。
『Search-ADAccount』コマンドレットの詳細な動作仕様について、Microsoftさんの公開資料などでは見つけることができませんでした。
そのため本件について、はっきりとしたことは言えず、私の推測となってしまいますが、『-TimeSpan』や『-DateTime』パラメーターを使って一定期間ログオンしていないADアカウントを取得する際、おそらくは『LastLogonDate』の値を使っていると思われます。
そして『LastLogonDate』は、ADの『lastLogonTimestamp』属性と同様の値であることから、この値を使用しているようです。
ADの『lastLogonTimestamp』属性は、以下資料に記載されているとおり、最大で14日間の更新遅延が発生することが知られています。
通常の Active Directory の複製スケジュールとは異なり、( 14 日 – ( 0 ~ 5 日のランダム値) = 9 ~ 14 日 ) 最大 14 日間の更新遅延があります。
The initial update after the raise of the domain functional level is calculated as 14 days minus random percentage of 5 days.
この『最大 14 日間の更新遅延』と日付や時間処理などの関係により、想定との15~16日程度のズレが起こるのではないか、と思われます。
またMicrosoftさんの公開資料では、以下のようにも記載されています。
lastLogonTimeStamp はリアルタイムに更新されるものではないため、最新の最終ログオン時刻を知ることは出来ませんでした。
ただし、使用されていないユーザーを探す目的であれば、この機能で十分ですよね。
この記載と同様に、『Search-ADAccount』コマンドレットを使って使用されていないアカウントを探す目的であれば、想定との15~16日程度のズレは実用上大きな問題とはならないと考えられます。
またこのズレを考慮する場合には、指定日数から15程度引いた値を使用すると良いのかもしれません。
(たとえば直近90日以内にログオンされていないアカウントの一覧を取得したい場合には、『-TimeSpan 75.00:00:00』を指定する。)
以上、参考になさってくださーい!