UserPrincipal.FindByIdentity返回具有计算机上下文类型的null

时间:2019-07-08 14:00:22

标签: c# active-directory

我正在处理需要Windows机器上一次登录时间的应用程序。我为此使用了PrincipalContext

我正在使用的代码在少数机器上运行,但是在某些机器上UserPrincipal开始以null返回:

private DateTime? GetLastLogin()
{
    PrincipalContext context = new PrincipalContext(ContextType.Machine, Environment.MachineName);
    UserPrincipal uc = UserPrincipal.FindByIdentity(context, Environment.UserName);
    return uc.LastLogon;
}

该代码在少数计算机上运行良好,但同时在某些计算机上返回UserPrincipal为null。任何帮助表示赞赏。谢谢!

1 个答案:

答案 0 :(得分:0)

此:

new PrincipalContext(ContextType.Machine, Environment.MachineName)

表示要在当前计算机上查找帐户。因此,您将只能找到本地帐户-仅在当前计算机上存在的帐户。

如果用户使用Active Directory帐户登录,则可以,您对FindByIdentity的调用将不会返回任何内容,因为他们的帐户位于Active Directory中,而不是本地计算机中。

如果您希望当前用户使用UserPrincipal对象,则可以使用UserPrincipal.Current

private DateTime? GetLastLogin()
{
    return UserPrincipal.Current.LastLogon;
}

请小心执行几次。每次使用UserPrincipal.Current时,它都会创建一个新的UserPrincipal对象,并且第一次使用新的UserPrincipal对象时,它将消失并与AD对话,这会花费时间。 / p>

因此,明智的做法是保留对从UserPrincipal获得的UserPrincipal.Current对象的引用,并在每次需要时引用该对象。