C#PrincipalSearcher,返回特定OU的AD组

时间:2012-04-02 18:03:49

标签: c# active-directory

我对这段代码有点困难,特别是使用PrincipalSearcher。我正在尝试获取与特定OU关联的所有组的列表。

我正在尝试在所有组范围下返回“安全”组,不包括通讯组。

我遇到的问题是,除了我打算返回之外,它还会返回这些内置组。

HelpServicesGroup TelnetClients 管理员 用户 宾客 打印操作员 备份操作员 复制 远程桌面用户 网络配置运营商 性能监视器用户 性能日志用户 分布式COM用户 域计算机 域控制器 架构管理员 企业管理员 证书出版商 域管理员 域用户 域名嘉宾 组策略创建者所有者 RAS和IAS服务器 服务器运营商 账户经营者 Pre-Windows 2000兼容访问 进入森林信托建设者 Windows授权访问组 终端服务器许可服务器 DNSADMINS DnsUpdateProxy IIS_WPG

我不确定范围是否可能不正确,或者我错过了某种过滤。

相关代码段:

    public static ArrayList GetAllGroups()
    {
        var myItems = new ArrayList();

        var ctx = new PrincipalContext(ContextType.Domain,"MyOU");

        // define a "query-by-example" principal - here, we search for a GroupPrincipal 
        var qbeGroup = new GroupPrincipal(ctx);

        // create your principal searcher passing in the QBE principal    
        var srch = new PrincipalSearcher(qbeGroup);

        // find all matches
        foreach (Principal found in srch.FindAll())
        {
            var foundGroup = found as GroupPrincipal;

            if (foundGroup != null)
            {
                myItems.Add(foundGroup.Name);
            }
        }
        return myItems;
    }

如何排除内置组?

对此的任何帮助将不胜感激。

谢谢!

2 个答案:

答案 0 :(得分:9)

两件事:

  1. 没有与关联的 - OU是容器,其中包含用户,计算机,组等。 (就像包含文件的目录一样)。你是这个意思吗?您想要枚举给定OU ??

  2. 中的包含
  3. 如果是这样的话:你没有正确地调用PrincipalContext的构造函数。如果您选中MSDN documentation on PrincipalContext constructors,则会看到您使用的是ContextTypename代表域名您要绑定到的上下文:

    var ctx = new PrincipalContext(ContextType.Domain,"MyOU");
    

    这绑定到MyOU域 - 它绑定在该域树的根目录下。

  4. 您可能正在寻找的是具有三个参数的构造函数 - ContextType两个字符串 - 第一个是上面的域名,第二个是开始搜索的位置。因此,将PrincipalContext构造更改为:

    var ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN", "OU=MyOU");
    

    然后再次搜索 - 现在您应该只获得OU=MyOU容器中包含的组。

答案 1 :(得分:4)

你可以尝试:

    var myItems = new ArrayList();

    var ctx = new PrincipalContext(ContextType.Domain, Environment.UserDomainName, "OU=Groups,DC=Domain,DC=Com");

    // define a "query-by-example" principal - here, we search for a GroupPrincipal  
    var qbeGroup = new GroupPrincipal(ctx);

    // create your principal searcher passing in the QBE principal     
    var srch = new PrincipalSearcher(qbeGroup);

    // find all matches 
    foreach (Principal found in srch.FindAll())
    {
        var foundGroup = found as GroupPrincipal;

        if (foundGroup != null && foundGroup.IsSecurityGroup == true)
        {
            myItems.Add(foundGroup.Name);
        }
    } 

PrincipalContext需要contextType,Domain和Container的DN(如果您只想搜索容器)。

foundGroup!= null&& foundGroup.IsSecurityGroup == true将返回所有安全组。这是你想要的。

如果您愿意,也可以使用GroupScope来改进:

foundGroup!= null&& foundGroup.GroupScope == GroupScope.Global将范围缩小到全局组。

希望有所帮助。