【问题标题】:Set network configuration programmatically c#以编程方式设置网络配置c#
【发布时间】:2015-09-14 20:08:20
【问题描述】:

我想保存我的网络适配器配置,然后在另一台计算机上恢复它。我使用 WMI 获取网络配置并将其保存到 .txt 文件中:

   using (TextWriter tw = new StreamWriter(@"D:\\NetworkConfiguration.txt"))
        {
            if (tw != null)
            {
                ManagementClass objMC = new ManagementClass("Win32_NetworkAdapterConfiguration");

                ManagementObjectCollection objMOC = objMC.GetInstances();

                foreach (ManagementObject objMO in objMOC)
                {
                    if (!(bool)objMO["ipEnabled"])
                        continue;

                    string[] ipaddresses = (string[])objMO["IPAddress"];
                    string[] subnets = (string[])objMO["IPSubnet"];
                    string[] gateways = (string[])objMO["DefaultIPGateway"];



                    tw.WriteLine("IpAdresses");
                    foreach (string sIP in ipaddresses)
                        tw.WriteLine(sIP);

                    tw.WriteLine("IpSubnets");
                    foreach (string sNet in subnets)
                        tw.WriteLine(sNet);

                    tw.WriteLine("Gateways");
                    foreach (string sGate in gateways)
                        tw.WriteLine(sGate);


                    // close the stream
                    tw.Close();
                }
            }
        }

然后,当我想在另一台计算机上设置 tcp/ip 设置时,我会读取文件的信息:

 using (TextReader tr = new StreamReader(@"D:\\NetworkConfiguration.txt"))
            {
                List<string> ipAddrr = new List<string>();
                List<string> ipSubnet = new List<string>();
                List<string> Gateway = new List<string>();

                string line = tr.ReadLine();
                while (line != null)
                {
                    if (line.Equals("IpAdresses"))
                    {
                        ipAddrr.Add(tr.ReadLine());
                        ipAddrr.Add(tr.ReadLine());
                    }
                    if (line.Equals("IpSubnets"))
                    {
                        ipSubnet.Add(tr.ReadLine());
                        ipSubnet.Add(tr.ReadLine());
                    }
                    if (line.Equals("Gateways"))
                    {
                        Gateway.Add(tr.ReadLine());
                    }
                    line = tr.ReadLine();
                }

                setIP(ipAddrr.ToArray(), ipSubnet.ToArray(), Gateway.ToArray());
            }

并设置新设置:

public void setIP(string[] IPAddress, string[] SubnetMask, string[] Gateway)
    {

        ManagementClass objMC = new ManagementClass(
            "Win32_NetworkAdapterConfiguration");
        ManagementObjectCollection objMOC = objMC.GetInstances();


        foreach (ManagementObject objMO in objMOC)
        {

            if (!(bool)objMO["IPEnabled"])
                continue;



            try
            {
                ManagementBaseObject objNewIP = null;
                ManagementBaseObject objSetIP = null;
                ManagementBaseObject objNewGate = null;


                objNewIP = objMO.GetMethodParameters("EnableStatic");
                objNewGate = objMO.GetMethodParameters("SetGateways");



                //Set DefaultGateway

                objNewGate["DefaultIPGateway"] = Gateway ;
                objNewGate["GatewayCostMetric"] = new int[] { 1 };


                //Set IPAddress and Subnet Mask

                objNewIP["IPAddress"] = IPAddress;
                objNewIP["SubnetMask"] = SubnetMask;

                objSetIP = objMO.InvokeMethod("EnableStatic", objNewIP, null);
                objSetIP = objMO.InvokeMethod("SetGateways", objNewGate, null);



                MessageBox.Show(
                   "Updated IPAddress, SubnetMask and Default Gateway!");



            }
            catch (Exception ex)
            {
                MessageBox.Show("Unable to Set IP : " + ex.Message);
            }
        }
    }

但问题是当我检查我的 tcp/ip 配置时,它永远不会改变..... 我不明白如何让它工作....

【问题讨论】:

  • 引用 IT 人群的话:“您是否尝试过将其关闭再打开?”无论如何, ipconfig /all 之前和之后的输出是什么?您是否有机会首先设置一个内部适配器(之后设置具有相同值的实际适配器将不起作用)?你真的有网络连接吗?需要更多信息..
  • @mtijn 在我的应用程序 ipconfig 向我显示网络适配器的原始设置之前,在我的应用程序更改网络设置后,ipconfig 仍然显示原始设置。我没有尝试关闭和打开它,但我在运行应用程序后重新启动了计算机。我不知道我是否先设置内部适配器...我有网络连接....
  • 记录您使用此功能设置的适配器的原始 IP 并查找奇数值,这些是您的内部适配器。另外,您是否遇到任何异常(包括您正在捕获的异常)?
  • @mtijn 不,我没有遇到任何异常,代码有效,之后当我检查网络设置时,我发现它们没有改变......
  • 我发现这个链接非常有用 - netsh commands

标签: c# .net wmi


【解决方案1】:

看看这个question - 不同的方法,但应该可以正常工作。

【讨论】:

  • 谢谢,成功了!!!我的应用程序可以更改 ip、子网和网关......(现在我必须更改 DNS 和 WINS)......非常感谢!!!
猜你喜欢
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-28
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 2016-01-17
相关资源
最近更新 更多