C#获取本机网络连接名,获取和设置IP地址

C#获取本机网络连接名,获取和设置IP地址,使用WMI接口

新建windowsForm应用程序GetAndSetIpAddressDemo,将默认的窗体Form1重命名为FormGetAndSetIP。添加对System.Management 类库的引用。

窗体设计FormGetAndSetIP如图:

主要源程序如下(忽略自动生成的事件等代码):

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Management;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

/*
 * DHCP(Dynamic Host Configuration Protocol),动态主机配置协议,是一个应用层协议。
 * 当我们将客户主机ip地址设置为动态获取方式时,DHCP服务器就会根据DHCP协议给客户端分配IP,使得客户机能够利用这个IP上网。
*/

namespace GetAndSetIpAddressDemo
{
    public partial class FormGetAndSetIP : Form
    {
        public FormGetAndSetIP()
        {
            InitializeComponent();
        }

        private void FormGetAndSetIP_Load(object sender, EventArgs e)
        {
            cboLocalIP.Items.Clear();//清空本地连接IP列表
            cboWirelessIP.Items.Clear();//清空无线网络连接IP列表
            ManagementClass managementClass = new ManagementClass("Win32_NetWorkAdapterConfiguration");
            ManagementObjectCollection managementObjectCollection = managementClass.GetInstances();
            foreach (ManagementObject managementObject in managementObjectCollection)
            {
                if (Convert.ToBoolean(managementObject["IPEnabled"]))
                {
                    if (managementObject["IPAddress"] != null)
                    {
                        DisplayInfo($"本地计算机所有网卡信息:【{managementObject["Description"]}】");
                    }
                    PropertyDataCollection propertyDataCollection = managementObject.Properties;
                    foreach (PropertyData propertyData in propertyDataCollection)
                    {
                        object val = propertyData.Value;
                        //如果是字符串数组
                        if (propertyData.IsArray)
                        {
                            if (val is string[])
                                val = string.Join(",", val as string[]);
                            else if (val is ushort[])
                                val = string.Join(",", val as ushort[]);
                            else if (val is uint[])
                                val = string.Join(",", val as uint[]);
                        }
                        //通用信息模型(CIM,Common Information Model)
                        //限定符信息:一般为CimType信息
                        List<string> listQualifier = new List<string>();
                        foreach (QualifierData qualifierData in propertyData.Qualifiers)
                        {
                            listQualifier.Add($"[{qualifierData.Name}:{qualifierData.Value}]");
                        }
                        DisplayInfo($"Name:【{propertyData.Name}】,Value:【{val}】,Type:【{propertyData.Type}】,IsArray:【{propertyData.IsArray}】,Qualifier:【{string.Join(",", listQualifier)}】");
                    }
                }
            }
            DataTable dataTable = new DataTable("NetInterfaces");
            dataTable.Columns.Add("编号", typeof(int));
            dataTable.Columns.Add("网络适配器名称", typeof(string));
            dataTable.Columns.Add("正在被使用", typeof(bool));
            dataTable.Columns.Add("操作状态", typeof(string));
            dataTable.Columns.Add("接口类型", typeof(string));
            dataTable.Columns.Add("标识符", typeof(string));
            dataTable.Columns.Add("媒体访问控制(MAC)", typeof(string));
            dataTable.Columns.Add("接口速度(位每秒)", typeof(long));
            dataTable.Columns.Add("接口说明", typeof(string));
            dataTable.Columns.Add("支持IPv4协议", typeof(bool));
            dataTable.Columns.Add("支持IPv6协议", typeof(bool));
            dataTable.Columns.Add("IP地址集合", typeof(string));
            int count = 0;
            foreach (NetworkInterface netInterface in NetworkInterface.GetAllNetworkInterfaces())
            {
                count++;
                DisplayInfo($"第【{count}】个网络接口名:{netInterface.Name}");
                //当前正在使用的网络接口。接口操作状态为up;
                //本地连接:接口类型为Ethernet以太网。 回环测试(127.0.0.1):接口类型为Loopback
                //本机的测试环境是Wireless:无线连接
                if (netInterface.OperationalStatus == OperationalStatus.Up)
                {
                    DisplayInfo($"--该网络接口正在被使用...");
                }
                DisplayInfo($"    当前操作状态:{netInterface.OperationalStatus}");
                DisplayInfo($"    网络接口类型:{netInterface.NetworkInterfaceType}");
                DisplayInfo($"    网络适配器的标识符:{netInterface.Id}");
                DisplayInfo($"    接口MAC:{netInterface.GetPhysicalAddress()}");//MAC:媒体访问控制,介质访问控制(Medium Access Control)
                DisplayInfo($"    接口速度(位每秒,bitwise/s):{netInterface.Speed}");
                DisplayInfo($"    接口描述信息:{netInterface.Description}");
                DisplayInfo($"    是否支持IPv4协议:{netInterface.Supports(NetworkInterfaceComponent.IPv4)}");
                DisplayInfo($"    是否支持IPv6协议:{netInterface.Supports(NetworkInterfaceComponent.IPv6)}");
                DisplayInfo($"    接口配置的IP地址:");
                List<string> listAddresses = new List<string>();
                foreach (UnicastIPAddressInformation ipIntProp in netInterface.GetIPProperties().UnicastAddresses.ToArray<UnicastIPAddressInformation>())
                {
                    listAddresses.Add($"IP:【{ipIntProp.Address}】,类型:【{ipIntProp.Address.AddressFamily}】");
                    DisplayInfo($"        IP:【{ipIntProp.Address}】,类型:【{ipIntProp.Address.AddressFamily}】");
                    if (netInterface.NetworkInterfaceType == NetworkInterfaceType.Ethernet && ipIntProp.Address.AddressFamily == AddressFamily.InterNetwork)
                    {
                        cboLocalIP.Items.Add(ipIntProp.Address.ToString());
                    }
                    else if (netInterface.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 && ipIntProp.Address.AddressFamily == AddressFamily.InterNetwork)
                    {
                        cboWirelessIP.Items.Add(ipIntProp.Address.ToString());
                    }
                }
                dataTable.Rows.Add(count, netInterface.Name, netInterface.OperationalStatus == OperationalStatus.Up, netInterface.OperationalStatus, netInterface.NetworkInterfaceType, netInterface.Id, netInterface.GetPhysicalAddress(),
                    netInterface.Speed, netInterface.Description, netInterface.Supports(NetworkInterfaceComponent.IPv4), netInterface.Supports(NetworkInterfaceComponent.IPv6), string.Join(";", listAddresses));
            }

            List<Tuple<string, string>> tuples = new List<Tuple<string, string>>()
            {
                Tuple.Create("编号", "编号"),
                Tuple.Create("网络适配器名称", "网络适配器名称"),
                Tuple.Create("正在被使用", "正在被使用"),
                Tuple.Create("操作状态", "操作状态"),
                Tuple.Create("接口类型", "接口类型"),
                Tuple.Create("标识符", "标识符"),
                Tuple.Create("媒体访问控制(MAC)", "媒体访问控制(MAC)"),
                Tuple.Create("接口速度(位每秒)", "接口速度(位每秒)"),
                Tuple.Create("接口说明", "接口说明"),
                Tuple.Create("支持IPv4协议", "支持IPv4协议"),
                Tuple.Create("支持IPv6协议", "支持IPv6协议"),
                Tuple.Create("IP地址集合", "IP地址集合")
            };
            SetDataGridViewColumns(tuples);
            dgvIpList.DataSource = dataTable;
        }

