You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Windows7/10下.NET指定LAN-Adapters修改IP地址的问题

解决VB.NET多网卡环境下精确指定网卡修改IP的问题

你的问题根源很明确:当前代码遍历所有Win32_NetworkAdapterConfiguration实例,没有针对选中的网卡做筛选,所以多网卡活跃时会随机修改某个适配的网卡配置。下面是修复后的完整方案:

核心修改点

  1. 修正下拉框选中项的获取方式:原代码用SelectedText是错误的,应该用SelectedItem.ToString()来获取完整的网卡名称。
  2. 在WMI遍历过程中,添加筛选条件,只处理与选中网卡名称匹配的实例(通过NetConnectionID属性匹配,这个属性对应系统中显示的网卡名称,也就是你ComboBox里的选项)。
  3. 找到匹配实例后立即退出循环,避免不必要的遍历操作。

修复后的完整代码

Option Strict On
Imports System.Net.NetworkInformation
Imports System.Management

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim LAN_Adapter As NetworkInterface
        ComboBoxAdapterSelector.Items.Clear()
        For Each LAN_Adapter In NetworkInterface.GetAllNetworkInterfaces()
            With LAN_Adapter
                ComboBoxAdapterSelector.Items.Add(.Name)
            End With
        Next
    End Sub

    Private Sub ChangechoosenIPButton_Click(sender As Object, e As EventArgs) Handles ChangechoosenIPButton.Click
        ChangechoosenIP()
    End Sub

    Sub ChangechoosenIP()
        ' 检查下拉框是否选中了网卡
        If ComboBoxAdapterSelector.SelectedItem Is Nothing Then
            MessageBox.Show("请先选择目标网卡!")
            Return
        End If

        Dim targetAdapterName As String = ComboBoxAdapterSelector.SelectedItem.ToString()
        Dim IPAddress As String = TextBoxIPAddress.Text
        Dim SubnetMask As String = TextBoxSubnetMask.Text
        Dim Gateway As String = TextBoxGateway.Text

        ' 验证IP地址格式(可选,建议添加)
        If Not System.Net.IPAddress.TryParse(IPAddress, Nothing) Then
            MessageBox.Show("请输入有效的IP地址!")
            Return
        End If

        Dim objMC As ManagementClass = New ManagementClass("Win32_NetworkAdapterConfiguration")
        Dim objMOC As ManagementObjectCollection = objMC.GetInstances()

        Dim isAdapterFound As Boolean = False

        For Each objMO As ManagementObject In objMOC
            Try
                ' 筛选出与目标网卡名称匹配的实例(NetConnectionID对应系统显示的网卡名称)
                If objMO("NetConnectionID") IsNot Nothing AndAlso 
                   objMO("NetConnectionID").ToString() = targetAdapterName Then

                    Dim objNewIP As ManagementBaseObject = objMO.GetMethodParameters("EnableStatic")
                    Dim objNewGate As ManagementBaseObject = objMO.GetMethodParameters("SetGateways")

                    ' 设置网关
                    objNewGate("DefaultIPGateway") = New String() {Gateway}
                    objNewGate("GatewayCostMetric") = New Integer() {1}

                    ' 设置IP和子网掩码
                    objNewIP("IPAddress") = New String() {IPAddress}
                    objNewIP("SubnetMask") = New String() {SubnetMask}

                    ' 执行修改操作
                    Dim objSetIPResult As ManagementBaseObject = objMO.InvokeMethod("EnableStatic", objNewIP, Nothing)
                    Dim objSetGateResult As ManagementBaseObject = objMO.InvokeMethod("SetGateways", objNewGate, Nothing)

                    ' 检查操作结果(可选,WMI返回的0表示成功)
                    If Convert.ToInt32(objSetIPResult("ReturnValue")) = 0 AndAlso 
                       Convert.ToInt32(objSetGateResult("ReturnValue")) = 0 Then
                        MessageBox.Show("IP配置修改成功!")
                    Else
                        MessageBox.Show($"修改失败,错误码:IP={objSetIPResult("ReturnValue")}, Gateway={objSetGateResult("ReturnValue")}")
                    End If

                    isAdapterFound = True
                    Exit For ' 找到目标网卡后退出循环,避免多余操作
                End If
            Catch ex As Exception
                MessageBox.Show($"错误:{ex.Message}")
            End Try
        Next objMO

        If Not isAdapterFound Then
            MessageBox.Show($"未找到名为 {targetAdapterName} 的网卡!")
        End If
    End Sub
End Class

额外注意事项

  • 管理员权限:修改网络配置需要管理员权限,所以请确保你的程序以管理员身份运行,否则会抛出权限不足的异常。
  • IP格式验证:代码中添加了简单的IP格式验证,你可以根据需求扩展子网掩码和网关的验证逻辑。
  • WMI返回值Win32_NetworkAdapterConfiguration的方法返回值为0表示操作成功,其他值对应不同的错误,你可以参考官方文档了解具体错误码含义。

内容的提问来源于stack exchange,提问作者vbnet_newer

火山引擎 最新活动