从ActiveDirectory检索用户帐户过期
我正在尝试从帐户中检索到期日期。
我试过了
DirectoryEntry user = new DirectoryEntry(iMem); var AccountExpiration = DateTime.FromFileTime((int)user.Properties["accountExpires"].Value);
它不起作用,只给我错误“指定的演员表无效”。
我用的时候
var AccountExpiration = user.Properties["accountExpires"];
返回一个我无法读取的com对象。
使用windows powershell,工作正常,我不明白为什么这不会工作…
这是我在powershell中使用的代码
$Expires = [datetime]::FromFileTime($tmpUser.accountExpires)
您可以使用System.DirectoryServices.AccountManagement
命名空间来完成此任务。 从PrincipalContext
获取UserPrincipal
后,您可以检查UserPrincipal.AccountExpirationDate
属性。
PrincipalContext context = new PrincipalContext(ContextType.Domain); UserPrincipal p = UserPrincipal.FindByIdentity(context, "Domain\User Name"); if (p.AccountExpirationDate.HasValue) { DateTime expiration = p.AccountExpirationDate.Value.ToLocalTime(); }
如果您确实要使用DirectoryEntry
,请执行以下操作:
//assume 'user' is DirectoryEntry representing user to check DateTime expires = DateTime.FromFileTime(GetInt64(user, "accountExpires")); private Int64 GetInt64(DirectoryEntry entry, string attr) { //we will use the marshaling behavior of the searcher DirectorySearcher ds = new DirectorySearcher( entry, String.Format("({0}=*)", attr), new string[] { attr }, SearchScope.Base ); SearchResult sr = ds.FindOne(); if (sr != null) { if (sr.Properties.Contains(attr)) { return (Int64)sr.Properties[attr][0]; } } return -1; }
解析accountExpires
值的另一种方法是使用reflection:
上述就是C#学习教程:从ActiveDirectory检索用户帐户过期分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
private static long ConvertLargeIntegerToLong(object largeInteger) { Type type = largeInteger.GetType(); int highPart = (int)type.InvokeMember("HighPart", BindingFlags.GetProperty, null, largeInteger, null); int lowPart = (int)type.InvokeMember("LowPart", BindingFlags.GetProperty | BindingFlags.Public, null, largeInteger, null); return (long)highPart <<32 | (uint)lowPart; } object accountExpires = DirectoryEntryHelper.GetAdObjectProperty(directoryEntry, "accountExpires"); var asLong = ConvertLargeIntegerToLong(accountExpires); if (asLong == long.MaxValue || asLong <= 0 || DateTime.MaxValue.ToFileTime() <= asLong) { return DateTime.MaxValue; } else { return DateTime.FromFileTimeUtc(asLong); }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/955415.html