gpt4 book ai didi

c# - 使用 WMI EnableStatic 方法的问题

转载 作者:太空狗 更新时间:2023-10-29 17:57:38 26 4
gpt4 key购买 nike

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

应用程序完成,DNS 和网关已配置,但是 EnableStatic 方法(设置 IP 地址和子网)不成功,这意味着 IP 仍然从 DHCP 接收(灰色显示字段),即使已设置默认网关。我该如何解决这个问题?

EnableStatic 的返回值是 70(无效的 IP 地址)。奇怪的是,输入的参数和我2秒前从网卡上提取出来的参数是一样的。

这是代码(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
}

有什么想法吗?

最佳答案

难道你输入的是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

关于c# - 使用 WMI EnableStatic 方法的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5627487/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com