我正在制作一个程序,帮助办公桌工作人员在我的大学办理登机手续并检查设备。我可以使用Enviroment.username,但作为一种学习经验,我想获得当前用户登录的全名。按下Windows按钮时看到的那个。所以我目前的playtest代码是:
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
UserPrincipal user = UserPrincipal.Current;
string displayName = user.DisplayName;
Console.WriteLine(displayName);
Console.ReadLine();
但它给了我一个主要的服务器停机异常。我想这是权限问题,但我甚至不知道从哪里开始。
我该怎么做才能让它发挥作用?
答案 0 :(得分: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);
如果您不喜欢samAccountName,也可以使用其他IdentityType
:
var user = UserPrincipal.FindByIdentity(pc, IdentityType.Name, "userName");
// or
var user = UserPrincipal.FindByIdentity(pc, IdentityType.Sid, "sidAsString");
如果您需要先手动验证用户,请使用principalContext.ValidateCredentials()
答案 1 :(得分: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);
}
}
}