zoukankan      html  css  js  c++  java
  • [原创]C#调用WMI更改本地网络IP设置

    因家中与公司的网络配置不同,而我又是带着我的笔记本在家里与公司来来回回.这就导致要经常设置不同的IP和网关数据,一段时间下来后觉得特烦,做为一个程序员.为什么不好好利用自己的知识偷懒一下呢?特别是像我这样一个懒惰的人...

    因为网络IP设置是要涉及到硬件,C#是没有现成接口调用的.只能通过调用API或者是WMI这道系统提供给我们的桥梁..在WMI这个大库中用于管理网络配置的则主要是通过"Win32_NetworkAdapterConfiguration"这个管理类.这里面已基本包括了IP,DNS,网关的设置信息...

    在C#中使用WMI是很轻松的事情.下面直接给出C#实现代码,呵呵,我的文字表达能力很差,所以我也不多说了,代码量很少,看起来应该很简单的:

      1using System;
      2using System.Collections;
      3using System.Text;
      4using System.Management;
      5using System.Text.RegularExpressions;
      6namespace Kingthy.Windows.IPChanger.Providers
      7{
      8    /// <summary>
      9    /// IPProvider 的摘要说明。
     10    /// </summary>

     11    public class IPProvider
     12    {
     13        public IPProvider()
     14        {
     15            //
     16            // TODO: 在此处添加构造函数逻辑
     17            //
     18        }

     19        /// <summary>
     20        /// 设置DNS
     21        /// </summary>
     22        /// <param name="dns"></param>

     23        public static void SetDNS(string[] dns)
     24        {
     25            SetIPAddress(null,null,null,dns);
     26        }

     27        /// <summary>
     28        /// 设置网关
     29        /// </summary>
     30        /// <param name="getway"></param>

     31        public static void SetGetWay(string getway)
     32        {
     33            SetIPAddress(null,null,new string[]{getway},null);
     34        }

     35        /// <summary>
     36        /// 设置网关
     37        /// </summary>
     38        /// <param name="getway"></param>

     39        public static void SetGetWay(string[] getway)
     40        {
     41            SetIPAddress(null,null,getway,null);
     42        }

     43        /// <summary>
     44        /// 设置IP地址和掩码
     45        /// </summary>
     46        /// <param name="ip"></param>
     47        /// <param name="submask"></param>

     48        public static void SetIPAddress(string ip,string submask)
     49        {
     50            SetIPAddress(new string[]{ip},new string[]{submask},null,null);
     51        }

     52        /// <summary>
     53        /// 设置IP地址,掩码和网关
     54        /// </summary>
     55        /// <param name="ip"></param>
     56        /// <param name="submask"></param>
     57        /// <param name="getway"></param>

     58        public static void SetIPAddress(string ip,string submask,string getway)
     59        {
     60            SetIPAddress(new string[]{ip},new string[]{submask},new string[]{getway},null);
     61        }

     62        /// <summary>
     63        /// 设置IP地址,掩码,网关和DNS
     64        /// </summary>
     65        /// <param name="ip"></param>
     66        /// <param name="submask"></param>
     67        /// <param name="getway"></param>
     68        /// <param name="dns"></param>

     69        public static void SetIPAddress(string[] ip,string[] submask,string[] getway,string[] dns)
     70        {
     71            ManagementClass wmi = new ManagementClass("Win32_NetworkAdapterConfiguration");
     72            ManagementObjectCollection moc = wmi.GetInstances();
     73            ManagementBaseObject inPar = null;
     74            ManagementBaseObject outPar = null;
     75            foreach(ManagementObject mo in moc)
     76            {
     77                //如果没有启用IP设置的网络设备则跳过
     78                if(!(bool)mo["IPEnabled"])continue;
     79
     80                //设置IP地址和掩码
     81                if(ip != null && submask != null)
     82                {
     83                    inPar = mo.GetMethodParameters("EnableStatic");
     84                    inPar["IPAddress"= ip;
     85                    inPar["SubnetMask"= submask;                
     86                    outPar = mo.InvokeMethod("EnableStatic",inPar,null);
     87                }

     88
     89                //设置网关地址
     90                if(getway != null)
     91                {
     92                    inPar = mo.GetMethodParameters("SetGateways");
     93                    inPar["DefaultIPGateway"= getway;
     94                    outPar = mo.InvokeMethod("SetGateways",inPar,null);
     95                }

     96
     97                //设置DNS地址
     98                if(dns != null)
     99                {
    100                    inPar = mo.GetMethodParameters("SetDNSServerSearchOrder");
    101                    inPar["DNSServerSearchOrder"= dns;
    102                    outPar = mo.InvokeMethod("SetDNSServerSearchOrder",inPar,null);
    103                }

    104            }

    105        }

    106
    107        /// <summary>
    108        /// 启用DHCP服务器
    109        /// </summary>

    110        public static void EnableDHCP()
    111        {
    112            ManagementClass wmi = new ManagementClass("Win32_NetworkAdapterConfiguration");
    113            ManagementObjectCollection moc = wmi.GetInstances();
    114            foreach(ManagementObject mo in moc)
    115            {
    116                //如果没有启用IP设置的网络设备则跳过
    117                if(!(bool)mo["IPEnabled"])continue;
    118
    119                //重置DNS为空
    120                mo.InvokeMethod("SetDNSServerSearchOrder",null);
    121                //开启DHCP
    122                mo.InvokeMethod("EnableDHCP",null);
    123            }

    124        }

    125
    126        /// <summary>
    127        /// 判断是否IP地址格式
    128        /// </summary>
    129        /// <param name="ip"></param>
    130        /// <returns></returns>

    131        public static bool IsIPAddress(string ip)
    132        {
    133            string[] arr = ip.Split('.');
    134            if(arr.Length != 4)return false;
    135
    136            string pattern = @"\d{1,3}";
    137            for(int i=0; i<arr.Length; i++)
    138            {
    139                string d = arr[i];
    140                if(i == 0 && d == "0")return false;
    141                if(!Regex.IsMatch(d,pattern))return false;
    142
    143                if(d != "0")
    144                {
    145                    d = d.TrimStart('0');
    146                    if(d == "")return false;
    147
    148                    if(int.Parse(d) > 255)return false;
    149                }

    150            }

    151
    152            return true;
    153        }

    154    }

    155}

    156


    注:关系Win32_NetworkAdapterConfiguration这个管理类可以参考这个教程
    http://www.microsoft.com/china/technet/community/scriptcenter/topics/networking/01_atnc_intro.mspx




    下面附上我根据上面的IPProvider做的一个仿系统更改网络IP界面的小程序界面.呵呵
  • 相关阅读:
    MySQL Create table as / Create table like
    Oracle CAST() 函数 数据类型的转换
    day 12
    day 11
    day 10
    day 9
    day 8
    day 7
    day 6
    day 5
  • 原文地址:https://www.cnblogs.com/kingthy/p/894338.html
Copyright © 2011-2022 走看看