在 .NET 中以编程方式配置网络适配器的最佳方式

Posted

技术标签:

【中文标题】在 .NET 中以编程方式配置网络适配器的最佳方式【英文标题】:Best way to programmatically configure network adapters in .NET 【发布时间】:2010-10-15 21:51:21 【问题描述】:

我有一个用 C# 编写的应用程序,它需要能够在 Windows 中配置网络适配器。我基本上通过 WMI 来解决这个问题,但是我不喜欢该解决方案的一些事情:有时设置似乎不固定,并且当未插入网络电缆时,WMI 会返回错误方法,所以我不知道他们是否真的成功了。

我需要能够通过网络连接 - 属性 - TCP/IP 屏幕配置所有可用设置。

最好的方法是什么?

【问题讨论】:

【参考方案1】:

我可以告诉你木马的做法,在不得不清理一些木马之后,就是在 HKEY_LOCAL_MACHINE 下设置注册表项。他们设置的主要是 DNS 方法,这种方法绝对可以被任何曾经被感染并且无法再访问 windowsupdate.com、mcafee.com 等的人证明。

【讨论】:

"HKEY_LOCAL_MACHINE" 并没有完全缩小找到重要密钥的位置。更多细节将使这个答案真正有用。【参考方案2】:

使用我的代码 SetIpAddress 和 SetDHCP

    /// <summary>
    /// Sets the ip address.
    /// </summary>
    /// <param name="nicName">Name of the nic.</param>
    /// <param name="ipAddress">The ip address.</param>
    /// <param name="subnetMask">The subnet mask.</param>
    /// <param name="gateway">The gateway.</param>
    /// <param name="dns1">The DNS1.</param>
    /// <param name="dns2">The DNS2.</param>
    /// <returns></returns>
    public static bool SetIpAddress(
        string nicName,
        string ipAddress,
        string subnetMask,
        string gateway = null,
        string dns1 = null,
        string dns2 = null)
    
        ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
        ManagementObjectCollection moc = mc.GetInstances();

        NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();
        NetworkInterface networkInterface = interfaces.FirstOrDefault(x => x.Name == nicName);
        string nicDesc = nicName;

        if (networkInterface != null)
        
            nicDesc = networkInterface.Description;
        

        foreach (ManagementObject mo in moc)
        
            if ((bool)mo["IPEnabled"] == true
                && mo["Description"].Equals(nicDesc) == true)
            
                try
                
                    ManagementBaseObject newIP = mo.GetMethodParameters("EnableStatic");

                    newIP["IPAddress"] = new string[]  ipAddress ;
                    newIP["SubnetMask"] = new string[]  subnetMask ;

                    ManagementBaseObject setIP = mo.InvokeMethod("EnableStatic", newIP, null);

                    if (gateway != null)
                    
                        ManagementBaseObject newGateway = mo.GetMethodParameters("SetGateways");

                        newGateway["DefaultIPGateway"] = new string[]  gateway ;
                        newGateway["GatewayCostMetric"] = new int[]  1 ;

                        ManagementBaseObject setGateway = mo.InvokeMethod("SetGateways", newGateway, null);
                    


                    if (dns1 != null || dns2 != null)
                    
                        ManagementBaseObject newDns = mo.GetMethodParameters("SetDNSServerSearchOrder");
                        var dns = new List<string>();

                        if (dns1 != null)
                        
                            dns.Add(dns1);
                        

                        if (dns2 != null)
                        
                            dns.Add(dns2);
                        

                        newDns["DNSServerSearchOrder"] = dns.ToArray();

                        ManagementBaseObject setDNS = mo.InvokeMethod("SetDNSServerSearchOrder", newDns, null);
                    
                
                catch
                
                    return false;
                
            
        

        return true;
    

    /// <summary>
    /// Sets the DHCP.
    /// </summary>
    /// <param name="nicName">Name of the nic.</param>
    public static bool SetDHCP(string nicName)
    
        ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
        ManagementObjectCollection moc = mc.GetInstances();

        NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();
        NetworkInterface networkInterface = interfaces.FirstOrDefault(x => x.Name == nicName);
        string nicDesc = nicName;

        if (networkInterface != null)
        
            nicDesc = networkInterface.Description;
        

        foreach (ManagementObject mo in moc)
        
            if ((bool)mo["IPEnabled"] == true
                && mo["Description"].Equals(nicDesc) == true)
            
                try
                
                    ManagementBaseObject newDNS = mo.GetMethodParameters("SetDNSServerSearchOrder");

                    newDNS["DNSServerSearchOrder"] = null;
                    ManagementBaseObject enableDHCP = mo.InvokeMethod("EnableDHCP", null, null);
                    ManagementBaseObject setDNS = mo.InvokeMethod("SetDNSServerSearchOrder", newDNS, null);
                
                catch
                
                    return false;
                
            
        

        return true;
    

【讨论】:

【参考方案3】:

查看此应用。这是一个设置wifi和以太网ips的完整应用程序

https://github.com/kamran7679/ConfigureIP

【讨论】:

【参考方案4】:

借助@PaulB 的回答帮助

NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
Process p = new Process();
ProcessStartInfo psi = new ProcessStartInfo("netsh", "interface ip set address " + nics[0].Name + " static 192.168." + provider_ip + "." + index + " 255.255.255.0 192.168." + provider_ip + ".1 1");
p.StartInfo = psi;
p.StartInfo.Verb = "runas";
p.Start();

【讨论】:

【参考方案5】:

您可以使用Process 触发netsh 命令来设置网络对话框中的所有属性。

例如: 在适配器上设置静态 ipaddress

netsh interface ip set address "Local Area Connection" static 192.168.0.10 255.255.255.0 192.168.0.1 1

要将其设置为您将使用的 dhcp

netsh interface ip set address "Local Area Connection" dhcp

用 C# 来做会是

Process p = new Process();
ProcessStartInfo psi = new ProcessStartInfo("netsh", "interface ip set address \"Local Area Connection\" static 192.168.0.10 255.255.255.0 192.168.0.1 1");
p.StartInfo = psi;
p.Start();

设置为静态可能需要几秒钟才能完成,因此如果需要,请确保等待进程退出。

【讨论】:

知道如何提升此命令以使用管理员权限运行吗? 看看***.com/questions/133379/… 这个答案的一个缺点是您的网卡名称并不总是“本地连接”,它可能会有所不同。 @MubasharAhmad 解决此问题的一种方法是使用 NetworkInterface 获取所有带有“.Description”的接口名称,然后让他们从中进行选择。然后,获取“.Name”并将其传递给命令字符串。至少,我就是这么做的。 如何在同一个ProcessStartInfo中设置静态DNS

以上是关于在 .NET 中以编程方式配置网络适配器的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

如何在.net 中以编程方式设置连接字符串配置?

在 SwiftUI 中以编程方式移动 NavigationView 的最佳实践是啥

多个ListViews在android中以编程方式创建

在 Windows 中以编程方式复制、重命名和粘贴文件的最佳方法

是否有一种编程方式可以在 Windows 中创建自定义网络配置文件并为其分配虚拟网络适配器?

在Drupal7中以编程方式嵌入搜索块的最佳方法