2015-02-11 83 views
2

我已经构建了一个应用程序,它将与ClickOnce一起部署,启动时需要检查当前登录用户的身份/名称,并将其与我们域上的Active Directory组进行比较,以便在应用程序中设置适当的权限。使用新的PrincipalContext(ContextType.Domain,“domain.name.com”)`而不必提供用户名和密码

我可以通过“硬编码”一个用户名和密码的应用程序,并通过这些凭据到PrincipalContext构造,即

var pc = new PrincipalContext(ContextType.Domain, "domain.name.com", username, password); 

的问题是,我不希望有这样做将用户名和密码存储在应用程序中(我不想提示用户输入用户名和密码)。

我见过很多使用构造函数的示例,但没有指定凭据,但这不适用于我们的域。

在域或“域用户”组属性中是否有设置/权限,我可以通过配置使其生效?

我当前的代码如下所示(请注意:

/// <summary> 
/// Gets a list of all Active Directory Groups the specified username is a member of. 
/// </summary> 
/// <param name="userName">The username of the user in DOMAIN\Username format</param> 
/// <param name="domain">The name of the domain server, e.g., server.domain.com (not DOMAIN or DOMAIN.COM or SERVER)</param> 
/// <returns></returns> 
public static List<string> GetUserGroups(string userName, string domain) 
{ 
    if (userName.IsNullOrWhiteSpace()) return null; 

    var pc = new PrincipalContext(ContextType.Domain, domain); 
    var userPc = UserPrincipal.FindByIdentity(pc, userName); 

    if (userPc == null) return null; 

    var src = userPc.GetGroups(pc); 
    var result = new List<string>(); 
    src.ToList().ForEach(sr => result.Add(sr.SamAccountName)); 
    return result; 
} 

而且我实质上调用是这样的:

var userGroups = GetUserGroups(WindowsIdentity.GetCurrent.Name, "server.domain.com"); 
+0

“......这不适用于我们的网域。”你能解释一下吗?你是说你不能在没有用户名和密码的情况下查询LDAP/ADS服务器? – sfuqua 2015-02-11 22:42:45

回答

2

“你见过网上使用的例子很多没有指定凭据的构造函数“只要您的计算机属于域并且用户已登录,就应该在您的计算机上运行。

对于我的错误可能来自一个事实,当你使用:

var pc = new PrincipalContext(ContextType.Domain, domain); 

domain应该是域名,由环境在变USERDNSDOMAIN给出如果用户登录到域,而不是“域名服务器的名称,例如server.domain.com”“。

+0

奇怪的是,今天早上当我进入办公室并运行代码(没有改变它)时,它刚刚工作。昨天,我们的网络中一只混乱的猴子一定在沙沙作响。奇怪的是,我们的域名实际上是'server.sci.com',它和'sci.com'的'USERDNSDOMAIN'值一样。 – 2015-02-12 17:07:28

+0

5小时后,此解决方案错误地出现“发生本地错误”。我不知道发生了什么。 – 2015-02-12 23:05:37

+0

你没有给出任何线索,首先你可以记录异常。其次,没有线索,统计问题来自您的DNS解析(80%的AD认证问题来自于此) – JPBlanc 2015-02-13 06:08:40

相关问题