web-dev-qa-db-ja.com

ActiveDirectoryのpwdLastSetを日付/時刻に変換する方法

    public static string GetProperty(SearchResult searchResult, string PropertyName)
    {
        if (searchResult.Properties.Contains(PropertyName))
        {
            return searchResult.Properties[PropertyName][0].ToString();
        }
        else
        {
            return string.Empty;
        }
    }

上記の方法は、pwdLastSet、maxPwdAgeなどの日付/時刻に関連するプロパティを除くほとんどのActiveDirectoryプロパティに最適です。

私の質問は、pwdLastSetを人間が読める日時(2013年8月13日や2013年8月13日など)にする方法です。

私はこれを試しましたが、例外が発生しました

public static Int64 ConvertADSLargeIntegerToInt64(object adsLargeInteger)
{
    var highPart = (Int32)adsLargeInteger.GetType().InvokeMember("HighPart", System.Reflection.BindingFlags.GetProperty, null, adsLargeInteger, null);
    var lowPart = (Int32)adsLargeInteger.GetType().InvokeMember("LowPart", System.Reflection.BindingFlags.GetProperty, null, adsLargeInteger, null);
    return highPart * ((Int64)UInt32.MaxValue + 1) + lowPart;
}

私はInt64として時間を取得するために次のコードを使用しています

Int64 passwordLastSet = ConvertADSLargeIntegerToInt64(objResult.Properties["pwdLastSet"][0]);

次に、DateTime(Int64)コンストラクターを使用してDateTimeを作成する予定です。

9
software is fun

MSDNドキュメント によると:

この値は、1601年1月1日(UTC)以降の100ナノ秒間隔の数を表す大きな整数として格納されます。

これは、ここで説明されているように、DateTime.FromFileTimeUtcと完全に一致します

そして、なぜ整数の低レベルの操作を行う必要があると感じるのかわかりません。キャストしてもいいと思います。

だからただする:

long value = (long)objResult.Properties["pwdLastSet"][0];
DateTime pwdLastSet = DateTime.FromFileTimeUtc(value);
13

ディレクトリユーザーの最後のパスワード設定日は、人間が読める形式で簡単に取得できます。これを実現するには、System.DirectoryServices.AccountManagement名前空間のLastPasswordSetクラスのnull許容UserPrincipalプロパティを使用できます。

User must change password at next logonオプションがチェックされている場合、LastPasswordSetプロパティはnull値を返します。それ以外の場合は、パスワードがタイプDateTimeに設定された最後の日時を返します。

using(PrincipalContext context = new PrincipalContext(ContextType.Domain))
{
    UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, Username);
    //? - to mark DateTime type as nullable
    DateTime? pwdLastSet = (DateTime?)user.LastPasswordSet;
    ...
}

MSDN:UserPrincipal
MSDN:LastPasswordSet

1