从OU获取计算机

时间:2011-03-01 22:24:12

标签: c# asp.net active-directory

我有一个代码来获取域中所有计算机的列表。

现在我需要获取特定OU中的计算机,而不是其他机器。

所以这是我的代码从域中获取所有机器,这非常好用:

DirectoryEntry entry = new DirectoryEntry("LDAP://" + selectDomain);
        DirectorySearcher mySearcher = new DirectorySearcher(entry);
        mySearcher.Filter = ("(objectClass=computer)");
        mySearcher.SizeLimit = int.MaxValue;
        mySearcher.PageSize = int.MaxValue;

        foreach (SearchResult resEnt in mySearcher.FindAll())
        {
            //"CN=SGSVG007DC"
            string ComputerName = resEnt.GetDirectoryEntry().Name;
            if (ComputerName.StartsWith("CN="))
                ComputerName = ComputerName.Remove(0, "CN=".Length);
            compList.Add(ComputerName);
        }

        mySearcher.Dispose();
        entry.Dispose();

任何建议?感谢。

3 个答案:

答案 0 :(得分:2)

您只需要将OU添加到目录条目中,因此不会将域的根作为搜索路径,而是将域+ OU作为搜索路径。

请参阅“枚举OU中的对象”@ http://www.codeproject.com/KB/system/everythingInAD.aspx

我从你的意见中看到你在这里遇到问题,所以让我们简单地说 - 注意这段代码没有经过测试,但应该澄清......

string selectDomain = "CN=myCompany,CN=com";
string selectOU = "OU=LosAngeles,OU=America";
DirectoryEntry entry = new DirectoryEntry("LDAP://" + selectOU + "," + selectDomain);

这实际上为您提供了“LDAP:// OU = LosAngeles,OU = America,CN = MyCompany,CN = com”字符串作为新目录条目。您必须指定完整的LDAP路径,而不仅仅是OU或域。

答案 1 :(得分:1)

尝试使用此目录条目:

DirectoryEntry entry = new DirectoryEntry(string.Format(“LDAP:// OU = {0},{1}”,ouName,selectDomain));

答案 2 :(得分:0)

我尝试了以上所有......但它没有用......所以这就是我尝试过的并且有效。

我知道这不是最好的方式,但它是为我工作的唯一方式...任何建议..谢谢

DirectoryEntry entry = new DirectoryEntry("LDAP://" + selectedDomain);
            DirectorySearcher mySearcher = new DirectorySearcher(entry);
            mySearcher.Filter = ("(objectClass=organizationalUnit)");
            mySearcher.SizeLimit = int.MaxValue;
            mySearcher.PageSize = int.MaxValue;
            foreach (SearchResult temp in mySearcher.FindAll())
            {
                Global.logger.Debug("OU = " + temp.Properties["name"][0].ToString());
                DirectoryEntry ou = temp.GetDirectoryEntry();
                DirectorySearcher mySearcher1 = new DirectorySearcher(ou);
                mySearcher1.Filter = ("(objectClass=computer)");
                mySearcher1.SizeLimit = int.MaxValue;
                mySearcher1.PageSize = int.MaxValue;

                if (temp.Properties["name"][0].ToString() == selectedOU)
                {
                    foreach (SearchResult resEnt in mySearcher1.FindAll())
                    {
                        //"CN=SGSVG007DC"
                        string ComputerName = resEnt.GetDirectoryEntry().Name;
                        Global.logger.Debug("ComputerName = " + resEnt.Properties["name"][0].ToString());
                        if (ComputerName.StartsWith("CN="))
                            ComputerName = ComputerName.Remove(0, "CN=".Length);
                        compList.Add(ComputerName);
                    }
                }

                mySearcher1.Dispose();
                ou.Dispose();
            }

            mySearcher.Dispose();
            entry.Dispose();