Win32_NetworkAdapterConfiguration .NET 4 - 设置静态IP适用于XP但不适用于Windows 7

时间:2012-06-22 11:42:48

标签: c# windows-7 static-ip-address

我有一些代码,我目前正用它来更改网络适配器的静态IP。当在Windows XP 32位计算机(包括phsyical和VM)上运行时,在设置IP地址时会有轻微的暂停(约1秒),但它似乎确实会更改IP。

在Windows 7 64位计算机上运行时,无法更改IP地址。尝试进行更改时没有暂停,也不会抛出任何异常。

我已经做了相当多的谷歌搜索,大多数建议似乎只是以管理员身份运行。我尝试右键单击可执行文件并选择“以管理员身份运行”,我尝试创建快捷方式并将其设置为以管理员身份运行,我尝试更新清单文件(它确实要求管理员权限)启动,但仍然不会更改IP地址。)

有人可以提供任何建议吗?

代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management; // You will need to add a reference for System.Management!

namespace NetAdapt
{
  class Program
  {
    static void Main(string[] args)
    {
      // First display all network adaptors 
      DisplayNetworkAdaptors(-1);

      // Now try to set static IP, subnet mask and default gateway for adaptor with
      // index of 1 (may be different for your machine!)
      SetIP(1, 
        new string[] { "10.10.1.222" }, 
        new string[] { "255.255.255.0" }, 
        new string[] { "10.10.1.10" });

      // Now display network adaptor settings for adaptor 1 (may be different for your machine!)
      DisplayNetworkAdaptors(1);

      Console.ReadLine();
    }

    private static void SetIP(int index, string[] newIPAddress, string[] newSubnetMask, string[] newGateway)
    {
      ManagementClass objMC = new ManagementClass("Win32_NetworkAdapterConfiguration");
      ManagementObjectCollection objMOC = objMC.GetInstances();

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

        try
        {
          //Only change for device specified
          if ((uint)objMO["Index"] == index)
          {
            ManagementBaseObject objNewIP = null;
            ManagementBaseObject objSetIP = null;
            ManagementBaseObject objNewGate = null;
            objNewIP = objMO.GetMethodParameters("EnableStatic");
            objNewGate = objMO.GetMethodParameters("SetGateways");

            objNewGate["DefaultIPGateway"] = newGateway;
            objNewIP["IPAddress"] = newIPAddress;
            objNewIP["SubnetMask"] = newSubnetMask;

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

            Console.WriteLine("Successfully changed IP!");
          }
        }
        catch (Exception ex)
        {
          Console.WriteLine("Exception setting IP: " + ex.Message);
        }
      }
    }

    private static void DisplayNetworkAdaptors(int index)
    {
      ManagementClass objMC = new ManagementClass("Win32_NetworkAdapterConfiguration");
      ManagementObjectCollection objMOC = objMC.GetInstances();

      foreach (ManagementObject objMO in objMOC)
      {
        try
        {
          // TCP enabled NICs only
          if (!(bool)objMO["IPEnabled"]) continue;

          // If index is -1 then display all network adaptors, otherwise only
          // display adaptor whose index matches parameter
          if ((index != -1) && ((uint)objMO["Index"] != index)) continue;

          Console.WriteLine("Caption           : " + (string)objMO["Caption"]);
          string[] defaultGateways=(string[])objMO["DefaultIPGateway"];
          if (defaultGateways != null)
          {
            for (int x = 0; x < defaultGateways.Count(); x++)
            {
              Console.WriteLine(string.Format("DefaultIPGateway{0} : {1}", x, defaultGateways[x]));
            }
          }
          else
          {
            Console.WriteLine("DefaultIPGateway  : NULL");
          }
          Console.WriteLine("Description       : " + (string)objMO["Description"]);
          Console.WriteLine("DHCPEnabled       : " + (bool)objMO["DHCPEnabled"]);
          Console.WriteLine("DHCPServer        : " + (string)objMO["DHCPServer"]);
          Console.WriteLine("Index             : " + (uint)objMO["Index"]);
          string[] ipAddresses = (string[])objMO["IPAddress"];
          if (ipAddresses != null)
          {
            for (int x = 0; x < ipAddresses.Count(); x++)
            {
              Console.WriteLine(string.Format("IPAddress{0}        : {1}", x, ipAddresses[x]));
            }
          }
          else
          {
            Console.WriteLine("IPAddress         : NULL");
          }
          Console.WriteLine("IPEnabled         : " + (bool)objMO["IPEnabled"]);
          string[] ipSubnets = (string[])objMO["IPSubnet"];
          if (ipSubnets != null)
          {
            for (int x = 0; x < ipSubnets.Count(); x++)
            {
              Console.WriteLine(string.Format("IPSubnet{0}         : {1}", x, ipSubnets[x]));
            }
          }
          else
          {
            Console.WriteLine("IPSubnet          : NULL");
          }
          Console.WriteLine("MACAddress        : " + (string)objMO["MACAddress"]);
          Console.WriteLine();

        }
        catch (Exception ex)
        {
          Console.WriteLine("Exception getting network adaptors: " + ex.Message);
        }
      }
    }
  }
}

1 个答案:

答案 0 :(得分:2)

好的,最后通过检查代码项目中的以下内容,设法找到问题的一种解决方案:

http://www.codeproject.com/Articles/19827/Chameleon-Connection-Settings-Manager

在上面作者的代码中,他使用以下代码设置静态IP:

objMO.InvokeMethod("EnableStatic", new object[] { newIPAddress, newSubnetMask });
objMO.InvokeMethod("SetGateways", new object[] { newGateway, new string[] { "1" } });

...适用于Windows 7,但不适用于Windows XP。在我自己的代码中,我试图询问System.Environment.OSVersion.Version并根据我是在XP还是Windows 7上运行来选择我的设置IP的方法。