gpt4 book ai didi

c# - 为本地和域帐户获取用户所属的组

转载 作者:行者123 更新时间:2023-11-30 20:58:31 25 4
gpt4 key购买 nike

我正在尝试列出给定用户所属的所有组,并且我想同时支持本地计算机帐户和域帐户。我可以使用以下代码获取域帐户的组:

public void ListAllGroupsDomain()
{
ListAllGroups(ContextType.Domain,
"myDomain",
"myDomainUser",
"myDomainPassword");
}

public void ListAllGroups(ContextType contextType
string name,
string username,
string password)
{
using (var context = new PrincipalContext(contextType,
name,
username,
password))
{
using (var findByIdentity = UserPrincipal.FindByIdentity(context, "testedit"))
{
if (findByIdentity != null)
{
var groups = findByIdentity.GetGroups(context);
var results = groups.Select(g => g.Name).ToArray();
Console.WriteLine("Listing {0} groups", results.Count());
foreach (var name in results)
{
Console.WriteLine("{0}", name);
}
}
}
}
}

但是,如果我尝试调用机器本地帐户,我会收到一个 COM 异常,提示我的用户名或密码不正确(实际上它们不是):

public void ListAllGroupsMachine()
{
ListAllGroups(ContextType.Machine,
"myMachine",
"myMachineUser",
"myMachinePassword");
}

我猜我错误地使用了计算机帐户的 FindByIdentity。所以我尝试了一种不使用 FindByIdentity 的稍微不同的方法:

public void ListAllGroups2(ContextType contextType
string name,
string username,
string password)
{
using (var context = new PrincipalContext(contextType,
name,
username,
password))
{
using (var userContext = new UserPrincipal(context))
{
var results = userContext.GetGroups();
Console.WriteLine("Listing {0} groups:", results.Count());
foreach (var principal in results)
{
Console.WriteLine("{0}", principal.Name);
}
}
}
}

此版本没有抛出任何异常,但对 GetGroups() 的调用也没有返回任何结果。如何获取特定用户所属的组,该组对于计算机和域帐户都是可靠的?

最佳答案

感谢我从 https://stackoverflow.com/a/3681442/1222122 收集到的一点帮助,我想通了我做错了什么。我错误地设置了 PrincipalContext。我不需要给它域、用户名或密码,只需给它 ContextType。以下代码适用于本地计算机帐户和域帐户:

public void ListAllGroupsDomain()
{
ListAllGroups(ContextType.Domain, "myDomainUsername");
}

public void ListAllGroupsMachine()
{
ListAllGroups(ContextType.Machine, "myMachineUsername");
}

public void ListAllGroups(ContextType contextType, string userName)
{
using (var context = new PrincipalContext(contextType))
{
using (var findByIdentity = UserPrincipal.FindByIdentity(context, userName))
{
if (findByIdentity != null)
{
var groups = findByIdentity.GetGroups(context);
var results = groups.Select(g => g.Name).ToArray();
Console.WriteLine("Listing {0} groups", results.Count());
foreach (var name in results)
{
Console.WriteLine("{0}", name);
}
}
}
}
}

我唯一需要确保做的就是在将域传递给 ListAllGroups 之前从用户名中删除域,因为提供它的函数会将它添加到用户名之前在某些情况下。

关于c# - 为本地和域帐户获取用户所属的组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16052391/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com