Проблемы с использованием метода WMI EnableStatic - PullRequest
9 голосов
/ 12 апреля 2011

Я пытаюсь создать инструмент, который преобразует динамический IPv4-адрес, шлюз и dns-настройки, предоставленные DHCP, в статическую конфигурацию.Я пытался использовать WMI для решения этой головоломки, но у меня есть проблема, которую я не могу понять.

Приложение завершено, DNS и шлюз настроены, но метод EnableStatic (для установкиIP-адрес и подсеть) были неудачными, что означает, что IP-адрес все еще получен от DHCP (с серыми полями), даже если был установлен шлюз по умолчанию.Как это исправить?

ReturnValue от EnableStatic равно 70 (Неверный IP-адрес).Странно то, что входные параметры те же, что я извлек из сетевого адаптера 2 секундами ранее.

Вот код (кроме графического интерфейса), 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
}

Любые идеи

1 Ответ

3 голосов
/ 18 июля 2011

Может быть, вы также вводите адреса IPv6 ? Похоже, они просто не любят PowerShell. Возможно, вы можете опубликовать фактические значения, которые вводятся во время отладки, это очень поможет. Также, возможно, попробуйте статически ввести некоторые значения, такие как:

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

Кроме того, если вам действительно не нужен C # и графический интерфейс, который вы, возможно, захотите использовать в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...