如何测试主机名是否指向本地计算机

时间:2009-12-24 17:42:58

标签: .net windows security

如果主机名(字符串)解析为本地计算机,有没有人能想到在win32或.NET中告诉的简单方法?如:

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

本练习的目标是生成一个测试,该测试将告知Windows安全层是否将对计算机的访问视为本地或网络

5 个答案:

答案 0 :(得分:7)

在.NET中,您可以:

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

然后对于任何主机名,检查它是否解析为iphostEntry.AddressList中的一个IP(这是一个IPAddress [])。

这是一个完整的程序,它将检查在命令行中传递的主机名/ 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;
                } 
            }
        }
    }
}

答案 1 :(得分:4)

这个问题已经得到解答,但这是我想出来解决主机名和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)));
}

答案 2 :(得分:1)

您可以通过编写Dns.Resolve(hostName).AddressList[0].ToString()来获取主机名解析的IP地址。

然后,您可以将其与127.0.0.1或计算机的本地IP地址进行比较。

您可以循环浏览System.Net.Dns.GetHostByName(System.Net.Dns.GetHostName()).AddressList

来获取计算机的本地IP地址

答案 3 :(得分:1)

我的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;
}

答案 4 :(得分:0)

在.net中你应该可以使用Request.ServerVariables(“REMOTE_ADDR”);获取主机IP地址,然后将其与主机名的已解析IP地址进行比较。这不是你想要的吗?