Member 13418321 Ответов: 3

C# разделите предпочтительные и альтернативные dns-адреса на переменные


Привет,

У меня есть скрипт c#, который будет извлекать предпочтительные и альтернативные dns-адреса сетевой карты. Однако у меня возникли проблемы с помещением каждого из них в отдельную переменную. Мой скрипт выдаст в качестве примера следующий вывод: 192.168.30.1192.168.30.2

Я пробовал использовать подстроку, но она отсекает значения от обоих IP-адресов. Вывод выглядит как одна строка, но я не могу отформатировать ее как одну.

Есть какие-нибудь идеи о том, как получить IP-адрес каждой записи dns в своей собственной переменной? Любая помощь будет очень признательна

Заранее спасибо. Ниже приведена часть моего сценария:

class Program
    {
        static void Main(string[] args)
        {

           string dns_name_one = "";
           NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();

            foreach (NetworkInterface networkInterface in networkInterfaces)
            {
                if (networkInterface.OperationalStatus == OperationalStatus.Up)
                {
                    IPInterfaceProperties ipProperties = networkInterface.GetIPProperties();
                    IPAddressCollection dnsAddresses = ipProperties.DnsAddresses;

                    foreach (IPAddress dns in dnsAddresses)
                    {
                        dns_name_one = Convert.ToString(dns);
                        Console.Write(dns_name_one);
                    }
                    Console.ReadLine();
                }
            }
                    
                
            
        }
    }


Что я уже пробовал:

Используя подстроку для редактирования того, что я хочу поместить в переменную. Попробуйте найти способ просто получить предпочтительный или альтернативный dns-IP.

3 Ответов

Рейтинг:
2

Patrice T

Цитата:
Мой скрипт выдаст в качестве примера следующий вывод: 192.168.30.1192.168.30.2

Прежде всего, вам нужно изменить свой скрипт, чтобы добавить разделитель после каждого ip-адреса или после каждого.
например: 192.168.30.1-192.168.30.2-
Тогда будет легко разбить вывод скрипта на ip-адреса.

Если вы хотите использовать эти ip-адреса в скрипте,вы можете сохранить их в изменяемом списке.


Рейтинг:
2

RickZeeland

Вот вам некоторая помощь :)

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq.Expressions;
using System.Management;
using System.Threading;

/// <summary>
/// A Helper class which provides convenient methods to set/get network configuration.
/// </summary>
public static class WmiHelper
{
    /// <summary>
    /// Enable DHCP on the NIC (Network Interface Card).
    /// </summary>
    /// <param name="nicName">Name of the NIC.</param>
    public static void SetDhcp(string nicName)
    {
        var mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
        var moc = mc.GetInstances();

        foreach (ManagementObject mo in moc)
        {
            // Make sure this is a IP enabled device. Not something like memory card or VM Ware
            if ((bool)mo["IPEnabled"])
            {
                if (mo["Caption"].Equals(nicName))
                {
                    ManagementBaseObject newDns = mo.GetMethodParameters("SetDNSServerSearchOrder");
                    newDns["DNSServerSearchOrder"] = null;
                    ManagementBaseObject enableDhcp = mo.InvokeMethod("EnableDHCP", null, null);
                    ManagementBaseObject setDns = mo.InvokeMethod("SetDNSServerSearchOrder", newDns, null);
                }
            }
        }
    }

