7

您好,我一直在尝试向我的 Windows 窗体程序添加一个功能,该功能允许用户在文本框中键入他们想在 Active Directory 中搜索的计算机或计算机。用户将在文本框中输入搜索字符串,然后点击按钮,匹配该搜索结果的计算机将出现在单独的搜索框中。到目前为止,这是我的代码。

我还希望每台计算机名称都位于单独的行上,例如:

computername1            
computername2        
computername3

谢谢!

这是按钮内部的样子:

List<string> hosts = new List<string>();
DirectoryEntry de = new DirectoryEntry();
de.Path = "LDAP://servername";

try
{
    string adser = txtAd.Text; //textbox user inputs computer to search for

    DirectorySearcher ser = new DirectorySearcher(de);
    ser.Filter = "(&(ObjectCategory=computer)(cn=" + adser + "))"; 
    ser.PropertiesToLoad.Add("name");

    SearchResultCollection results = ser.FindAll();

    foreach (SearchResult res in results) 
    //"CN=SGSVG007DC" 
    {
       string computername = res.GetDirectoryEntry().Properties["Name"].Value.ToString();
       hosts.Add(computername);
       //string[] temp = res.Path.Split(','); //temp[0] would contain the computer name ex: cn=computerName,..
       //string adcomp = (temp[0].Substring(10));
       //txtcomputers.Text = adcomp.ToString();
    }

    txtcomputers.Text = hosts.ToString();
}
catch (Exception ex)
{
    MessageBox.Show(ex.ToString());
}
finally
{
    de.Dispose();//Clean up resources
}
4

1 回答 1

9

如果您使用的是 .NET 3.5 及更高版本,则应查看System.DirectoryServices.AccountManagement(S.DS.AM) 命名空间。在这里阅读所有相关信息:

基本上,您可以定义域上下文并在 AD 中轻松找到用户和/或组:

// set up domain context
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain))
{
   // find a computer
   ComputerPrincipal computer = ComputerPrincipal.FindByIdentity(ctx, "SomeComputerName");

   if (computer != null)
   {
       // do something here....     
   }
}    

如果您不需要查找单台计算机,而是搜索整个计算机列表,则可以使用新PrincipalSearcher界面,它基本上允许您设置一个“QBE”(按示例查询)对象查找、定义搜索条件,然后搜索这些条件的匹配项。

新的 S.DS.AM 命名空间使得在 AD 中玩弄用户和组变得非常容易!

于 2012-08-28T05:18:41.353 回答