【问题标题】:List not outputting any data (System.DirectoryServices)列表不输出任何数据(System.DirectoryServices)
【发布时间】:2019-10-09 20:53:38
【问题描述】:

我目前有一个方法可以查询指定机器的规范名称和 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;
    }

【问题讨论】:

    标签: c# list methods active-directory


    【解决方案1】:

    您确实有一些需要纠正的地方:

    1. 没有computerName 属性。您所使用的属性称为sAMAccountName,这与用于用户帐户的用户名的属性相同。但是,对于计算机,它是计算机名称后跟$ 字符。所以你的搜索应该是这样的:
    (&(objectClass=computer)(sAMAccountName=MACHINE_NAME$))
    
    1. 属性名称从不包含空格。您需要 canonicalName 属性。我看到您将其分配给名为OU 的属性。请注意,canonicalName 在末尾包含对象本身的名称,而不仅仅是 OU。
    search.PropertiesToLoad.Add("canonicalName");
    ...
    objSurveyComputers.OU = (String)result.Properties["canonicalName"][0];
    
    1. 您在几个对象上调用.Dispose(),这很好(尽管不是绝对需要)。但最重要的要处理的是resultCol,因为documentation for SearchResultCollection 说:

    由于实现限制,SearchResultCollection 类在垃圾回收时无法释放其所有非托管资源。为防止内存泄漏,您必须在不再需要 SearchResultCollection 对象时调用 Dispose 方法。

    您也可以将其放在using statement 中,而不是手动调用.Dispose(),效果相同。

    【讨论】:

    • 谢谢你!这写得很好,感谢您的帮助。我计划修改 canonicalName 值以取出对象本身的名称。直到明天我才能对此进行测试,但是一旦我这样做了,我会对此做出回应。我不知道SearchResultCollection 类没有释放其所有非托管资源,感谢您提供此信息。我想要的最后一件事是内存泄漏,我必须挖掘 1,000 行代码才能找到。
    • 没问题。乐意效劳。我在这里记录了一些其他技巧,尽管在这种特定情况下您可以应用的仅此而已:Active Directory: Better performance
    • 很好读。这些类型的场景非常详细和有条理。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多