C#修改电脑IP信息帮助类

文章介绍了使用C#编写的IPProvider类,该类包含一系列方法来获取网络接口信息(IP、子网掩码、默认网关等),支持修改网络配置,以及根据MAC地址查询IP信息。主要涉及网络接口操作和Management类库的使用。
摘要由CSDN通过智能技术生成

最近在搞一个需要修改电脑网络IP信息的项目,自己整理了一个IPProvider静态帮助类,注意需要手动添加一下Management类库的引用,分享代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Management;
using System.Net;
using System.Net.NetworkInformation;
using System.Text;
using System.Threading.Tasks; 



public static class IPProvider
    {

        // 获取IP地址对应的网络接口
        public static NetworkInterface GetNetworkInterface(IPAddress ipAddress)
        {
            NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();
            foreach (NetworkInterface adapter in interfaces)
            {
                IPInterfaceProperties adapterProperties = adapter.GetIPProperties();
                foreach (var address in adapterProperties.UnicastAddresses)
                {
                    if (address.Address.Equals(ipAddress))
                    {
                        return adapter;
                    }
                }
            }
            return null;
        }

        //获取IPv4地址
        public static string GetIpv4Adress(NetworkInterface networkInterface)
        {
            IPInterfaceProperties adapterProperties = networkInterface.GetIPProperties();
            foreach (var unicastAddress in adapterProperties.UnicastAddresses)
            {
                if (unicastAddress.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                {

                    return unicastAddress.Address.ToString();
                }

            }
            return "未知";

        }

        // 获取子网掩码
        public static string GetSubnetMask(NetworkInterface networkInterface)
        {
            IPInterfaceProperties adapterProperties = networkInterface.GetIPProperties();
            foreach (var unicastAddress in adapterProperties.UnicastAddresses)
            {
                if (unicastAddress.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                {
                    return unicastAddress.IPv4Mask.ToString();
                }
            }
            return "未知";
        }

        // 获取默认网关
        public static string GetDefaultGateway(NetworkInterface networkInterface)
        {
            IPInterfaceProperties adapterProperties = networkInterface.GetIPProperties();
            foreach (var gatewayAddress in adapterProperties.GatewayAddresses)
            {
                return gatewayAddress.Address.ToString();
            }
            return "未知";
        }

        // 获取MAC地址
        public static string GetMacAddress(NetworkInterface networkInterface)
        {
            return BitConverter.ToString(networkInterface.GetPhysicalAddress().GetAddressBytes());
        }

        //获取所有本地网络信息
        public static void GetAllNetworks(ref Dictionary<string, string> AllNetworks)
        {
            AllNetworks.Clear();
            // 获取所有网络适配器
            NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces();
            foreach (NetworkInterface adapter in adapters)
            {
                // 如果适配器支持IPv4并且不是虚拟适配器
                if (adapter.Supports(NetworkInterfaceComponent.IPv4) && !adapter.Description.Contains("Virtual"))
                {
                    //适配器名称:  adapter.Name;
                    //描述:  adapter.Description;
                    //MAC 地址:  adapter.GetPhysicalAddress();
                    //类型:  adapter.NetworkInterfaceType;
                    //操作状态:  adapter.OperationalStatus;
                    // 获取IP属性
                    IPInterfaceProperties ipProperties = adapter.GetIPProperties();
                    // 获取IPv4地址集
                    UnicastIPAddressInformationCollection addresses = ipProperties.UnicastAddresses;
                    foreach (UnicastIPAddressInformation address in addresses)
                    {
                        //ip版本4的地址并且不是本地回环地址
                        if (address.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork && !IPAddress.IsLoopback(address.Address))
                        {
                            if (!AllNetworks.Keys.Contains(adapter.Name))
                                AllNetworks.Add(adapter.Name, address.Address.ToString() + ":" + address.IPv4Mask.ToString());
                            //IPv4 地址:  address.Address
                            //子网掩码:  address.IPv4Mask
                        }
                    }
                }
            }


        }

        /// <summary>
        /// 根据已知Ip,修改改网口的网络信息
        /// </summary>
        /// <param name="OriginalIP">目标网口IP</param>
        /// <param name="ipAddress">新的Ip</param>
        /// <param name="subnetMask">新的子网掩码</param>
        /// <param name="defaultGateway">新的默认网关</param>
        public static void ModifyIPAddress(string OriginalIP, string ipAddress, string subnetMask, string defaultGateway, string dns = null)
        {
            ManagementClass mgmtClass = new ManagementClass("Win32_NetworkAdapterConfiguration");
            ManagementObjectCollection mgmtObjects = mgmtClass.GetInstances();

            foreach (ManagementObject mgmtObject in mgmtObjects)
            {
                if ((bool)mgmtObject["IPEnabled"])
                {
                    string[] addresses = (string[])mgmtObject["IPAddress"];
                    if (addresses != null && addresses.Length > 0 && addresses[0] == OriginalIP)
                    {
                        // 设置新的IP地址信息
                        ManagementBaseObject newIP = mgmtObject.GetMethodParameters("EnableStatic");
                        newIP["IPAddress"] = new string[] { ipAddress };
                        newIP["SubnetMask"] = new string[] { subnetMask };
                        ManagementBaseObject setIP = mgmtObject.InvokeMethod("EnableStatic", newIP, null);

                        //设置网关地址 
                        if (String.IsNullOrEmpty(defaultGateway))
                        {
                            mgmtObject.InvokeMethod("SetGateways", null);
                        }
                        else
                        {
                            // 设置新的默认网关
                            ManagementBaseObject newGateway = mgmtObject.GetMethodParameters("SetGateways");
                            newGateway["DefaultIPGateway"] = new string[] { defaultGateway };
                            newGateway["GatewayCostMetric"] = new int[] { 1 };
                            ManagementBaseObject setGateway = mgmtObject.InvokeMethod("SetGateways", newGateway, null);
                        }

                        //设置DNS 
                        if (String.IsNullOrEmpty(dns))
                        {
                            mgmtObject.InvokeMethod("SetDNSServerSearchOrder", null);
                        }
                        else
                        {
                            ManagementBaseObject newDNS = mgmtObject.GetMethodParameters("SetDNSServerSearchOrder");
                            newDNS["DNSServerSearchOrder"] = new string[] { dns }; //newDNS["DNSServerSearchOrder"] = new string[] { "DNS服务器地址1", "DNS服务器地址2" };
                            ManagementBaseObject setDNS = mgmtObject.InvokeMethod("SetDNSServerSearchOrder", newDNS, null);
                        }

                    }
                }
            }
        }


        /// <summary>
        /// 根据已知Ip地址,获取IP地址,子网掩码,默认网关信息[通过Management类库]
        /// </summary>
        /// <param name="OriginalIP"></param>
        /// <returns></returns>
        public static string getIPfromOriginalIP(string OriginalIP)
        {

            try
            {
                string ret = null;
                ManagementClass wmi = new ManagementClass("Win32_NetworkAdapterConfiguration");
                ManagementObjectCollection moc = wmi.GetInstances();
                foreach (ManagementObject mo in moc)
                {
                    如果没有启用IP设置的网络设备则跳过
                    //if (!(bool)mo["IPEnabled"])
                    //{
                    //    continue;
                    //}
                    if (mo["IPAddress"] != null)
                    {
                        string CurIP = (mo["IPAddress"] as String[])[0];
                        if (OriginalIP == CurIP)
                        {

                            //string caption = mo["Caption"].ToString();
                            //string mac = mo["MacAddress"].ToString();//Mac地址                    
                            string IPAddress = (mo["IPAddress"] as String[])?[0];//IP地址
                            string IPSubnet = (mo["IPSubnet"] as String[])?[0];//子网掩码
                            string DefaultIPGateway = (mo["DefaultIPGateway"] as String[])?[0];//默认网关
                            ret = IPAddress + "," + IPSubnet + "," + DefaultIPGateway;
                        }
                    }
                    mo.Dispose();
                }
                return ret;
            }
            catch (Exception)
            {
                return null;
            }


        }


        /// <summary>
        /// 根据MAC地址获取对应的IP地址
        /// </summary>
        /// <param name="macAddress">MAC</param>
        /// <returns>返回IP地址</returns>
        public static string GetIPAddressByMacAddress(string macAddress)
        {
            foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
            {
                判断网口是否连接
                //if (nic.OperationalStatus == OperationalStatus.Up)
                //{                  
                //}

                // 遍历网口的物理地址,查找匹配的MAC地址
                if (nic.GetPhysicalAddress().ToString().ToUpper() == macAddress.Replace("-", "").ToUpper())
                {
                    foreach (UnicastIPAddressInformation ip in nic.GetIPProperties().UnicastAddresses)
                    {
                        // 返回找到的IP地址
                        if (ip.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                        {
                            return ip.Address.ToString();
                        }
                    }
                }
            }

            // 没有找到匹配的IP地址
            return null;
        }


        /// <summary>
        /// 获取所有已识别以太网接口的Ip地址
        /// </summary>
        /// <returns></returns>
        public static List<string> getLocalNetworks()
        {
            List<string> Networks = new List<string>();
            try
            {
                // 获取本地计算机的所有网络接口
                NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();

                // 遍历每个网络接口
                foreach (NetworkInterface networkInterface in networkInterfaces)
                {
                    // 仅考虑以太网接口&&网口处于连接状态
                    if (networkInterface.NetworkInterfaceType == NetworkInterfaceType.Ethernet && networkInterface.OperationalStatus == OperationalStatus.Up)// || networkInterface.NetworkInterfaceType == NetworkInterfaceType.Wireless80211)
                    {
                        // 获取网络接口的IP属性
                        IPInterfaceProperties ipProperties = networkInterface.GetIPProperties();

                        // 遍历每个IP地址信息
                        foreach (UnicastIPAddressInformation ipInfo in ipProperties.UnicastAddresses)
                        {
                            // 仅考虑IPv4地址
                            if (ipInfo.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                            {
                                Networks.Add(ipInfo.Address.ToString());
                                // Console.WriteLine($"Interface: {networkInterface.Name}, IP Address: {ipInfo.Address}");
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Exception: {ex.Message}");
            }

            return Networks;

        }


        /// <summary>
        /// 根据已知mac地址,获取IP地址
        /// </summary>
        /// <param name="mac">返回IP地址</param>
        /// <returns></returns>
        public static string GetIpv4FromMACAddress(string mac)
        {
            try
            {
                string IPAddress = null;
                ManagementClass wmi = new ManagementClass("Win32_NetworkAdapterConfiguration");
                ManagementObjectCollection moc = wmi.GetInstances();
                foreach (ManagementObject mo in moc)
                {
                    //如果没有启用IP设置的网络设备则跳过
                    if (!(bool)mo["IPEnabled"])
                    {
                        continue;
                    }
                    if (mo["MACAddress"] != null)
                    {
                        string momac = mo["MacAddress"].ToString().Replace(":", "").Replace("-", "").ToUpper();
                        mac = mac.ToUpper();
                        if (momac == mac)
                        {
                            //string Caption = mo["Caption"].ToString();
                            //string MacAddress = mo["MacAddress"].ToString();//Mac地址   
                            //string IPSubnet = (mo["IPSubnet"] as String[])[0];//子网掩码
                            //string DefaultIPGateway = (mo["DefaultIPGateway"] as String[])[0];//默认网关                 
                            IPAddress = (mo["IPAddress"] as String[])[0];//IP地址

                        }

                    }

                    mo.Dispose();
                }
                return IPAddress;
            }
            catch (Exception)
            {
                return null;
            }

        }

        /// <summary>
        /// 根据已知mac地址,获取IP子网掩码
        /// </summary>
        /// <param name="mac">返回IP子网掩码</param>
        /// <returns></returns>
        public static string GetSubnetMaskFromMACAddress(string mac)
        {
            try
            {
                string SubnetMask = null;
                ManagementClass wmi = new ManagementClass("Win32_NetworkAdapterConfiguration");
                ManagementObjectCollection moc = wmi.GetInstances();
                foreach (ManagementObject mo in moc)
                {
                    //如果没有启用IP设置的网络设备则跳过
                    if (!(bool)mo["IPEnabled"])
                    {
                        continue;
                    }
                    if (mo["MACAddress"] != null)
                    {
                        string momac = mo["MacAddress"].ToString().Replace(":", "").Replace("-", "").ToUpper();
                        mac = mac.ToUpper();
                        if (momac == mac)
                        {
                            //string Caption = mo["Caption"].ToString();
                            //string MacAddress = mo["MacAddress"].ToString();//Mac地址   
                            SubnetMask = (mo["IPSubnet"] as String[])[0];//子网掩码
                            //string DefaultIPGateway = (mo["DefaultIPGateway"] as String[])[0];//默认网关                 
                            //string IPAddress = (mo["IPAddress"] as String[])[0];//IP地址


                        }

                    }

                    mo.Dispose();
                }
                return SubnetMask;
            }
            catch (Exception)
            {
                return null;
            }

        }

        /// <summary>
        /// 根据已知mac地址,获取IP默认网关
        /// </summary>
        /// <param name="mac">返回IP默认网关</param>
        /// <returns></returns>
        public static string GetDefaultGatewayFromMACAddress(string mac)
        {
            try
            {
                string DefaultGateway = null;
                ManagementClass wmi = new ManagementClass("Win32_NetworkAdapterConfiguration");
                ManagementObjectCollection moc = wmi.GetInstances();
                foreach (ManagementObject mo in moc)
                {
                    //如果没有启用IP设置的网络设备则跳过
                    if (!(bool)mo["IPEnabled"])
                    {
                        continue;
                    }
                    if (mo["MACAddress"] != null)
                    {
                        string momac = mo["MacAddress"].ToString().Replace(":", "").Replace("-", "").ToUpper();
                        mac = mac.ToUpper();
                        if (momac == mac)
                        {
                            //string Caption = mo["Caption"].ToString();
                            //string MacAddress = mo["MacAddress"].ToString();//Mac地址   
                            //string IPSubnet = (mo["IPSubnet"] as String[])[0];//子网掩码
                            DefaultGateway = (mo["DefaultIPGateway"] as String[])[0];//默认网关                 
                            //string IPAddress = (mo["IPAddress"] as String[])[0];//IP地址


                        }

                    }

                    mo.Dispose();
                }
                return DefaultGateway;
            }
            catch (Exception)
            {
                return null;
            }

        }


        /// <summary>
        /// 匹配IP地址是否合法
        /// </summary>
        /// <param name="ip">当前需要匹配的IP地址</param>
        /// <returns>true:表示合法</returns>
        public static bool MatchIP(string ip)
        {
            bool success = false;
            if (!string.IsNullOrEmpty(ip))
            {
                //判断是否为IP
                success = System.Text.RegularExpressions.Regex.IsMatch(ip, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$");
            }
            return success;
        }

        /// <summary>
        /// 匹配端口是否合法
        /// </summary>
        /// <param name="port">当前需要匹配的端口地址</param>
        /// <returns>true:表示合法</returns>
        public static bool MatchPort(int port)
        {
            bool success = false;
            if (port >= 0 && port <= 65535)
            {
                success = true;
            }
            return success;
        }


        /// <summary>
        /// 检查IP是否可ping通
        /// </summary>
        /// <param name="strIP">要检查的IP</param>
        /// <returns>是否可连通【true:表示可以连通】</returns>
        public static bool CheckIPIsPing(string strIP)
        {
            if (!string.IsNullOrEmpty(strIP))
            {
                if (!MatchIP(strIP))
                {
                    return false;
                }
                // Windows L2TP VPN和非Windows VPN使用ping VPN服务端的方式获取是否可以连通
                Ping pingSender = new Ping();
                PingOptions options = new PingOptions();

                // 使用默认的128位值
                options.DontFragment = true;

                //创建一个32字节的缓存数据发送进行ping
                string data = "testtesttesttesttesttesttesttest";
                byte[] buffer = Encoding.ASCII.GetBytes(data);
                int timeout = 120;
                PingReply reply = pingSender.Send(strIP, timeout, buffer, options);

                return (reply.Status == IPStatus.Success);
            }
            else
            {
                return false;
            }
        }


        /// <summary>
        /// 匹配子网掩码是否合法
        /// </summary>
        /// <param name="mask">当前需要匹配的子网掩码地址</param>
        /// <returns></returns>
        public static bool MatchMask(string mask)
        {
            string[] vList = mask.Split('.');
            if (vList.Length != 4) return false;

            bool vZero = false; // 出现0 
            for (int j = 0; j < vList.Length; j++)
            {
                int i;
                if (!int.TryParse(vList[j], out i)) return false;
                if ((i < 0) || (i > 255)) return false;
                if (vZero)
                {
                    if (i != 0) return false;
                }
                else
                {
                    for (int k = 7; k >= 0; k--)
                    {
                        if (((i >> k) & 1) == 0) // 出现0 
                        {
                            vZero = true;
                        }
                        else
                        {
                            if (vZero) return false; // 不为0 
                        }
                    }
                }
            }

            return true;
        }


    }

  • 22
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值