Jaz*_*rix 8 c# active-directory
我正在尝试从帐户中检索到期日期.
我试过了
DirectoryEntry user = new DirectoryEntry(iMem);
var AccountExpiration = DateTime.FromFileTime((int)user.Properties["accountExpires"].Value);
Run Code Online (Sandbox Code Playgroud)
它不起作用,只给我错误"指定的演员表无效".
我用的时候
var AccountExpiration = user.Properties["accountExpires"];
Run Code Online (Sandbox Code Playgroud)
返回一个我无法读取的com对象.
使用windows powershell,工作正常,我不明白为什么这不会工作...
这是我在powershell中使用的代码
$Expires = [datetime]::FromFileTime($tmpUser.accountExpires)
Run Code Online (Sandbox Code Playgroud)
SeT*_*ToY 15
您可以使用System.DirectoryServices.AccountManagement
命名空间来完成此任务.一旦你UserPrincipal
从a 获得PrincipalContext
,你可以检查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();
}
Run Code Online (Sandbox Code Playgroud)
如果您确实想使用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;
}
Run Code Online (Sandbox Code Playgroud)
解析accountExpires
值的另一种方法是使用反射:
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);
}
Run Code Online (Sandbox Code Playgroud)