3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援→開発戻り浦島太郎状態の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。

(.Net,ADSI)Active Directory LastLogonTimestampを現在の時刻に変換

ActiveDirectoryからADSIを使って LastLogon , LastLogonTimestamp を取るときの注意点ですが、これらの値は 1601/01/01 00:00:00からのミリ秒を64ビットの値として持っているようです。

(WindowsAPIのFILETIME 構造体がこのような仕様みたいです。ちなみにUnix時間は1970/01/01 00:00:00から32bitでカウントしてましたね。)

その FLETIME 構造体形式の値を .Net の DateTime に変換するのは下記のように書けばいいようです。(C#)

//.Net 3.5以降

//1601/01/01からミリ秒をDateTimeに変換

Int64 lastLogonTimestamp = (Int64)sResult.Properties["lastLogon"][0];

DateTime baseDateTime = new DateTime(1601,01,01);

usr.dmLastLogon = TimeZoneInfo.ConvertTimeFromUtc(

baseDateTime.AddTicks(lastLogonTimestamp), TimeZoneInfo.Local);

参考:

Active Directory lastLogonTimestampを現在の時刻に変換