zoukankan      html  css  js  c++  java
  • c#(WinForm)遍历局域网计算机(电脑)获取IP和计算机名称(转)

    http://blog.bossma.cn/dotnet/csharp_winform_lan_get_ip_and_computername/

    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
                        {
                        }
                    }
                }
            }
        }
    }

    这里使用了三种方法遍历局域网计算机。
    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地址,不能获取计算机名称。


  • 相关阅读:
    Atitit. 真正的全中国文字attilax易语言的特点以及范例
    Atitit.nosql api 标准化 以及nosql数据库的实现模型分类差异
    Google&quot;员工&quot;曝内幕:Google员工的17个秘密
    WINDOWS 乱码解决
    计算机软件开发文档编写指南
    概要设计阶段概要设计说明书
    关于管理的经典故事(员工激励)
    概要设计阶段组装测试计划
    一个还不太老的程序员的体会
    程序员四大忌 你该如何避免呢?
  • 原文地址:https://www.cnblogs.com/quietwalk/p/2110350.html
Copyright © 2011-2022 走看看