我已执行“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);
}
非常感谢。
答案 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]
集合以获取第一个条目(通常也是唯一的条目 - 几乎没有任何计算机具有多个名称)。