波斯马BOSSMA Information Technology

c#(WinForm)遍历局域网计算机(电脑)获取IP和计算机名称

发布时间:2010年8月25日 / 分类:ASP.NET, WinForm / 22,657 次浏览 / 评论

c#可以遍历局域网计算机,获取全部计算机的名称和IP地址,网上提供了相关的几种方法,并对效率进行了比较,但是没有对各种方法进行比较,以确定可以使用的情况。这篇文章将对这几种方法进行分析,以帮助了解各种方法适用的情况。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.NetworkInformation;
using System.IO;
using System.Collections;
using System.Diagnostics;
using System.DirectoryServices;
using System.Management;

namespace SocketTransferFile
{
 /// <summary>
 ///
 /// </summary>
 public partial class Form1 : Form
 {
 //局域网计算机列表
 List<LocalMachine> machineList = new List<LocalMachine>();

 //Form构造函数
 public Form1()
 {
 InitializeComponent();
 InitData();
 }

 /// <summary>
 /// 初始化数据
 /// </summary>
 private void InitData()
 {
 lvLocalMachine.Items.Clear();
 machineList.Clear();

 //获取当前域的计算机列表
 label4.Text = DateTime.Now.ToString();
 GetAllLocalMachines();

 foreach (LocalMachine machine in machineList)
 {
 ListViewItem item = new ListViewItem(new string[] { machine.Name, machine.IP });
 lvLocalMachine.Items.Add(item);
 }
 label5.Text = DateTime.Now.ToString();

 //获取Active Directory中的计算机节点
 //label4.Text = DateTime.Now.ToString();
 //EnumComputers();
 //label5.Text = DateTime.Now.ToString();

 //获取指定IP范围内的计算机
 //label4.Text = DateTime.Now.ToString();
 //EnumComputersByPing();
 //label5.Text = DateTime.Now.ToString();
 }

 /// <summary>
 /// Handles the Click event of the button1 control.
 /// </summary>
 /// <param name="sender">The source of the event.</param>
 /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
 private void button1_Click(object sender, EventArgs e)
 {
 InitData();
 }

 /// <summary>
 /// 获取指定IP范围内的计算机
 /// </summary>
 private void EnumComputersByPing()
 {
 try
 {
 for (int i = 1; i <= 254; i++)
 {
 Ping myPing;
 myPing = new Ping();
 myPing.PingCompleted += new PingCompletedEventHandler(_myPing_PingCompleted);

 string pingIP = "192.168.1." + i.ToString();
 myPing.SendAsync(pingIP, 1000, null);
 }
 }
 catch
 {
 }
 }

 /// <summary>
 /// Handles the PingCompleted event of the _myPing control.
 /// </summary>
 /// <param name="sender">The source of the event.</param>
 /// <param name="e">The <see cref="System.Net.NetworkInformation.PingCompletedEventArgs"/> instance containing the event data.</param>
 private void _myPing_PingCompleted(object sender, PingCompletedEventArgs e)
 {
 if (e.Reply.Status == IPStatus.Success)
 {
 LocalMachine localMachine = new LocalMachine();
 localMachine.IP = e.Reply.Address.ToString();
 //localMachine.Name = Dns.GetHostByAddress(IPAddress.Parse(e.Reply.Address.ToString())).HostName;
 localMachine.Name = Dns.Resolve(e.Reply.Address.ToString()).HostName;

 ListViewItem item = new ListViewItem(new string[] { localMachine.Name, localMachine.IP });
 lvLocalMachine.Items.Add(item);
 }
 }

 /// <summary>
 /// 获取Active Directory中的计算机节点
 /// </summary>
 private void EnumComputers()
 {
 using (DirectoryEntry root = new DirectoryEntry("WinNT:"))
 {
 foreach (DirectoryEntry domain in root.Children)
 {
 foreach (DirectoryEntry computer in domain.Children)
 {
 if (computer.Name == "Schema")
 {
 continue;
 }

 try
 {
 LocalMachine localMachine = new LocalMachine();
 localMachine.IP = Dns.GetHostEntry(computer.Name).AddressList[0].ToString();
 localMachine.Name = computer.Name;

 ListViewItem item = new ListViewItem(new string[] { localMachine.Name, localMachine.IP });
 lvLocalMachine.Items.Add(item);
 }
 catch
 {

 }
 }
 }
 }
 }

 /// <summary>
 /// 获取当前域的计算机列表
 /// </summary>
 /// <returns></returns>
 private void GetAllLocalMachines()
 {
 Process p = new Process();
 p.StartInfo.FileName = "net";
 p.StartInfo.Arguments = "view";
 p.StartInfo.UseShellExecute = false;
 p.StartInfo.RedirectStandardInput = true;
 p.StartInfo.RedirectStandardOutput = true;
 p.StartInfo.RedirectStandardError = true;
 p.StartInfo.CreateNoWindow = true;
 p.Start();
 p.StandardInput.WriteLine("exit");

 StreamReader reader = p.StandardOutput;

 for (string line = reader.ReadLine(); line != null; line = reader.ReadLine())
 {
 line = line.Trim();
 if (line.StartsWith(@"\\"))
 {
 string name = line.Substring(2).Trim();

                    //如果有路由器,会列出路由器,但是获取不到IP地址,会报错
 try
 {
 LocalMachine localMachine = new LocalMachine();

 localMachine.IP = Dns.GetHostEntry(name).AddressList[0].ToString();
 localMachine.Name = name;

 machineList.Add(localMachine);
 }
 catch
 {
 }
 }
 }
 }
 }

public class LocalMachine
{
    public string IP { get; set; }
    public string Name { get; set; }
}
}

这里使用了三种方法遍历局域网计算机。
1、获取当前域的计算机列表:GetAllLocalMachines
使用net命令,传递参数view,列出当前电脑所在域的所有计算机名称(完整的计算机名称)。
然后通过计算机名称获取IP地址。
适合局域网单一域的情况,测试了几次比DirectoryEntry的方式要快,不过没有进行大规模更广泛的测试。
可能无法获取工作组的服务器列表。

2、获取Active Directory中的计算机节点:EnumComputers
通过DirectoryEntry查找WinNT下的子节点,获取局域网中全部计算机的名称(完整的计算机名称)。
然后通过计算机名称获取IP地址。
可以获取局域网全部的计算机,不仅是某一个域的。速度比较慢。

3、获取指定IP范围内的计算机:EnumComputersByPing
适用c#自带的Ping,扫描当前计算机所在网段的IP地址,如果有回应,则证明计算机存在。
然后通过IP地址获取计算机名称(不一定是真正的计算机名称,可能是IIS的名称)。
需要指定IP段,不能获取真正的计算机名称。速度较快。如果需要过滤掉网关,还得自己写判断。

还有通过arp命令,和使用net命令类似,但是只能获取IP和mac地址,不能获取计算机名称。

具体什么情况使用什么样的方法,大家自己选择好了。如果有更好更完善的方法,欢迎提出来交流一下。

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自波斯马,原文地址《c#(WinForm)遍历局域网计算机(电脑)获取IP和计算机名称

关键字:

建议订阅本站,及时阅读最新文章!
【上一篇】 【下一篇】

发表评论