【问题标题】:Retrieving OU's from Active Directory从 Active Directory 中检索 OU
【发布时间】:2017-03-02 13:29:58
【问题描述】:

我正在尝试从活动目录中获取 OU 的列表。不幸的是,即使我知道“myApp”域组件中有 2 个 OU,我的搜索也总是没有任何结果。

using (var entry = new DirectoryEntry("LDAP://myServer:1111/DC=myApp,DC=myDomain,DC=com", Username, Password)) {
    using (var searcher = new DirectorySearcher()) {
        searcher.SearchRoot = entry;
        searcher.Filter = "(objectCategory=Organizational-Unit)";
        searcher.PropertiesToLoad.Add("name");

        //foo never gets results.  :(
        var foo = searcher.FindAll();
    }
}

我尝试按照以前的 StackOverflow question 中的代码进行操作,但是没有运气。

【问题讨论】:

    标签: c# active-directory ldap directoryservices


    【解决方案1】:

    我使用这样的东西。它使用路径检索字典名称中的所有 OU,只需正确更改 SearchScope。

    public Dictionary<string, string> GetOUInfo(SearchScope eSearchScope)
        {
            Dictionary<string, string> retValues = new Dictionary<string, string>();
    
            try
            {
                DirectoryEntry oDirectoryEntry = new DirectoryEntry("LDAP://myServer:1111/DC=myApp,DC=myDomain,DC=com", Username, Password);
                DirectorySearcher oDirectorySearcher = new DirectorySearcher(oDirectoryEntry,
                    "(objectCategory=organizationalUnit)", null, eSearchScope);
    
                SearchResultCollection oSearchResultCollection = oDirectorySearcher.FindAll();
                foreach (SearchResult item in oSearchResultCollection)
                {
                    string name = item.Properties["name"][0].ToString();
                    string path = item.GetDirectoryEntry().Path;
                    retValues.Add(path, name);
                }
            }
            catch (Exception ex)
            {
            }
    
            return retValues;
        }
    

    【讨论】:

      【解决方案2】:

      1) 你确定基本搜索 "DC=myApp,DC=myDomain,DC=com" 吗? "myApp" 是域组件吗?

      2) 可以尝试指定搜索范围吗?

      searcher.SearchScope = SearchScope.Subtree;
      

      3) "(objectCategory=Organizational-Unit)" 是 Active-Directory 理解的快捷方式,但实际上 objectCategory 属性是一个专有名称 (DN),OU 的真正值是:CN=Organizational-Unit,CN=Schema,CN=Configuration,domain root DN

      你能试试这个过滤器"(objectClas=Organizational-Unit)",它更常见于搜索OU吗?


      你可以在命令行上试试这个吗?

      C:\temp>ldifde -f c:\temp\out.txt -d "DC=myApp,DC=myDomain,DC=com" -r "(objectClass=organizationalUnit)"
      

      【讨论】:

      • 1.是的,我只是用一些虚拟文本替换了这些值。我直接从 Microsoft 的 AD 资源管理器中获取了字符串。 2. 我相信Subtree 是默认值,但是,我还是这样做了,没有任何运气。 3. 我试过(objectClass=Organizational-Unit) 没有运气。不管它的价值是什么,如果我除了过滤器之外的所有内容都保持不变并将其更改为过滤用户,那么我将获得所有 OU 中的所有用户。
      • 您确定这些对象是 OU 吗?
      • 对象类被列为:top;organizationalUnit
      • 我可能误解了你的问题,但是,我不这么认为。我应该指出,我确实有解决这个问题的方法;我可以使用DirectoryEntry 对象连接到目录,然后检查第一级子级以找到OU。我希望通过实际查询来实现这一点,以获得(假设的)性能提升。
      • 首先,我要感谢您这么长时间坚持这个问题;我很感激。其次,我必须使用该命令更改一些参数(服务器和端口),但是,它给了我 2 个 OU 结果,这正是这个目录存储所具有的。您是否认为我唯一的选择是在我的应用程序中执行此命令并解析输出?
      【解决方案3】:

      用这个就可以了

      PrincipalContext yourOU = new PrincipalContext(ContextType.Domain, "mycompany.com", "OU=Marketing,OU=Corporate,DC=mycompany,DC=com");
      GroupPrincipal findAllGroups = new GroupPrincipal(yourOU, "*");
      PrincipalSearcher ps = new PrincipalSearcher(findAllGroups);
      foreach (var group in ps.FindAll())
      {
      Console.WriteLine(group.DistinguishedName);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-15
        相关资源
        最近更新 更多