2011-04-11 25 views
8

Dinamik DHCP tarafından sağlanan IPv4 adresini, ağ geçidini ve dns ayarlarını statik yapılandırmaya dönüştüren bir araç oluşturmaya çalışıyorum. Bu bulmacayı çözmek için WMI'yi kullanmaya çalıştım ama anlayamadığım bir problemim var.WMI EnableStatic yöntemini kullanan sorunlar

Uygulama tamamlandı, DNS ve Ağ Geçidi yapılandırıldı, ancak EnableStatic yöntemi (IP adresini ve alt ağını ayarlamak için) kararsız oldu, bu da IP'nin DHCP'den (gri alanlar dışında) hala varsayılan olsa bile alındığı anlamına gelir ağ geçidi ayarlandı. Bunu nasıl düzeltirim?

EnableStatic'ten ReturnValue değeri 70'dir (Geçersiz IP adresi). Garip olan şey, giriş parametrelerinin NIC'den 2 saniye önce çıkardığım ile aynı olmasıdır.

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 
} 

Herhangi bir fikir: Burada

(GUI hariç) kodu, http://pastebin.com/AE3dGhUz mı?

cevap

3

IPv6 adresleri de giriyor olabilir misiniz? Sadece PowerShell ile oynamak, onları sevmiyor gibi görünüyor. Belki de hata ayıklama sırasında girilen gerçek değerleri gönderebilirsiniz, çok yardımcı olacaktır. Gerçekten, gerçekten, C# ve GUI gerekmedikçe PowerShell (gereklilik tabii ki yüklenirken) WMI gerçekten çok daha kolaydır olarak kullanarak düşünebilirsiniz Ayrıca

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

: Ayrıca belki gibi bazı değerleri girerek statik deneyin Orada manipüle et (ne yazık ki hala o öğrenme eğrisine sahipsin).

Get-WmiObject Win32_NetworkAdapterConfiguration 

Sonra sonra çalıştırın adaptörünün indeksi olsun, ama dizin numarası değiştirin:

Bu

sen en azından bazı test için kullanabilirsiniz, PowerShell nasıl kullanılacağına ilişkin sadece bir örnektir:

$obj.EnableStatic 

O dönecektir:

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

yöntem parametreleri sadece çalıştırmak almak için

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

Bu gecikme süresi geçmişti. Bunu uzun zaman önce vermiştim, ama şimdi PS üzerinde çalışırken, C# uygulamasını da test etmek için zaman ayırdım. IP6 ile ilgili bir şey var gibi görünüyor, bu yüzden 'newIP ["IPAddress"] = new String [] {ipAddress [0]}; 'i ve sadece ipv4 ayarlarını almak için alt ağ için benzer kullandım. Birden çok ipadres kullanması zaten bir olasılık değil. Büyük yakalama =) –

+0

IPAdres özelliği (https://msdn.microsoft.com/en-us/library/aa394217(v=vs.85).aspx#properties) açıklaması şöyledir: "Bu özellik IPv6 içerebilir adresler veya IPv4 adresleri ". Şimdi, sorguladığınızda, hem v4 hem de v6 adreslerini içerdiği görülüyor, ancak belki de bunu değiştirmeye çalıştığınızda (örneğin EnableStatic() kullanarak) sayıyor. EnableStatic ile karışık adresler kullanıyorsanız, hata 70'i kendim de fark ettim (). –