    /// <summary>
    /// Set IP for the specified network card name
    /// EnableStatic method of the Win32_NetworkAdapterConfiguration class:
    /// https://msdn.microsoft.com/en-us/library/aa390383(v=vs.85).aspx
    /// </summary>
    /// <param name="nicName">Caption of the network card</param>
    /// <param name="ipAddresses">Comma delimited string containing one or more IP</param>
    /// <param name="subnetMask">Subnet mask</param>
    /// <param name="gateway">Gateway IP</param>
    /// <param name="dnsSearchOrder">Comma delimited DNS IP</param>
    /// <returns>A string with an error message, empty on success.</returns>
    public static string SetIp(
        string nicName,
        string ipAddresses,
        string subnetMask,
        string gateway,
        string dnsSearchOrder)
    {
        try
        {
            ////return "Success TESTING";

            if (string.IsNullOrEmpty(ipAddresses) || string.IsNullOrEmpty(subnetMask))
            {
                return "Error: IP address or subnet mask can not be empty.";
            }

            var mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
            var moc = mc.GetInstances();

            foreach (ManagementObject mo in moc)
            {
                // Make sure this is a IP enabled device. Not something like memory card or VM Ware
                ////if ((bool)mo["IPEnabled"])
                {
                    if (mo["Caption"].Equals(nicName))
                    {
                        ManagementBaseObject setIp = null;
                        int retries = 0;

                        for (int retry = 0; retry < 5; retry++)
                        {
                            mo["IPEnabled"] = false;

                            if (!string.IsNullOrEmpty(gateway))
                            {
                                ManagementBaseObject newGate = mo.GetMethodParameters("SetGateways");
                                newGate["DefaultIPGateway"] = new[] { gateway };
                                newGate["GatewayCostMetric"] = new[] { 1 };
                                ManagementBaseObject setGateways = mo.InvokeMethod("SetGateways", newGate, null);
                            }

                            if (!string.IsNullOrEmpty(dnsSearchOrder))
                            {
                                ManagementBaseObject newDns = mo.GetMethodParameters("SetDNSServerSearchOrder");
                                newDns["DNSServerSearchOrder"] = dnsSearchOrder.Split(',');
                                ManagementBaseObject setDns = mo.InvokeMethod("SetDNSServerSearchOrder", newDns, null);
                            }

                            ManagementBaseObject newIp = mo.GetMethodParameters("EnableStatic");
                            newIp["IPAddress"] = ipAddresses.Split(',');
                            newIp["SubnetMask"] = subnetMask.Split(',');
                            mo["IPEnabled"] = true;
                            setIp = mo.InvokeMethod("EnableStatic", newIp, null);
                            Thread.Sleep(100);

                            var ip = ipAddresses.Split(',')[0];
                            var ipCheck = ((string[])mo["IPAddress"])[0];

                            if (ip == ipCheck)
                            {
                                // Success.
                                break;
                            }
                            else
                            {
                                retries++;
                            }
                        }

                        if (setIp == null)
                        {
                            return "Error: SetIp() failed";
                        }

                        var result = setIp.Properties["ReturnValue"];
                        Debug.Print("WmiHelper.SetIp() result = " + result.Value);

                        switch (Convert.ToUInt32(result.Value))
                        {
                            case 0:
                                if (retries > 0)
                                {
                                    return "Success after " + retries + " retries";
                                }

                                Debug.Print("Success !");
                                return "Success";
                            case 1:
                                return "Success but reboot required";

                            case 64:
                                return "Not supported on your Plattform";

                            case 66:
                                return "invalid Subnetmask " + subnetMask;

                            case 68:
                                return "invalid parameter";

                            case 70:
                                return "invalid IP-Address " + ipAddresses;

                            case 71:
                                return "invalid gateway IP address " + gateway;

                            case 80:
                                return "Unable to configure TCP/IP service";

                            case 81:
                                return "Unable to configure DHCP service";

                            case 84:
                                return "IP not enabled on adapter";

                            case 90:
                                return "Parameter out of bounds";

                            case 91:
                                return "Access denied";

                            case 92:
                                return "Out of memory";

                            case 100:
                                return "DHCP not enabled on adapter";

                            case 2147786788:
                                return "Write lock not enabled !";

                            default:
                                return "Error " + result.Value;
                        }

                        break;
                    }
                }
            }
        }
        catch (Exception ex)
        {
            Debug.Print(ex.Message);
        }

        // Ok.
        return "Success";
    }