        /// <summary>
        /// 数据网格绑定列配置
        /// </summary>
        /// <param name="tuples"></param>
        private void SetDataGridViewColumns(List<Tuple<string, string>> tuples)
        {
            dgvIpList.AutoGenerateColumns = false;
            for (int i = 0; i < tuples.Count; i++)
            {
                string columnName = tuples[i].Item1;
                string columnDescription = tuples[i].Item2;
                int minWidth = 50;
                DataGridViewColumn dgvc = new DataGridViewColumn();
                dgvc.CellTemplate = new DataGridViewTextBoxCell();
                dgvc.Name = "dgvc_" + columnName;
                dgvc.MinimumWidth = minWidth;
                dgvc.DataPropertyName = columnName;
                dgvc.HeaderText = (columnDescription == null || columnDescription.Trim().Length == 0) ? columnName : columnDescription;
                dgvIpList.Columns.Add(dgvc);
            }
        }

        /// <summary>
        /// 显示文本框的消息
        /// </summary>
        /// <param name="message"></param>
        private void DisplayInfo(string message)
        {
            this.BeginInvoke(new Action(() =>
            {
                if (rtxbResult.TextLength >= 204800)
                {
                    rtxbResult.Clear();
                }
                rtxbResult.AppendText($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} --> {message}\n");
                rtxbResult.ScrollToCaret();
            }));
        }

