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を作成する予定です。
MSDNドキュメント によると:
この値は、1601年1月1日(UTC)以降の100ナノ秒間隔の数を表す大きな整数として格納されます。
これは、ここで説明されているように、DateTime.FromFileTimeUtc
、 と完全に一致します 。
そして、なぜ整数の低レベルの操作を行う必要があると感じるのかわかりません。キャストしてもいいと思います。
だからただする:
long value = (long)objResult.Properties["pwdLastSet"][0];
DateTime pwdLastSet = DateTime.FromFileTimeUtc(value);
ディレクトリユーザーの最後のパスワード設定日は、人間が読める形式で簡単に取得できます。これを実現するには、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;
...
}