检查字符串是否为有效的AD组。

6
使用以下代码,我可以轻松查看所提供的用户是否存在于所提供的组中。
public static bool IsInGroup(string user, string group)
{
    using (var identity = new WindowsIdentity(user))
    {
        var principal = new WindowsPrincipal(identity);
        return principal.IsInRole(group);
    }
}

然而,假设我们有如下所示的字符串列表:-
User1
User2
User3
Group1
Group2
Group3

有没有办法在c#中循环这个字符串列表,检查每个条目是否是AD组?

例如,User3实际上是一个组名,但从列表中看,您会认为它是普通的AD用户。

是否有一种解析名称以查看它是否存在于我的AD域中作为组的方法。

我基本上想能够遍历名称和组的列表,并查看给定用户名(例如“Bob”)是否在列表中或存在于此列表中的某个组中,因此,如果列表中的条目是AD组,则我想运行类似上面的函数来查看用户是否存在于该组中。

2个回答

12

这还不算太糟。您将需要引用以下程序集:

System.DirectoryServices
System.DirectoryServices.Protocols
System.DirectoryServices.AccountManagement

然后您可以使用类似以下内容的东西:

var groupName = "developers";

using (var context = new PrincipalContext(ContextType.Domain))
{
    var groupPrincipal = GroupPrincipal.FindByIdentity(context, groupName);
}

您可以更改PrincipalContext构造函数,使用ContextType.Machine来访问本地计算机,如果需要,您可以添加域名作为第二个参数,但对于本地域,它应该会自动获取域名。

[编辑] 此外,如果没有匹配项,FindByIdentity方法将返回null。同时,您还可以从目录服务中获取成员用户和其他有用的信息。


这看起来不错。明天会检查一下。谢谢。已点赞。 - general exception

1

这里可能有一些有用的信息。谢谢。不过,Duane上面的回答似乎更合理。谢啦。 - general exception
Duane的答案将解决您代码中的特定问题。这个答案将解决您的整个用例。半斤八两。祝你好运! - Brian P
你能否详细解释一下你的答案?我只是想检查一下给定的字符串是否存在于我的域上作为广告组,我不明白如何使用ASP.NET的角色提供程序会有帮助? - general exception
1
根据您提供的代码片段,似乎您正在尝试在检查用户是否在组中之前验证它是否为组。角色提供程序将把组公开为角色。从那里,您可以使用角色提供程序来验证字符串是否为角色,并且用户是否在角色中(基于上述代码片段的暗示要求)。 - Brian P
没错,我明白你的意思了。我可能会先从Duanes的答案开始,因为你的答案有点复杂,而且由于这将被添加到自定义SSRS程序集中,所以简单起见会更容易。谢谢。 - general exception

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接