Как изменить метрики интерфейса сетевых адаптеров с помощью C #? - PullRequest
1 голос
/ 31 мая 2011

В отношении ссылки ниже

https://stackoverflow.com/questions/5577406/enable-both-lan-intranet-and-usb-internet

Есть ли способ сделать это с помощью ac # программно?

Ответы [ 2 ]

1 голос
/ 31 мая 2011

Вот статья Code Project, в которой показано, как это сделать:

http://www.codeproject.com/KB/IP/winnetstat.aspx

В основном, для этого вы используете IP Helper API и метод SetIpForwardEntry.

Вот статья, в которой вы узнаете, как ее реализовать (с прилагаемым кодом):

http://www.developer.com/ws/pc/article.php/10947_3415521_2/IP-Helper-API-ARP-Routing-and-Network-Statistics.htm

0 голосов
/ 03 апреля 2018

Хотя на вопрос был дан ответ около 7 лет назад, я нашел ОЧЕНЬ простой способ сделать это в C # с помощью netsh.exe.

Это работает, только если вы запускаете программу от имени администратора.

Команда:

netsh.exe интерфейс ipv4 установить интерфейс "myNICsName" метрика = 20

Чтобы установить метрику "Автоматически", просто установите ее в 0. Верхний предел9999, но если вы используете что-то более высокое, он просто установит для вас значение 9999.

Чтобы сделать это программно, просто используйте Process.Start следующим образом:

        System.Diagnostics.Process p = new System.Diagnostics.Process
        {
            StartInfo =
            {
                FileName = "netsh.exe",
                Arguments = $"interface ipv4 set interface \"{nicName}\" metric={metric}",
                UseShellExecute = false,
                RedirectStandardOutput = true
            }
        };

        bool started = p.Start();

        if (started)
        {
            if (SpinWait.SpinUntil(() => p.HasExited, TimeSpan.FromSeconds(20)))
            {
                Log.Write($"Successfully set {nicName}'s metric to {metric}");
                Log.Write($"Sleeping 2 seconds to allow metric change on {nicName} to take effect.");
                Thread.Sleep(2000);

                return true;
            }

            Log.Write($"Failed to set {nicName}'s metric to {metric}");
            return false;
        }

Приведенный выше код также выполняет некоторую проверку ошибок, чтобы убедиться, что процесс действительно запущен, и вводит небольшую задержку, чтобы изменение метрики могло иметь шанс вступить в силу.Я обнаружил, что у меня были некоторые проблемы в моем коде, когда я не включил задержку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...