UserPrincipal.LastPasswordSet は UTC (世界協定時) を返す (ActiveDirectory)

こんにちは、イギリスに住みたいけんけんです。今回は ActiveDirectory ネタです。

UserPrincipal と LastPasswordSet

System.DirectoryServices.AccountManagement 名前空間にあるクラス群は .NET からの ActiveDirectory 管理をちょっとだけ楽にしてくれます。

おそらく一番よく使うのは ActiveDirectory のユーザーオブジェクトに相当する UserPrincipal クラスでしょう。

パスワードの設定も SetPassword メソッドでできて便利です。

あと、パスワードの管理をしていると 最後にパスワードが変更された日時 を参照したいときがあります。たとえば前回の変更から一定期間を過ぎていたらアラートを出す、なんかはよくありそうですね。

そんなときには UserPrincipal.LastPasswordSet を使います。

ユーザーが前回パスワードを変更した日時 (AD の属性でいうと pwdLastSet 属性) を Nullable 型 (DateTime? 型) で返してくれます。

Null 許容型とタイムゾーンに注意

そもそも pwdLastSet はパスワードが変更されていないと “未設定” な項目なので、 LastPasswordSet プロパティは Null 許容型の DateTime を返すようになっています。

ということで、使用するときは HasValue プロパティで値があるかどうかをチェックした上で、 Value プロパティで本来の値を取得します。

if (user.LastPasswordSet.HasValue)
{
    Console.WriteLine(user.LastPasswordSet.Value);
}

ただし、 LastPasswordSet が返す値は常に UTC (世界協定時) です。

そのため日本の標準時とは必ず 9 時間ずれています (LastPasswordSet が遅れている)。

ということで現地時刻に直して利用しましょう。 ToLocalTime メソッドを使用します。

if (user.LastPasswordSet.HasValue)
{
    Console.WriteLine(user.LastPasswordSet.Value.ToLocalTime());
}

うん、なんか長いですね。

あとがき

はー、時差のない国に行きたい。イギリスいきたい。あ、でも今はサマータイムか。

時差とプログラマーは離れられない運命ですね ┐(´ー`)┌

おつかれさまでした。

SNSでもご購読できます。