Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 未输出任何数据的列表(System.DirectoryServices)_C#_List_Methods_Active Directory - Fatal编程技术网

C# 未输出任何数据的列表(System.DirectoryServices)

C# 未输出任何数据的列表(System.DirectoryServices),c#,list,methods,active-directory,C#,List,Methods,Active Directory,我目前有一个查询指定机器的规范名称和CN的方法。尽管如此,在验证方法中的数据时,不会输出任何内容。我不确定我是否设置了错误的格式或没有正确过滤。我尝试了很多改变search.Filter等格式的方法,但都没有成功。下面是我的最新代码。我希望有人能看到我错过的东西 public class ComputersCheck { public string OU { get; set; } public string ComputerName { get;

我目前有一个查询指定机器的规范名称和CN的方法。尽管如此,在验证方法中的数据时,不会输出任何内容。我不确定我是否设置了错误的格式或没有正确过滤。我尝试了很多改变search.Filter等格式的方法,但都没有成功。下面是我的最新代码。我希望有人能看到我错过的东西

    public class ComputersCheck
    {
        public string OU { get; set; }
        public string ComputerName { get; set; }

        public override string ToString()
        {
            return OU + " " + " " + ComputerName;
        }
    }
    public List<ComputersCheck> GetOU(string PCName)
    {
            List<ComputersCheck> Computers = new List<ComputersCheck>().ToList();
            string DomainPath = "LDAP://DC=DOMAIN,DC=COM"; 
            DirectoryEntry searchRoot = new DirectoryEntry(DomainPath); 
            DirectorySearcher search = new DirectorySearcher(searchRoot);
            search.Filter = "(&(objectClass=Computer)(computerName=MACHINE_NAME))"; 
            search.PropertiesToLoad.Add("CN");
            search.PropertiesToLoad.Add("Canonical Name"); 
            SearchResult result;
            SearchResultCollection resultCol = search.FindAll();

            if (resultCol != null)
            {
                for (int counter = 0; counter < resultCol.Count; counter++)
                {
                    string ComputerNameOUString = string.Empty;
                    result = resultCol[counter];
                    if(result.Properties.Contains("CN") &&
                       result.Properties.Contains("Canonical Name"))
                    {
                        ComputersCheck objSurveyComputers = new ComputersCheck();
                        objSurveyComputers.ComputerName = (String)result.Properties["CN"][0];
                        objSurveyComputers.OU = (String)result.Properties["Canonical Name"][0];
                        Computers.Add(objSurveyComputers);
                    }
                }
            }

        foreach (ComputersCheck computer in Computers)
        {
            Console.WriteLine(computer);

        }
        search.Dispose();
        searchRoot.Dispose();
        return Computers;
    }

您确实有一些事情需要纠正:

没有computerName属性。将调用您要查找的属性,该属性与用于用户帐户的用户名的属性相同。但是,对于计算机,它是计算机名后跟$字符。因此,您的搜索应该如下所示: 属性名称从来没有空格。您需要属性。我看到您正在将其分配给名为OU的属性。请注意,canonicalName在末尾包含对象本身的名称,而不仅仅是OU。 您正在调用。在两个对象上进行Dispose,这很好,但不是绝对需要。但要处理的最重要的是resultCol,因为 由于实现限制,SearchResultCollection类在垃圾收集时无法释放其所有非托管资源。为了防止内存泄漏,当不再需要SearchResultCollection对象时,必须调用Dispose方法


您也可以将其放入a中,而不是调用。手动处置,这将产生相同的效果。

谢谢!这篇文章写得很好,我感谢你的帮助。我计划修改canonicalName值以去掉对象本身的名称。我要到明天才能测试这个,但我会在测试后做出回应。我不知道SearchResultCollection类没有释放其所有非托管资源,感谢您提供此信息。我最不想看到的是内存泄漏,我必须通过1000行代码才能找到。没问题。很乐意帮忙。我已经在这里记录了一些其他的技巧,尽管在这个特定的案例中你没有更多的技巧可以应用:伟大的阅读。对于这些类型的场景非常详细和有组织。非常感谢。
(&(objectClass=computer)(sAMAccountName=MACHINE_NAME$))
search.PropertiesToLoad.Add("canonicalName");
...
objSurveyComputers.OU = (String)result.Properties["canonicalName"][0];