4

我正在制作一个程序,帮助办公桌工作人员在我的大学里检查和检查设备。我可以使用 Enviroment.username,但作为一种学习体验,我想获取当前登录用户的全名。按下 windows 按钮时看到的用户名。所以我目前的游戏测试代码是:

PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
UserPrincipal user = UserPrincipal.Current;
string displayName = user.DisplayName;
Console.WriteLine(displayName);
Console.ReadLine();

但它给了我一个主服务器关闭异常。我想这是权限问题,但我什至不知道从哪里开始。

我该怎么做才能让它发挥作用?

4

2 回答 2

2

如果您的意图是显示当前用户的属性...

UserPrincipal.Current抓取Principal正在运行的当前线程。如果这是有意的(例如使用模拟),那么您应该手头有用户数据,并且根本不需要设置主体上下文。

var up = UserPrincipal.Current;
Console.WriteLine(user.DisplayName);

但是,如果运行线程的主体不是您想要的用户,并且您需要从域(即 SLaks 点)收集他们的帐户信息,那么您需要设置主体上下文并搜索它以获取正确的 UserContext .

var pc = new PrincipalContext(ContextType.Domain, "domainName");
var user = UserPrincipal.FindByIdentity(pc, "samAccountName");
Console.WriteLine(user.DisplayName);

IdentityType如果您不喜欢 samAccountName,也可以使用另一个:

var user = UserPrincipal.FindByIdentity(pc, IdentityType.Name, "userName");
// or
var user = UserPrincipal.FindByIdentity(pc, IdentityType.Sid, "sidAsString");

如果您需要先手动验证用户身份,请参阅@DJKRAZE 的示例使用principalContext.ValidateCredentials()

祝你好运。

于 2012-10-31T22:35:59.877 回答
1

你有没有想过尝试这样的事情

bool valid = false;
using (var context = new PrincipalContext(ContextType.Domain))
{
    valid = context.ValidateCredentials(username, password);
}

如果您想更深入地了解,可以在下面执行此操作

using System.Security;
using System.DirectoryServices.AccountManagement;

public struct Credentials
{
    public string Username;
    public string Password;
}

public class Domain_Authentication
{
    public Credentials Credentials;
    public string Domain;
    public Domain_Authentication(string Username, string Password, string SDomain)
    {
        Credentials.Username = Username;
        Credentials.Password = Password;
        Domain = SDomain;
    }

    public bool IsValid()
    {
        using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, Domain))
        {
            // validate the credentials
            return pc.ValidateCredentials(Credentials.Username, Credentials.Password);
        }
    }
}
于 2012-10-31T22:14:51.500 回答