从Active Directory获取计算机名称

时间:2010-05-27 13:10:05

标签: active-directory ldap

我已执行“LDAP://”查询以获取指定OU中的计算机列表,我的问题是无法仅收集计算机“名称”甚至“cn”。

        DirectoryEntry toShutdown = new DirectoryEntry("LDAP://" + comboBox1.Text.ToString());
        DirectorySearcher machineSearch = new DirectorySearcher(toShutdown);
        //machineSearch.Filter = "(objectCatergory=computer)";
        machineSearch.Filter = "(objectClass=computer)";
        machineSearch.SearchScope = SearchScope.Subtree;
        machineSearch.PropertiesToLoad.Add("name");
        SearchResultCollection allMachinesCollected = machineSearch.FindAll();
        Methods myMethods = new Methods();
        string pcName;
        foreach (SearchResult oneMachine in allMachinesCollected)
        {
            //pcName = oneMachine.Properties.PropertyNames.ToString();
            pcName = oneMachine.Properties["name"].ToString();
            MessageBox.Show(pcName);
        }

非常感谢。

1 个答案:

答案 0 :(得分:2)

如果您可以升级到.NET 3.5,我肯定会建议您这样做。

使用.NET 3.5,您将获得一个新的System.DirectoryServices.AccountManagement命名空间,这使得很多这些操作变得更容易。

要查找所有计算机并枚举它们,您可以执行以下操作:

// define a domain context - use your NetBIOS domain name
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN");

// set up the principal searcher and give it a "prototype" of what you want to
// search for (Query by Example) - here: a ComputerPrincipal
PrincipalSearcher srch = new PrincipalSearcher();
srch.QueryFilter = new ComputerPrincipal(ctx);;

// do the search
PrincipalSearchResult<Principal> results = srch.FindAll();

// enumerate over results
foreach(ComputerPrincipal cp in results)
{
   string computerName = cp.Name;
}

查看MSDN杂志上的Managing Directory Security Principals in the .NET Framework 3.5,了解有关新S.DS.AM命名空间及其提供的内容的更多信息。

如果您无法升级到.NET 3.5 - 您只需要记住,从搜索结果中获得的.Properties["name"]值集合 - 所以为了获取实际的PC名称,请使用:

pcName = oneMachine.Properties["name"][0].ToString();

您需要使用.Properties["name"]索引[0]集合以获取第一个条目(通常也是唯一的条目 - 几乎没有任何计算机具有多个名称)。