【问题标题】:C# PrincipalSearcher, returning AD groups for specific OUC# PrincipalSearcher,返回特定 OU 的 AD 组
【发布时间】:2012-04-02 18:03:49
【问题描述】:

我在处理这段代码时遇到了一些困难,尤其是 PrincipalSearcher。我正在尝试获取与特定 OU 关联的所有组的列表。

我试图只返回所有组范围下的“安全”组,不包括通讯组。

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

帮助服务组 Telnet客户端 管理员 用户 客人 打印操作员 备份运算符 复制器 远程桌面用户 网络配置运营商 性能监视器用户 性能日志用户 分布式 COM 用户 域计算机 域控制器 架构管理员 企业管理员 证书发布者 域管理员 域用户 域访客 组策略创建者所有者 RAS 和 IAS 服务器 服务器运营商 账户运营商 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;
    }

如何让这个排除内置组?

我们将不胜感激。

谢谢!

【问题讨论】:

    标签: c# active-directory


    【解决方案1】:

    两件事:

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

    2. 如果是这样:您没有正确调用 PrincipalContext 的构造函数。如果您检查MSDN documentation on PrincipalContext constructors,您会看到您正在使用的是带有ContextTypename 的那个,它代表您想要的上下文的域名绑定到:

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

      这将绑定到 MyOU 域 - 并且绑定在该域树的根部。

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

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

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

    【讨论】:

    • 马克,谢谢你的解释我现在明白这个问题了。
    【解决方案2】:

    你可以试试:

        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 和容器的 DN(如果您只想搜索容器)。

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

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

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

    希望对您有所帮助。

    【讨论】:

    • Daro,感谢您对代码所做的修改,我根据 Marc S 提供的信息实现了不同的例程。
    猜你喜欢
    • 2023-02-03
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 2020-10-07
    相关资源
    最近更新 更多