gpt4 book ai didi

c# - 从 ActiveDirectory 检索用户帐户过期

转载 作者:太空狗 更新时间:2023-10-29 18:16:12 24 4
gpt4 key购买 nike

我正在尝试从帐户中检索到期日期。

我试过了

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 值的方法是使用反射:

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);
}

关于c# - 从 ActiveDirectory 检索用户帐户过期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18232194/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com