    /// <summary>
    /// Returns the network card configuration of the specified NIC
    /// </summary>
    /// <param name="nicName">Name of the NIC</param>
    /// <param name="ipAdresses">Array of IP</param>
    /// <param name="subnets">Array of subnet masks</param>
    /// <param name="gateways">Array of gateways</param>
    /// <param name="dnses">Array of DNS IPs</param>
    /// <param name="dhcp">The dhcp.</param>
    public static void GetIp(
        string nicName,
        out string[] ipAdresses,
        out string[] subnets,
        out string[] gateways,
        out string[] dnses,
        out bool dhcp)
    {
        ipAdresses = null;
        subnets = null;
        gateways = null;
        dnses = null;
        dhcp = false;

        var mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
        var moc = mc.GetInstances();
        Debug.Print("nicName = " + nicName);

        foreach (var mo in moc)
        {
            // Make sure this is a IP enabled device. Not something like memory card or VM Ware
            //if ((bool)mo["ipEnabled"])
            {
                string nicNameWmi = mo["Caption"].ToString();
                Debug.Print("nicNameWmi = " + nicNameWmi);

                //if (mo["Caption"].Equals(nicName))
                if (nicNameWmi.Contains(nicName))
                {
                    ////foreach (var property in mo.Properties)
                    ////{
                    ////    Debug.Print(property.Name);
                    ////}

                    ipAdresses = (string[])mo["IPAddress"];
                    subnets = (string[])mo["IPSubnet"];
                    gateways = (string[])mo["DefaultIPGateway"];
                    dnses = (string[])mo["DNSServerSearchOrder"];
                    dhcp = (bool)mo["DHCPEnabled"];
                    ////Debug.Print("DHCPEnabled = " + dhcp);
                    break;
                }
            }
        }
    }

    /// <summary>
    /// Returns the list of Network Interfaces installed
    /// </summary>
    /// <returns>Array list of string</returns>
    public static List<string> GetNicNames()
    {
        var nic


Dave Kreskowiak

Это немного .... экстремальный... для чего-то такого простого, не так ли?

RickZeeland

Это библиотека, он может выбрать то, что ему нужно, функция GetIp() подходит, я думаю.
У меня было много проблем со сбором этой информации, поэтому я надеюсь, что это будет оценено по достоинству ...

Dave Kreskowiak

Ну, к сожалению, этот мир - это кодирование copy'n'paste без какого-либо понимания того, что делает код. Скорее всего, весь фрагмент кода будет скопирован и вставлен в проект, не задумываясь о том, как он работает.

Кроме того, я не вижу там ничего, что возвращает список адресов Dns-серверов на активных адаптерах, о чем говорит код OP.

RickZeeland

Он может использовать функцию GetIp ()!

Dave Kreskowiak

Да, но если он не переписан, он требует, чтобы вы передавали переменные, которые OP может не использовать, или ждали, пока не будет выпущена следующая версия C#, чтобы избежать этого.

Рейтинг:
0

Dave Kreskowiak

В вашей самой внутренней петле, dns это объект IPAddress, поэтому, чтобы получить его в строке, вам просто нужно вызвать его .ToString() метод.

foreach (IPAddress dns in dnsAddresses)
{
    dns_name_one = dns.ToString();
    Console.Write(dns_name_one);
}

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

Но! У вас они уже есть в коллекции. То IPAddressCollection dnsAddresses представляет коллекцию объектов, адрес.

Вопрос в том, что вы хотите с ними делать? Чтобы сбросить адрес в удобочитаемом формате на консоль, это просто:
foreach (IPAddress address in dnsAddresses)
    Console.WriteLine(address);

Вызов .ToString() на address в данном случае это происходит автоматически.

Я бы, вероятно, использовал что - то вроде этого, чтобы вернуть коллекцию Dns-IP-адресов:
static IList<IPAddress> GetCurrentDnsServersForActiveInterfaces()
{
    List<IPAddress> returnAddresses = new List<IPAddress>();

    NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();

    foreach (var nic in nics)
    {
        if (nic.OperationalStatus == OperationalStatus.Up)
        {
            IPInterfaceProperties ipProperties = nic.GetIPProperties();
            IPAddressCollection addresses = ipProperties.DnsAddresses;

            foreach (IPAddress address in addresses)
            {
                returnAddresses.Add(address);
            }
        }
    }

    return returnAddresses;
}


Это вернет все активные адреса DNS-серверов, как IPv4, так и IPv6, для всех активных адаптеров.