使用 `new PrincipalContext(ContextType.Domain, "domain.name.com")` 无需提供用户名和密码
Using `new PrincipalContext(ContextType.Domain, "domain.name.com")` without having to provide the username and password
我构建了一个将使用 ClickOnce 部署的应用程序,在启动时,需要检查当前登录用户的 Identity/Name,并将其与我们域中的 Active Directory 组按顺序进行比较在应用程序中设置适当的权限。
我可以通过 "hard coding" 将用户名和密码输入应用程序,并将这些凭证传递给 PrincipalContext
构造函数,即
var pc = new PrincipalContext(ContextType.Domain, "domain.name.com", username, password);
问题是我不想在应用程序中存储用户名和密码(我也不想提示用户输入用户名和密码)。
我在网上看到很多使用构造函数而不指定凭据的示例,但这在我们的域上不起作用。
我可以配置域或 "Domain Users" 组属性中的 setting/permission 以使其正常工作吗?
我现在的代码如下(注意:
/// <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");
"You've seen many examples online using the constructor without specifying credentials"只要您的计算机属于域并且用户已登录,这应该可以在您的计算机上运行。
对我来说,错误可能来自以下事实:
var pc = new PrincipalContext(ContextType.Domain, domain);
domain
应该是域名,如果用户登录到域,则由环境变量 USERDNSDOMAIN
给出,而不是 "The name of the domain server, e.g., server.domain.com" 当你写进评论时。
我构建了一个将使用 ClickOnce 部署的应用程序,在启动时,需要检查当前登录用户的 Identity/Name,并将其与我们域中的 Active Directory 组按顺序进行比较在应用程序中设置适当的权限。
我可以通过 "hard coding" 将用户名和密码输入应用程序,并将这些凭证传递给 PrincipalContext
构造函数,即
var pc = new PrincipalContext(ContextType.Domain, "domain.name.com", username, password);
问题是我不想在应用程序中存储用户名和密码(我也不想提示用户输入用户名和密码)。
我在网上看到很多使用构造函数而不指定凭据的示例,但这在我们的域上不起作用。
我可以配置域或 "Domain Users" 组属性中的 setting/permission 以使其正常工作吗?
我现在的代码如下(注意:
/// <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");
"You've seen many examples online using the constructor without specifying credentials"只要您的计算机属于域并且用户已登录,这应该可以在您的计算机上运行。
对我来说,错误可能来自以下事实:
var pc = new PrincipalContext(ContextType.Domain, domain);
domain
应该是域名,如果用户登录到域,则由环境变量 USERDNSDOMAIN
给出,而不是 "The name of the domain server, e.g., server.domain.com" 当你写进评论时。