我即将编写一个简单的网络配置工具,可以静态设置IP地址等,也可以通过WMI自动设置(DHCP)。
不幸的是,静态设置地址只能运行一次!所以当你运行下面的测试函数时,一切都很完美(不要忘记// DYNAMIC的断点!)。但是第二次,当您在控制面板的网络适配器的属性页中检查结果时,IP地址和子网掩码仍为空!当然没有抛出异常,方法调用的结果总是为零(0)。代码在两台不同的Windows 7计算机上进行了测试,当然也是管理员。
void Test()
{
// find management object
ManagementClass networkManagementClass = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection networkManagement = networkManagementClass.GetInstances();
ManagementObject adapter = null;
foreach (ManagementObject mo in networkManagement)
{
if ((bool)mo["IPEnabled"] && (string)mo["Caption"] == "[00000012] Intel(R) 82577LM Gigabit Network Connection")
{
adapter = mo;
break;
}
}
// STATIC
var val = adapter.InvokeMethod("EnableStatic", new object[] {
new string[] { "192.168.1.99" },
new string[] { "255.255.255.0" }
});
val = adapter.InvokeMethod("SetGateways", new object[] {
new string[] { "192.168.1.254" },
new UInt16[] { 1 }
});
val = adapter.InvokeMethod("SetDNSServerSearchOrder", new object[] {
new string[] { "192.168.1.254" }
});
// DYNAMIC
adapter.InvokeMethod("SetDNSServerSearchOrder", new object[] { new string[0] });
adapter.InvokeMethod("EnableDHCP", new object[] { });
}
答案 0 :(得分:1)
最后,我想出了一个解决方法(我猜)Windows错误:在WMI调用之前直接将正确的值填充到注册表中:
// workaround of windows bug (windows refused to apply static ip in network properties dialog)
var settingID = adapter.GetPropertyValue("SettingID"); // adapter = the management object
using (var regKey = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\services\Tcpip\Parameters\Interfaces\" + settingID, true))
{
regKey.SetValue("EnableDHCP", 0);
regKey.SetValue("IPAddress", networkState.IPAddress, RegistryValueKind.MultiString);
regKey.SetValue("SubnetMask", networkState.SubnetMask, RegistryValueKind.MultiString);
}
对我来说就像一个魅力。玩得开心:))