使用"new PrincipalContext(ContextType.Domain, "domain.name.com" )",无需提供用户名和密码



我已经构建了一个将使用ClickOnce部署的应用程序,该应用程序在启动时需要检查当前登录用户的身份/名称,并将其与我们域上的Active Directory组进行比较,以便在应用程序中设置适当的权限。

我可以通过将用户名和密码"硬编码"到应用程序中,并将这些凭据传递给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 DOMAINUsername 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");

"您已经看到许多在线使用构造函数而不指定凭据的示例"只要您的计算机属于域并且用户已登录,这应该在您的计算机上运行。

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

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

domain应该是域名,如果用户登录到域,则由环境变量USERDNSDOMAIN给定,而不是"域服务器的名称,例如server.domain.com"

最新更新