        private void btnConfirm_Click(object sender, EventArgs e)
        {
            ManagementClass managementClass = new ManagementClass("Win32_NetWorkAdapterConfiguration");
            ManagementObjectCollection managementObjectCollection = managementClass.GetInstances();
            foreach (ManagementObject managementObject in managementObjectCollection)
            {
                if (Convert.ToBoolean(managementObject["IPEnabled"]))
                {
                    ManagementBaseObject newIP = managementObject.GetMethodParameters("EnableStatic");
                    ManagementBaseObject newGateway = managementObject.GetMethodParameters("SetGateways");
                    ManagementBaseObject newDNS = managementObject.GetMethodParameters("SetDNSServerSearchOrder");
                    //目标IP地址:
                    newIP["IPAddress"] = new string[] { txtIPAddress.Text.Trim() };
                    //子网掩码:
                    newIP["SubnetMask"] = new string[] { txtSubnetMask.Text.Trim() };
                    //默认网关:
                    newGateway["DefaultIPGateway"] = new string[] { txtDefaultGateway.Text.Trim() };
                    newGateway["GatewayCostMetric"] = new int[] { 1 };
                    // 将要修改的目标  首选DNS服务器
                    // 将要修改的目标  备用DNS服务器
                    newDNS["DNSServerSearchOrder"] = new string[] { txtFirstDNS.Text.Trim(), txtSpareDNS.Text.Trim() };
                    // 修改网络设置
                    try
                    {
                        if (rdoAutoSetIP.Checked)
                        {
                            managementObject.InvokeMethod("EnableStatic", null);
                            //重置DNS为空
                            managementObject.InvokeMethod("SetDNSServerSearchOrder", null);
                            //开启DHCP
                            managementObject.InvokeMethod("EnableDHCP", null);
                            MessageBox.Show("自动获取IP成功!");
                        }
                        else
                        {
                            ManagementBaseObject setIP = managementObject.InvokeMethod("EnableStatic", newIP, null);
                            ManagementBaseObject setGateways = managementObject.InvokeMethod("SetGateways", newGateway, null);
                            ManagementBaseObject setDNS = managementObject.InvokeMethod("SetDNSServerSearchOrder", newDNS, null);
                            MessageBox.Show("手动设置IP成功");
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, "设置IP时出现异常");
                    }
                    break;
                }
            }
        }

        /// <summary>
        /// 重新读取按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnReload_Click(object sender, EventArgs e)
        {
            ManagementClass managementClass = new ManagementClass("Win32_NetWorkAdapterConfiguration");
            ManagementObjectCollection managementObjectCollection = managementClass.GetInstances();
            foreach (ManagementObject managementObject in managementObjectCollection)
            {
                if (Convert.ToBoolean(managementObject["IPEnabled"]))
                {
                    DisplayInfo($" Caption:{managementObject["Caption"]}\n ServiceName:{managementObject["ServiceName"]}\n MACAddress:{managementObject["MACAddress"]}");
                    rdoAutoSetIP.Checked = Convert.ToBoolean(managementObject["DHCPEnabled"]);
                    rdoManualSetIP.Checked = !Convert.ToBoolean(managementObject["DHCPEnabled"]);

                    string[] ipaddresses = (string[])managementObject["IPAddress"];
                    string[] subnets = (string[])managementObject["IPSubnet"];
                    string[] gateways = (string[])managementObject["DefaultIPGateway"];
                    string[] dnsSetting = (string[])managementObject["DNSServerSearchOrder"];

                    txtIPAddress.Text = ipaddresses[0];
                    txtSubnetMask.Text = subnets[0];
                    txtSubnetMask.Text = gateways[0];

                    if (dnsSetting.Length > 0)
                    {
                        txtFirstDNS.Text = dnsSetting[0];
                    }
                    if (dnsSetting.Length > 1)
                    {
                        txtSpareDNS.Text = dnsSetting[1];
                    }

                    rdoAutoSetIP_CheckedChanged(null, e);
                    break;
                }
            }
        }

        /// <summary>
        /// 自动获取IP和手动设置IP的单选按钮事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void rdoAutoSetIP_CheckedChanged(object sender, EventArgs e)
        {
            if (rdoAutoSetIP.Checked)
            {
                txtIPAddress.Clear();
                txtSubnetMask.Clear();
                txtDefaultGateway.Clear();
                pnlManualSetIP.Enabled = false;
            }
            else
            {
                pnlManualSetIP.Enabled = true;
            }
        }
    }
}

程序运行如图:

Guess you like

Origin blog.csdn.net/ylq1045/article/details/116993892