为什么通过WMI只应用一次静态IP地址?

我即将编写一个简单的networkingconfiguration工具,可以静态设置IP地址等,也可以通过WMI自动设置(DHCP)。

不幸的是,设置地址静态工作只是一次! 所以当你运行下面的testing函数时,一切都很完美(不要忘记// DYNAMIC的断点!)。 但在第二次,当您检查networking适配器的IP地址和子网掩码的控制面板的属性页中的结果保持空! 当然,没有抛出exception,并且方法调用的结果总是为零(0)。 代码在两台不同的Windows 7机器上进行了testing,当然还有pipe理员。

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[] { }); } 

Solutions Collecting From Web of "为什么通过WMI只应用一次静态IP地址?"

最后,我想出了一个解决方法(我猜)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); } 

对我来说就像一个魅力。 玩的开心 :)