2011-04-11 94 views
8

我正在尝试创建一个将动态DHCP提供的IPv4地址,网关和dns设置转换为静态配置的工具。我试图用WMI来解决这个难题,但我有一个我无法弄清楚的问题。使用WMI EnableStatic方法的问题

应用程序完成后,配置了DNS和网关,但EnableStatic方法(设置IP地址和子网)没有成功,这意味着即使缺省情况下仍从DHCP接收IP(使用灰色字段)网关已设置。我该如何解决?

EnableStatic的ReturnValue值为70(无效的IP地址)。奇怪的是,输入参数与我在2秒前从NIC中提取的参数相同。

下面是代码(除GUI),http://pastebin.com/AE3dGhUz

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Management; 

namespace Static_NIC_Settings_Creator 
{ 
    public partial class Form1 : Form 
    { 
     private ManagementObjectCollection queryCollection; 
     private string[] networkInterfaces; 
     private int currentNIC; 
     private string[] ipAddress; 
     private string[] subnetMask; 
     private string[] defaultIPGateway; 
     private string[] dnsServerSearchOrder; 

     public Form1() 
     { 
      InitializeComponent(); 
      getNICs(); 
     } 

     private void convertButton_Click(object sender, EventArgs e) 
     { 
      if (networkInterfaces.Count() > 0) 
      { 
       //Get current NIC settings 
       if (!getNICSettings()) 
       { 
        MessageBox.Show("Retrieving current NIC settings failed.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
        return; 
       } 
       //Convert to static NIC settings 
       if (!setNICStatic()) 
       { 
        MessageBox.Show("Setting NIC settings to static failed.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
        return; 
       } 
      } 
     } 

     private void nicSelecter_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      currentNIC = nicSelecter.SelectedIndex; 
     } 

     private void getNICs() 
     { 
      //Get NICS 
      ManagementObjectSearcher query = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'TRUE'"); 
      queryCollection = query.Get(); 
      //Make nic string array 
      int i = queryCollection.Count; 
      networkInterfaces = new string[i]; 
      //Fill nic string array 
      i = 0; 
      foreach (ManagementObject mo in queryCollection) 
      { 
       networkInterfaces[i] = (String)mo["Description"]; 
       i++; 
      } 
      //Fill dropbox with arraylist-data 
      nicSelecter.DataSource = networkInterfaces; 
     } 

     private Boolean getNICSettings() 
     { 
      //Get selected NIC 
      int i = 0; 
      foreach (ManagementObject mo in queryCollection) 
      { 
       //Get settings for specific NIC 
       if (i == currentNIC) 
       { 
        try 
        { 
         ipAddress = (String[])mo["IPAddress"]; 
         subnetMask = (String[])mo["IPSubnet"]; 
         defaultIPGateway = (String[])mo["DefaultIPGateway"]; 
         dnsServerSearchOrder = (String[])mo["DNSServerSearchOrder"]; 
         return true; 
        } 
        catch (Exception e) 
        { 
         System.Windows.Forms.MessageBox.Show(e.ToString(), "Critical: Unhandled error"); 
         return false; 
        } 
       } 
       i++; 
      } 
      return false; 
     } 

     private Boolean setNICStatic() 
     { 
      //Get selected NIC 
      int i = 0; 
      foreach (ManagementObject mo in queryCollection) 
      { 
       //Get settings for specific NIC 
       if (i == currentNIC) 
       { 
        try 
        { 
         //Set static IP and subnet mask 
         ManagementBaseObject setIP; 
         ManagementBaseObject newIP = mo.GetMethodParameters("EnableStatic"); 
         newIP["IPAddress"] = ipAddress; 
         newIP["SubnetMask"] = subnetMask; 
         setIP = mo.InvokeMethod("EnableStatic", newIP, null); 
         //Set default gateway 
         ManagementBaseObject setGateway; 
         ManagementBaseObject newGateway = mo.GetMethodParameters("SetGateways"); 
         newGateway["DefaultIPGateway"] = defaultIPGateway; 
         newGateway["GatewayCostMetric"] = new int[] { 1 }; 
         setGateway = mo.InvokeMethod("SetGateways", newGateway, null); 
         //Set dns servers 
         ManagementBaseObject setDNS; 
         ManagementBaseObject newDNS = mo.GetMethodParameters("SetDNSServerSearchOrder"); 
         newDNS["DNSServerSearchOrder"] = dnsServerSearchOrder; 
         setDNS = mo.InvokeMethod("SetDNSServerSearchOrder", newDNS, null); 

         System.Windows.Forms.MessageBox.Show("Setting NIC settings returned: " + setDNS); 
         return true; 
        } 
        catch (Exception e) 
        { 
         System.Windows.Forms.MessageBox.Show(e.ToString(), "Critical: Unhandled error"); 
         return false; 
        } 
       } 
       i++; 
      } 
      //No NICs 
      return false; 
     } 
    } //End class 
} 

任何想法?

回答

3

难道你也在输入IPv6地址吗?只是玩PowerShell似乎不喜欢它们。也许你可以发布在调试时输入的实际值,这会有很大的帮助。另外也许尝试静态输入一些值,如:

new string[]{"192.168.0.1"}, new string[] {"255.255.255.255"} 

而且除非你真的需要C#和GUI,你可能要考虑使用PowerShell的(要求它正在安装过程中)的WMI是真的要简单得多在那里操作(可惜你仍然有这种学习曲线)。

这仅仅是如何使用PowerShell的一个例子,你可以在最起码使用它的一些测试:

Get-WmiObject Win32_NetworkAdapterConfiguration 

然后让你的适配器的索引,然后运行,但取代你的索引号:

$obj = Get-WmiObject Win32_NetworkAdapterConfiguration | where {$_.Index -eq 1} 
$obj.EnableStatic("192.168.0.1", "255.255.255.0") 

要获得方法参数只需运行:

$obj.EnableStatic 

它将返回:

MemberType   : Method 
OverloadDefinitions : {System.Management.ManagementBaseObject EnableStatic(System.String[]IPAddress, System.String[] SubnetMask)} 
TypeNameOfValue  : System.Management.Automation.PSMethod 
Value    : System.Management.ManagementBaseObject EnableStatic(System.String[]IPAddress, System.String[] SubnetMask) 
Name    : EnableStatic 
IsInstance   : True 
+0

这是姗姗来迟。很久以前,我已经提出了这个问题,但现在当我在PS上练习时,我花了一些时间来测试C#应用程序。似乎有关于IP6的东西,所以我使用'newIP [“IPAddress”] = new String [] {ipAddress [0]};'和类似的子网只能获得ipv4设置。无论如何,多个ipaddresses是不太可能的。 Great catch =) – 2013-01-19 18:10:15

+0

IPAddresses属性的描述(https://msdn.microsoft.com/en-us/library/aa394217(v=vs.85).aspx#properties)表示:“该属性可以包含IPv6地址或IPv4地址“。现在,当你查询它时,它似乎同时包含v4和v6地址,但也许它只在你尝试更改它时计数(使用例如EnableStatic()。如果你在EnableStatic中使用混合地址, )。 – 2017-10-25 09:33:08