ActiveDirectory( 以下ADと略記)のユーザーアカウントやコンピュータアカウントは、登録はするものの、まめに無効化や削除をしないためゴミがたまりがちである。
そこで、長期間ログインしていないPCやユーザーがどれくらいあるか調べてみよう、ということになって、何か良い方法はないかとググってみた。
結論から書くと、
ADへの最終ログイン時間の調査には lastLogonTimestamp という属性を調べる。
この属性を調べるには以下のようなVBScriptを使えば良い。
'------------------------------------------------------------
Set objUser = GetObject("LDAP://cn=Ken Myer, ou=Finance, dc=fabrikam, dc=com")
Set objLastLogon = objUser.Get("lastLogonTimestamp")
intLastLogonTime = objLastLogon.HighPart * (2^32) + objLastLogon.LowPart
intLastLogonTime = intLastLogonTime / (60 * 10000000)
intLastLogonTime = intLastLogonTime / 1440
Wscript.Echo "Last logon time + 9h: " & DateAdd("h", 9, intLastLogonTime + #1/1/1601#)
'------------------------------------------------------------
なお、ADSIEditや csvde.exe などで lastLogonTimestampをシリアル値で入手した場合は、w32tm.exe で変換もできる。
<例>
w32tm.exe/ntte 128271382742968750
148462 05:57:54.2968750 - 2007 年 6 月 24 日 8時 57分: 54 午前 (現地時間)
以下、判ったことをメモ代わりに列挙。
- 最後のログオン日時を示す項目としてlastLogonTimestamp とlastLogonの2種類がある。前者はドメインコントローラ間で同期されるが、後者はされない(つまり、後者はログオンしたドメインコントローラだけで保持される値である)
- net user コマンドの実行結果にも「最終ログイン」という表示があるが、これは、lastLogon属性を表示しているため、ドメインコントローラにより結果が異なる。
- lastLogonTimestamp は Windows Server 2003 から導入された属性である。
- lastLogonTimestamp は 1601年1月1日間からのナノ秒単位のシリアル値が格納された値である。しかも時刻はUTCなので、年-月-日に変換したあと +9時間すると日本時間の表示になる。
- このシリアル値はExcelの関数(DateValue()など)では変換できない。(Excelの日付シリアル値は1900年からの計算になっているため)
それにしても、「最終ログイン日時の取得」という単純なテーマなのに、意外に大変だなぁ・・・。
では、今日はこのへんで。