本文主要示例winform中的异步調用,至于活動目錄等相關知識,還需另查資料.
要完成本例的調試,需在一個窗体上加一個richTextBox1和一button1.點button1時會在richTextBox1中顯示所有域名及其下的各計算机名稱和IP地址.一台電計算机顯示一行,如果有多個IP也顯示在同一行.
using System.Threading;
using System.DirectoryServices;
using System.Net;
public void ShowComputers()
{
//or use "WinNT://your_domain_name"
DirectoryEntry root = new DirectoryEntry("WinNT:");
DirectoryEntries domains = root.Children;
domains.SchemaFilter.Add("domain");
foreach (DirectoryEntry domain in domains)
{
AddContent(domain.Name+"/t/r");
DirectoryEntries computers = domain.Children;
computers.SchemaFilter.Add("computer");
foreach (DirectoryEntry computer in computers)
{
AddContent("/t" + computer.Name);
IPHostEntry iphe;
try
{
iphe = Dns.GetHostEntry(computer.Name);
foreach (IPAddress ip in iphe.AddressList)
{
AddContent("/t/t" + ip);//多個网卡顯示在一行
}
AddContent("/r");
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
AddContent("/t/t" + "未知"+"/r");
}
//DirectoryEntries users = computer.Children;
}
}
Complete("完成");
}
private void button1_Click(object sender, EventArgs e)
{
this.button1.Text = "正在查找....";
ThreadStart threadStart = new ThreadStart(ShowComputers);//通过ThreadStart委托告诉子线程执行什么方法
Thread thread = new Thread(threadStart);
thread.Start();
}
delegate void changeText(string result);
private void AddContent(string content)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new changeText(AddContent), content);
}
else
{
this.richTextBox1.AppendText(content);
}
}
private void Complete(string content)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new changeText(Complete), content);
}
else
{
this.button1.Text = content;
}
}