UserPrincipal.LastPasswordSet は UTC (世界協定時) を返す (ActiveDirectory)
こんにちは、イギリスに住みたい kenzauros です。今回は ActiveDirectory ネタです。
UserPrincipal と LastPasswordSet
System.DirectoryServices.AccountManagement 名前空間にあるクラス群は .NET からの ActiveDirectory 管理をちょっとだけ楽にしてくれます。
おそらく一番よく使うのは ActiveDirectory のユーザーオブジェクトに相当する UserPrincipal クラスでしょう。
パスワードの設定も SetPassword メソッドでできて便利です。
あと、パスワードの管理をしていると 最後にパスワードが変更された日時 を参照したいときがあります。たとえば前回の変更から一定期間を過ぎていたらアラートを出す、なんかはよくありそうですね。
そんなときには UserPrincipal.LastPasswordSet を使います。
ユーザーが前回パスワードを変更した日時 (AD の属性でいうと pwdLastSet 属性) を Nullable
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());
}
うん、なんか長いですね。
あとがき
はー、時差のない国に行きたい。イギリスいきたい。あ、でも今はサマータイムか。
時差とプログラマーは離れられない運命ですね ┐(´ー`)┌
おつかれさまでした。