Как проверить, относится ли имя хоста к локальной машине - PullRequest
10 голосов
/ 24 декабря 2009

Может ли кто-нибудь придумать простой способ определить в win32 или .NET, разрешает ли имя хоста (строка) локальный компьютер? Такие как:

"myhostname"
"myhostname.mydomain.local"
"192.168.1.1"
"localhost"

Цель этого упражнения - создать тест, который покажет, будет ли уровень безопасности Windows рассматривать доступ к компьютеру как локальный или сетевой

Ответы [ 5 ]

7 голосов
/ 24 декабря 2009

В .NET вы можете:

IPHostEntry iphostentry = Dns.GetHostEntry (Dns.GetHostName ());

Затем для любого имени хоста проверьте, разрешается ли оно одному из IP-адресов в iphostEntry.AddressList (это IP-адрес []).

Вот полная программа, которая проверит имена хостов / IP-адреса, переданные в командной строке:

using System;
using System.Net;

class Test {
    static void Main (string [] args)
    {
        IPHostEntry iphostentry = Dns.GetHostEntry (Dns.GetHostName ());
        foreach (string str in args) {
            IPHostEntry other = null;
            try {
                other = Dns.GetHostEntry (str);
            } catch {
                Console.WriteLine ("Unknown host: {0}", str);
                continue;
            }
            foreach (IPAddress addr in other.AddressList) {
                if (IPAddress.IsLoopback (addr) || Array.IndexOf (iphostentry.AddressList, addr) != -1) {
                    Console.WriteLine ("{0} IsLocal", str);
                    break;
                } 
            }
        }
    }
}
4 голосов
/ 01 июня 2012

На этот вопрос уже дан ответ, но вот что я придумал, чтобы определить имя хоста и IP-адрес:

public static bool IsLocalHost(string host)
{
    IPHostEntry localHost = Dns.GetHostEntry(Dns.GetHostName());

    IPAddress ipAddress = null;

    if (IPAddress.TryParse(host, out ipAddress))
        return localHost.AddressList.Any(x => x.Equals(ipAddress));

    IPHostEntry hostEntry = Dns.GetHostEntry(host);

    return localHost.AddressList.Any(x => hostEntry.AddressList.Any(y => x.Equals(y)));
}
1 голос
/ 25 ноября 2014

Мое слегка обновленное решение из PhilDulac, сначала проверяет, связан ли localhost с каким-либо псевдонимом, определенным в hosts/etc, другая часть - это решение из PhilDulac.

public static bool IsLocalHost(Uri uri)
{
    bool isLocalhost = false;
    string hostName = uri.Host;

    IPHostEntry localhost = Dns.GetHostEntry("127.0.0.1");
    if (uri.Host == localhost.HostName)
    {
        IPHostEntry hostEntry = Dns.GetHostEntry(hostName);
        isLocalhost = hostEntry.AddressList.Any(IPAddress.IsLoopback);
    }

    if (!isLocalhost)
    {
        localhost = Dns.GetHostEntry(Dns.GetHostName());

        IPAddress ipAddress = null;

        if (IPAddress.TryParse(hostName, out ipAddress))
            isLocalhost = localhost.AddressList.Any(x => x.Equals(ipAddress));

        if (!isLocalhost)
        {
            try
            {
                var hostEntry = Dns.GetHostEntry(hostName);
                isLocalhost = localhost.AddressList.Any(x => hostEntry.AddressList.Any(x.Equals));
            }
            catch (SocketException e)
            {
                Debug.WriteLine(e);
            }
        }
    }

    return isLocalhost;
}
1 голос
/ 24 декабря 2009

Вы можете получить IP-адрес, с которым разрешается имя хоста, написав Dns.Resolve(hostName).AddressList[0].ToString().

Затем вы можете сравнить это с 127.0.0.1 или с локальным IP-адресом компьютера.

Вы можете получить локальные IP-адреса компьютера, пройдя по System.Net.Dns.GetHostByName(System.Net.Dns.GetHostName()).AddressList.

0 голосов
/ 24 декабря 2009

В .net вы сможете использовать Request.ServerVariables («REMOTE_ADDR»); чтобы получить IP-адрес хоста, а затем сравнить его с разрешенным IP-адресом хоста. Разве это не то, что вы хотели?

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