两个具有相同sAMAccountName的组,使用FindOne()获取组的第二次出现

时间:2018-12-11 17:56:41

标签: c# active-directory directoryservices

我有一个用户,我当前正在列出“ memberOf”。我想获取有关用户所属的每个组的一些详细信息,例如distinguishedName,上次修改的内容和说明...问题是,我在代码中使用FindOne(),并且我有几个带有sAMAccountName的组在各个域中重复的文件。有没有一种方法可以使用FindOne()来获取组的第二次出现,正如我在下面编写的那样,还是我需要重写并使用FindAll()并以这种方式进行处理。 相关代码如下:

foreach (object item in groups)
            {
                string groupProp = string.Empty;
                using (DirectoryEntry dirEntry = CreateDirectoryEntry())
                {
                    using (DirectorySearcher dirSearcher2 = new DirectorySearcher(dirEntry))
                    {
                        dirSearcher2.Filter = string.Format("(sAMAccountName=" + item + ")");
                        dirSearcher2.PropertiesToLoad.Add("description");
                        dirSearcher2.PropertiesToLoad.Add("whenChanged");
                        dirSearcher2.PropertiesToLoad.Add("distinguishedName");

                        SearchResult searchResult2 = dirSearcher2.FindOne();

                        if (searchResult2 != null)
                        {
                            DirectoryEntry employee = searchResult2.GetDirectoryEntry();
                            string desc = string.Empty;
                            string date = string.Empty;
                            string dname = string.Empty;
                            if (employee.Properties["description"].Value != null)
                            {
                                desc = employee.Properties["description"].Value.ToString();
                            }
                            if (employee.Properties["whenChanged"].Value != null)
                            {
                                date = employee.Properties["whenChanged"].Value.ToString();
                            }
                            if (employee.Properties["distinguishedName"].Value != null)
                            {
                                dname = employee.Properties["distinguishedName"].Value.ToString();
                                if (dname.Contains("DC=academic"))
                                {
                                    dname = "academic";
                                }
                            }
                        }
                }
            }

相关新代码:

using (var results = dirSearcher2.FindAll())
                        {
                            foreach (SearchResult searchResult2 in results)
                            {
                                html.Append("<tr><td>" + item.ToString() + "</td>");
                                if (searchResult2.Properties.Contains("description"))
                                {
                                    desc = searchResult2.Properties["description"][0].ToString();
                                }
                                if (searchResult2.Properties.Contains("whenChanged"))
                                {
                                    date = searchResult2.Properties["whenChanged"][0].ToString();
                                }
                                if (searchResult2.Properties.Contains("distinguishedName"))
                                {
                                    dom = searchResult2.Properties["distinguishedName"][0].ToString();
                                    if (dom.Contains("DC=academic"))
                                    {
                                        dname = "academic";
                                    }
                                    else if (dom.Contains("DC=office"))
                                    {
                                        dname = "office";
                                    }
                                    else
                                    {
                                        dname = "not listed";
                                    }
                                }
                                html.Append("<td>" + desc + "</td><td>" + dname + "</td><td>" + date + "</td></tr>");
                            }

从本质上讲,我得到的结果与第一个代码得到的结果相同,IE在第二个组上没有得到正确的信息。 IE:我有两个名为AppDev的组,它们都位于不同的域中;但是,两者都显示学术。当我查看AD时,我看到一个可分辨的名字在一组上显示DC = office,尽管上面的代码并没有做到这一点。

1 个答案:

答案 0 :(得分:1)

FindOne()仅找到一个。如果您需要查看更多内容,则需要使用FindAll()。只需确保将结果包装在using语句中即可,因为documentation表示如果不这样做,可能会导致内存泄漏:

using (var results = dirSearcher2.FindAll()) {
    foreach (SearchResult searchResult2 in results) {
        //do stuff
    }
}

如果只想查找2(例如,如果只需要知道是否存在多个),则可以将DirectorySearcher的{​​{3}}属性设置为{{1} }:

2

关于效率的说明:当您使用dirSearcher2.SizeLimit = 2; 然后从.GetDirectoryEntry()对象获取属性时,DirectoryEntry实际上会返回AD以获取那些属性,即使您已经在搜索过程中找到了它们。您已经使用DirectoryEntry来请求这些属性,因此它们在PropertiesToLoad对象中已经可用。请注意,SearchResult的{​​{1}}列表中的所有属性都以数组形式显示,因此,即使它们是AD中的单值属性,也始终需要使用Properties

SearchResult

如果还需要确保您正在搜索“全局目录”,则它将返回林中所有域的结果。为此,您可以使用[0](而不是if (searchResult2.Properties.Contains("description")) { desc = searchResult2.Properties["description"][0]; } )来创建用于DirectoryEntry的{​​{1}}。这告诉它使用端口3268(GC端口)而不是默认的LDAP端口(389)。您正在通过SearchRoot方法创建该对象。