public static string GetProperty(SearchResult searchResult, string PropertyName)
{
if (searchResult.Properties.Contains(PropertyName))
{
return searchResult.Properties[PropertyName][0].ToString();
}
else
{
return string.Empty;
}
}
上述方法适用于大多数Active Directory属性,但与日期/时间相关的属性除外,如pwdLastSet,maxPwdAge等。
我的问题是如何将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
答案 0 :(得分:12)
此值存储为一个大整数,表示自1601年1月1日(UTC)以来100纳秒间隔的数量。
这与DateTime.FromFileTimeUtc
,as described here完全一致。
而且我不确定为什么你觉得需要对整数进行低级操作。我想你可以投它。
所以就这样做:
long value = (long)objResult.Properties["pwdLastSet"][0];
DateTime pwdLastSet = DateTime.FromFileTimeUtc(value);
答案 1 :(得分:1)
您可以使用人类可读的形式获取目录用户的最后一个密码设置日期,就像馅饼一样简单。要实现此目的,您可以使用LastPasswordSet
命名空间中UserPrincipal
类的可空System.DirectoryServices.AccountManagement
属性。
如果选中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;
...
}