2009-12-24 16 views
9

¿Alguien puede pensar en una forma fácil de decir en win32 o .NET si el nombre de host (cadena) se resuelve en una computadora local? Tales como:Cómo probar si el nombre de host hace referencia a la máquina local

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

El objetivo de este ejercicio es producir una prueba que le dirá si la capa de seguridad de Windows tratará el acceso a la máquina como local o de red

Respuesta

7

En .NET puede:

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

Luego, para cualquier nombre de host, verifique si se resuelve en una de las direcciones IP en iphostEntry.AddressList (esta es una dirección IP []).

Aquí es un completo programa que comprobará los nombres de host/direcciones IP aprobadas en la línea de comandos:

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

Tis funcionó, aunque parece que esto no prueba direcciones como "127.0.0.1". Éste funciona (puede actualizar su publicación si lo desea): var local_ip = (desde ip en Dns.GetHostEntry (Dns.GetHostName()). AddressList seleccione ip) .ToList(); local_ip.Add (IPAddress.Loopback); local_ip.Add (IPAddress.IPv6Loopback); var target_ip = Dns.GetHostEntry (destino) .AddressList; var intersect = from ip1 en target_ip join ip2 en local_ip en ip1 es igual a ip2 seleccione ip1; return intersect.Any(); – galets

1

Usted puede obtener la dirección IP que resuelve el nombre de host a escribiendo Dns.Resolve(hostName).AddressList[0].ToString().

Puede comparar eso con 127.0.0.1 o con la dirección IP local de la computadora.

Puede obtener las direcciones IP locales de la computadora haciendo clic en System.Net.Dns.GetHostByName(System.Net.Dns.GetHostName()).AddressList.

0

En .NET debería poder usar Request.ServerVariables ("REMOTE_ADDR"); para obtener la dirección IP del host y luego compararla con la dirección IP resuelta del nombre de host. ¿No es eso lo que querías?

+0

Esto solo funcionará para las aplicaciones ASP.NET. – Gonzalo

+0

Esto solo es válido durante una solicitud ASP.Net. Además, debe usar 'Request.UserHostAddress'. – SLaks

3

Esta pregunta ya ha sido contestada, pero esto es lo que se me ocurrió para resolver tanto el nombre de host y la dirección 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

Mi solución actualizada ligeramente de PhilDulac, en primer lugar comprueba si localhost es alias con un poco alias definido en hosts/etc, otra parte es la solución de 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; 
} 
+0

buen intento, pero falta compatibilidad con ipv6 :) – galets

+0

¿Tiene algún ejemplo real en el que falla con ipv6? – psulek

+0

':: 1' es localhost en ipv6. Estás probando '127.0.0.1', que es ipv4 localhost, pero no para' :: 1' – galets

Cuestiones relacionadas