web-dev-qa-db-ja.com

.NETでネットワークアダプタをプログラムで構成するための最良の方法

Windowsでネットワークアダプターを構成できるようにする必要があるC#で記述されたアプリケーションがあります。これは基本的にWMIを介して機能しますが、そのソリューションについて気に入らない点がいくつかあります。設定が固定されていないように見えることがあり、ネットワークケーブルが接続されていない場合、WMIからエラーが返されます。メソッドなので、本当に成功したかどうかはわかりません。

ネットワーク接続-プロパティ-TCP/IP画面を介して利用可能なすべての設定を構成できる必要があります。

これを行うための最良の方法は何ですか?

20
TimK

Processを使用して netsh コマンドを実行し、ネットワークダイアログのすべてのプロパティを設定できます。

例:アダプタに静的IPアドレスを設定するには

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();

Staticへの設定は、完了するまでに数秒かかる場合があるため、必要に応じて、プロセスが終了するのを待つようにしてください。

27
PaulB

私のコードで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
Kim Ki Won

トロイの木馬がいくつかの後でクリーンアップしなければならなかった後、それを行う方法は、HKEY_LOCAL_MACHINEの下にレジストリキーを設定することです。彼らが設定した主なものはDNSのものであり、そのアプローチは間違いなく固執しており、これまでに感染したことがあり、windowsupdate.com、McAfee.comなどにアクセスできなくなった人は誰でもテストできます。

2
sipwiz

@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();
2
Umair Khalid

このアプリをチェックアウトします。それはwifiとイーサネットipsの両方を設定するための完全なアプリケーションです

https://github.com/kamran7679/ConfigureIP

0
Kamran