我有一些代码,我目前正用它来更改网络适配器的静态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);
}
}
}
}
}
答案 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的方法。