c# 更改网卡的默认网关

本文描述了作者如何在.NET框架4中通过程序改变Windows系统的网卡网关,处理多网卡问题,以及遇到的权限问题。最终提醒读者在遇到类似问题时考虑操作系统版本和权限因素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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


一、.net 版本的选择:

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

二、多网卡的问题:

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

Microsoft Kernel Debug Network Adapter
Bluetooth Device (Personal Area Network)
Intel(R) Ethernet Controller (3) I225-V
WAN Miniport (SSTP)
WAN Miniport (IKEv2)
WAN Miniport (L2TP)
WAN Miniport (PPTP)
WAN Miniport (PPPOE)
WAN Miniport (IP)
WAN Miniport (IPv6)
WAN Miniport (Network Monitor)
Microsoft Wi-Fi Direct Virtual Adapter
Microsoft Wi-Fi Direct Virtual Adapter
Remote NDIS Compatible Device

其中只有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目录下,右键以管理员身份运行,果然设置成功了。一上午的时间都浪费在排查为啥不成功的问题上了。


总结:

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

、在 “解决方案资源管理器” 右击 “引用” 添加 “System.Management” 的引用。 2、添加 “using System.Management;”。 static void SetNetworkAdapter() { ManagementBaseObject inPar = null; ManagementBaseObject outPar = null; ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); ManagementObjectCollection moc = mc.GetInstances(); foreach (ManagementObject mo in moc) { if (!(bool)mo["IPEnabled"]) continue; //设置ip地址和子网掩码 inPar = mo.GetMethodParameters("EnableStatic"); inPar["IPAddress"] = new string[] { "192.168.16.248", "192.168.16.249" };// 1.备用 2.IP inPar["SubnetMask"] = new string[] { "255.255.255.0", "255.255.255.0" }; outPar = mo.InvokeMethod("EnableStatic", inPar, null); //设置网关地址 inPar = mo.GetMethodParameters("SetGateways"); inPar["DefaultIPGateway"] = new string[] { "192.168.16.2", "192.168.16.254" }; // 1.网关;2.备用网关 outPar = mo.InvokeMethod("SetGateways", inPar, null); //设置DNS inPar = mo.GetMethodParameters("SetDNSServerSearchOrder"); inPar["DNSServerSearchOrder"] = new string[] { "211.97.168.129", "202.102.152.3" }; // 1.DNS 2.备用DNS outPar = mo.InvokeMethod("SetDNSServerSearchOrder", inPar, null); break; } } C# 开机自动运行程序2007-12-31 12:32string StartupPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Startup); System.IO.File.Copy("应用程序路径(包括程序名)", StartupPath + "执行程序文件名称", true); . . . . . . . . .
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT大灰狼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值