Active Directory ユーザーの最終ログオン日時を調べる

概要


Active Directoryで使用されているLDAPデータベースには、ユーザーの最終ログオン日時が記録されています。最終ログオン日時を調べる目的としては、以下のようなものが考えられます。

  • セキュリティの向上
    定期的なログオンがない場合は、ユーザーアカウントが不要になっている可能性があります。無効化または削除することでセキュリティを強化できます。

  • 監査目的
    組織のセキュリティ規定などにより、ユーザーアカウントの最終ログオン日時を報告する場合などに活用できます。

本稿では、最終ログオン日時が記録されているLDAP属性や、最終ログオン日時の調べる方などを記載します。




最終ログオン日時が記録されているLDAP属性

最終ログオン日時が記録されるLDAP属性は、以下になります。

属性 説明
lastLogon 最終ログオン時刻がNTタイムエポック値で記録される(*1)。
Active Directory複製対象外。
認証要求を処理したドメインコントローラーにのみ記録される。
lastLogonTimestamp 最終ログオン時刻がNTタイムエポック値で記録される(*1)。
Active Directory複製対象。
ログオンが完了した日時より、9 - 14日以上前の日時がlastLogonTimestamp にセットされていた場合に更新される。
lastLogonDate lastLogonTimestampに記録されたNTタイムエポック値を、標準形式にした時刻。
msDS-LastSuccessfulInteractiveLogonTime 最終ログオン時刻がNTタイムエポック値で記録される(*1)。
Active Directory複製対象。
グループポリシーで設定する必要あり。

*1 Active Directory管理センターなどでは標準形式、PowerShellなどのコマンドツールではNTタイムエポック値で表示される。


msDS-LastSuccessfulInteractiveLogonTime属性の有効化

前述したように、msDS-LastSuccessfulInteractiveLogonTime属性を利用するには、グループポリシーを設定しドメインコントローラーに適用する必要があります。

設定方法
  1. [グループ ポリシーの管理]ツールを開く
  2. [コンピューターの構成] -> [ポリシー] -> [システム] -> [KDC] にある、[以前のログオンに関する情報をクライアント コンピューターに提供する] を 有効 にする
グループ ポリシー
3. 作成したグループポリシーオブジェクトを、ドメインコントローラーに適用する


管理ツールで確認する

管理ツールで確認する場合、[Active Directory管理センター]及び[ActiveDirectory ユーザーとコンピューター]ツールを使用します。 ユーザーアカウントの属性エディタータブで、各属性を確認することができます。
* 画像はActive Directory管理センター

lastLogon / lastLogonTimestamp 属性

lastLogon属性とlastLogonTimestamp属性の日時にズレが生じています。lastLogonTimestamp属性が更新されなかったためです。

msDS-LastSuccessfulInteractiveLogonTime 属性

msDS-LastSuccessfulInteractiveLogonTime属性に、ログオン日時が記録されています。グループポリシーが未設定、ログオンが一度も行われていない場合は<未設定>と表示されます。


PowerShellで確認する

lastLogon属性の場合

lastLogon属性で確認する場合、先述した通り、認証要求を処理したドメインコントローラーにのみログオン日時が記録されます。 そのため、最終ログオン日時を正確に知りたい場合、各々のドメインコントローラーを指定してPowerShellコマンドレットを実行する必要があります。 また、NTタイムエポック値で表示されるため、直感的には分かりづらいです。

1Get-ADUser <username> -Properties * -Server <servername> | Select-Object lastLogon


試しに、各々のドメインコントローラーを指定してPowerShellコマンドレットを実行してみます。
 1Get-ADUser administrator -Properties * -Server dc01 | Select-Object lastLogon
 2
 3         lastLogon
 4         ---------
 5133266894849485033
 6
 7
 8Get-ADUser administrator -Properties * -Server dc02 | Select-Object lastLogon
 9
10         lastLogon
11         ---------
12133266896009889700

異なった結果が返ってきました。属性が複製されず、認証要求を処理したドメインコントローラーにのみログオン日時が記録されている証拠です。


lastLogonTimestamp属性の場合

lastLogonTimestamp属性で確認する場合、先述した通り、ログオンが完了した日時より、9 - 14日以上前の日時がlastLogonTimestamp にセットされていた場合に更新されます。 そのため、最終ログオン日時を正確に知りたい場合には不向きです。 アカウントが使用されていない、ログオン日時が1ヶ月以上前であることが明らか、など特定の条件下では有用な属性です。 こちらもNTタイムエポック値で表示されるため、直感的には分かりづらいです。

1Get-ADUser <username> -Properties * | Select-Object lastLogonTimestamp

lastLogonDate属性の場合

lastLogonDate属性で確認する場合、lastLogonTimestamp属性を記録されている日時を標準形式で出力されます。

1Get-ADUser <username> -Properties * | Select-Object lastLogonDate

特定日以前にログオンしたユーザーアカウントを一括出力するには、以下のコマンドレットを実行します。

1Get-ADUser -Filter * -Properties lastLogonDate `
2 | Where-Object { $_.lastLogonDate -lt "yyyy/mm/dd" } `
3 | Select-Object SamAccountName

msDS-LastSuccessfulInteractiveLogonTime属性の場合

msDS-LastSuccessfulInteractiveLogonTime属性で確認する場合、lastLogon属性のように各々のドメインコントローラーに問い合わせを行わずに、正確な最終ログオン日時を知ることができます。 こちらもNTタイムエポック値で表示されるため、直感的には分かりづらいです。

1Get-ADUser <username> -Properties * | Select-Object msDS-LastSuccessfulInteractiveLogonTime

NTタイムエポック値を標準形式に変換する

NTタイムエポック値を変換する方法は多数ありますが、PowerShellでの変換例を記載します。

1$epoch = Get-ADUser <username> -Properties * | Select-Object msDS-LastSuccessfulInteractiveLogonTime
2$epoch -match '\d+' # $epoch変数に格納されている数字のみを抽出
3[datetime]::FromFileTime($Matches[0]) # NTタイムエポック値を変換

参考


翻訳: