前言: 通过程序更改网卡网关

        公司内有多个网络出口,其中一个为固定IP的 带宽只有60M用于应用系统访问, 一个是一条千兆带宽的ADSL,但是只有电信内网IP。做开发调试尤其是企业微信接口涉及到接口白名单IP,需要走固定IP,而日常一些下载当然我选择用千兆带宽了,所以有时候就不得不在两个网关来进行切换。记录下自己这个自己写的小程序功能走过的一些弯路。


一、.net 版本的选择:

        最开始理所当然选择了.net 8的版本,但网上百度的代码都有用到System.Management ,但8的版本里面没有,反正都是自己用所以干脆就改到.net framwork 4的版本了。果然降了版本就可以引用到了。

二、多网卡的问题:

        我本机只有主板自带的一块网卡,以为通过调用 Win32_NetworkAdapterConfiguration ,查询出来的网卡也只有一块, 但我想简单了,调试做了个for循环降本机所有网卡的名称都遍历显示出来了。才发现有如此之多:

其中只有Intel(R) Ethernet Controller (3) I225-V 才是我需要设置的网卡。解决方法通过 mo["IPEnabled"]   过滤网卡 。简单粗暴一点就通过mo["Description"].toString() 来判断网卡的名称。

三、传递值给   inPar["DefaultIPGateway"] :

        注意这里传递过去的值需要是一个数组,而不是字符串,道理也很简单,网关是可以设置多个的。

四、核心代码:

        核心的代码如下:

ManagementBaseObject inPar = null;
            ManagementBaseObject outPar = null;
            ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
            ManagementObjectCollection moc = mc.GetInstances();
            foreach (ManagementObject mo in moc) {
                if(mo["Description"].ToString() == "Intel(R) Ethernet Controller (3) I225-V") {
                    inPar = mo.GetMethodParameters("SetGateways");
                    string[] GateWay = new string[] { changeToIP };                    
                    inPar["DefaultIPGateway"] =GateWay; //设置网关地址 1.网关;2.备用网关
                    outPar = mo.InvokeMethod("SetGateways", inPar, null);//执行
                }
            }

 五、悲剧发生:

        代码其实很简单,changeToIP就是需要更改的网关,很顺利的代码就跑起来了,然而悲剧了,没有任何报错提示,但就是不生效。最开始我还以为是网卡名称有误导致没有进入到if里面去 执行代码,打了断点发现代码是执行的。赶紧求助csdn和度娘,没有找到任何有用的信息。

六、解决方法:       

         突发奇想,难道是执行权限不够,可是我登录的账号Administrator权限的,司马当活马医了,到Debug目录下,右键以管理员身份运行,果然设置成功了。一上午的时间都浪费在排查为啥不成功的问题上了。


总结:

        网上代码很多都是前人经验的总结,如果跑不通,而你再网上有看到很多人都用了这些代码,不防换个思路想想,是不是操作系统版本问题,权限问题,也许排除了这些,问题就迎刃而解了。

03-27 16:33