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ı?
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 =) –
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 (). –