2012-07-23 65 views
1

我即將編寫一個簡單的網絡配置工具,它可以靜態設置IP地址等,或者通過WMI自動設置(DHCP)。爲什麼通過WMI應用靜態IP地址只能工作一次?

不幸的是,靜態設置地址只能工作一次!所以當你運行下面的測試函數時,一切都很完美(不要忘記// 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[] { }); 

} 

回答

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); 
} 

作品對我來說就像魅力。玩得開心:)

+0

btw:[此MSDN論壇主題]中的一篇文章(http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/2ef93007-6718-468e-8399-c6b9c5f461aa)幫助我想出了這個... – nepa 2012-08-10 17:15:42