首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Win32_NetworkAdapterConfiguration .NET 4-设置静态IP在XP上有效,但在Windows7上无效

Win32_NetworkAdapterConfiguration .NET 4-设置静态IP在XP上有效,但在Windows7上无效
EN

Stack Overflow用户
提问于 2012-06-22 19:42:48
回答 1查看 10.6K关注 0票数 3

我有一些代码,我目前正在使用它们来更改网络适配器的静态IP。在Windows XP 32位计算机(物理计算机和虚拟机计算机)上运行时,设置IP地址时会稍有停顿(~1秒),但它似乎确实会更改IP。

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

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

有人能给点建议吗?

代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
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);
        }
      }
    }
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-22 23:36:17

好了,通过检查Code Project中的以下内容,最终找到了问题的某种解决方案:

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

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

代码语言:javascript
代码运行次数:0
运行
复制
objMO.InvokeMethod("EnableStatic", new object[] { newIPAddress, newSubnetMask });
objMO.InvokeMethod("SetGateways", new object[] { newGateway, new string[] { "1" } });

...which在Windows7上运行良好,但在Windows XP上就不行了。在我自己的代码中,我求助于询问System.Environment.OSVersion.Version,并根据我运行的是XP还是Windows7来选择我设置IP的方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11155520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档