12
    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 などの日付/時刻に関連するものを除いて、ほとんどの Active Directory プロパティでうまく機能します。

私の質問は、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 を作成する予定です

4

2 に答える 2

15

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

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

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

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

だからただやってください:

long value = (long)objResult.Properties["pwdLastSet"][0];
DateTime pwdLastSet = DateTime.FromFileTimeUtc(value);
于 2013-09-04T16:21:38.243 に答える
2

ディレクトリユーザーの最後のパスワード設定日を、人間が読める形式でパイと同じくらい簡単に取得できます。これを実現するには、名前空間 のクラスの nullableLastPasswordSetプロパティを使用できます。UserPrincipalSystem.DirectoryServices.AccountManagement

User must change password at next logonオプションがチェックされている場合、LastPasswordSetプロパティは値を返しnullます。それ以外の場合は、パスワードが最後に type に設定された日付と時刻を返します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

于 2016-07-16T15:49:45.423 に答える