2009-06-05 27 views
5

Tengo el siguiente código vbscript que devuelve la dirección IP local. Funciona muy bien. Estoy tratando de proporcionar la misma funcionalidad en mi aplicación winform .net.¿Cómo puedo obtener IP local en .NET?

Todas las soluciones que he encontrado implican el uso de DNS. ¿Alguna idea sobre cómo "portar" este script para su uso en .net?

¿Una forma diferente de hacer esto tal vez?

Gracias!

Function GetIP() 

Dim ws : Set ws = CreateObject("WScript.Shell") 
    Dim fso : Set fso = CreateObject("Scripting.FileSystemObject") 
    Dim TmpFile : TmpFile = fso.GetSpecialFolder(2) & "/ip.txt" 
    Dim ThisLine, IP 
    If ws.Environment("SYSTEM")("OS") = "" Then 
    ws.run "winipcfg /batch " & TmpFile, 0, True 
    Else 
    ws.run "%comspec% /c ipconfig > " & TmpFile, 0, True 
    End If 
    With fso.GetFile(TmpFile).OpenAsTextStream 
    Do While NOT .AtEndOfStream 
     ThisLine = .ReadLine 
     If InStr(ThisLine, "Address") <> 0 Then IP = Mid(ThisLine, InStr(ThisLine, ":") + 2) 
    Loop 
    .Close 
    End With 

    If IP <> "" Then 
    If Asc(Right(IP, 1)) = 13 Then IP = Left(IP, Len(IP) - 1) 
    End If 
    GetIP = IP 
    fso.GetFile(TmpFile).Delete 
    Set fso = Nothing 
    Set ws = Nothing 
End Function 

Respuesta

9

Puede hacer esto consultando las interfaces de red, aunque esto incluirá todas las direcciones locales, por lo que puede tener que agregar una cláusula where para seleccionar la que desee si hay múltiples interfaces (lo que probablemente exista). Desde luego no es un puerto directo de su guión, pero se espera que sea de alguna utilidad:

var localAddress = 
    (from ni in NetworkInterface.GetAllNetworkInterfaces() 
    where ni.NetworkInterfaceType != NetworkInterfaceType.Loopback 
    let props = ni.GetIPProperties() 
    from ipAddress in props.UnicastAddresses 
    select ipAddress).FirstOrDefault();  

Nota: Si sólo quiere que las direcciones IPv4, entonces se podría alterar la consulta a:

var localAddress = 
    (from ni in NetworkInterface.GetAllNetworkInterfaces() 
    where ni.NetworkInterfaceType != NetworkInterfaceType.Loopback 
    let props = ni.GetIPProperties() 
    from ipAddress in props.UnicastAddresses 
    where ipAddress.AddressFamily == AddressFamily.InterNetwork // IPv4 
    select ipAddress).FirstOrDefault();  
+0

Mismo problema que el comentario que hice anteriormente. Está volviendo -> fe80 :: ad11: 2dc5: 58af: a24b% 14 que ahora he descubierto que es mi dirección IPv6. –

+0

hmm. Voy a aceptar esto como la respuesta, ya que en realidad devuelve la dirección IPv4 correcta en cualquier casilla que no tenga IPv6; que son todos en mi público objetivo, así que esto funciona. Me interesaría averiguar cómo elegir una entrada específica, pero ... ¡ay! –

+0

hmm, no se puede resolver AddressFamily .... –

5
using System.Net; 

IPAddress localAddr = Dns.GetHostEntry(Dns.GetHostName().ToString()).AddressList[0]; 

[editar] Hmmmm ... di cuenta de que usted ha mencionado usted no desea utilizar DNS ... ¿Por qué?

[editar] pasando de comentarios ....

versión más simple si sólo se preocupan por la cadena local vacío pase a GetHostEntry será por defecto devolver local solamente

IPAddress localAddr = Dns.GetHostEntry("").AddressList[0]; 
+0

Gracias por tomarse el tiempo para publicar! DNS requiere que actualmente tengan acceso a nuestro DNS, ¿correcto? A menos que esa declaración sea falsa, existe mi problema ya que mi aplicación es una aplicación que a veces está conectada y que no siempre estará en nuestra red doméstica. Pueden estar allí en casa o en el hogar de un cliente. PD -> Me parece interesante que hayas obtenido 4 votos favorables por una respuesta que va en contra de lo que publiqué. Quiero decir sin ofender, solo una observación que he notado cada vez más aquí. ¡Gracias de nuevo! –

+0

hmm, alguna idea de por qué esto devolvería esto -> fe80 :: ad11: 2dc5: 58af: a24b% 14 ?? –

+0

@Refracted Paladin: es una dirección IP IPv6. –

1

yo personalmente recomendaría utilizando el DNS, pero si a pesar de todo no desea se puede obtener la información de una llamada al espacio de nombres System.Management

string ipAddress = ""; 
ManagementObjectSearcher query = 
    new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'TRUE'"); 
ManagementObjectCollection queryCollection = query.Get(); 
foreach (ManagementObject mo in queryCollection) 
{ 
    string[] addresses = (string[]) mo["IPAddress"]; 
    if (addresses.Length == 1 && addresses[0] != "0.0.0.0") 
    { 
     ipAddress = addresses[0]; 
     break; 
    } 

} 
Console.WriteLine(ipAddress); 

que deben recibir correctamente º e ip, pero puede necesitar algunos ajustes.

+0

. Probablemente solo sea grueso, pero ManagementObjectSearcher no parece existir en mi espacio de nombres System.Management ??? .net 35 sp1 –

+0

@Refracted Paladin: ¿Ha agregado el ensamblado System.Management a las referencias de su proyecto? – Helen

2

se Parece que su script llama a ipconfig, guarda el resultado en un archivo y luego analiza el archivo. Si quieres hacer eso, usted haría algo como esto:

using System.Threading; 

... 

static void Main(string[] args) 
{ 
    Process p = new Process(); 

    ProcessStartInfo psi = new ProcessStartInfo("ipconfig"); 
    psi.CreateNoWindow = true; 
    psi.RedirectStandardOutput = true; 
    psi.UseShellExecute = false; 

    p.StartInfo = psi; 
    p.Start(); 

    string s = p.StandardOutput.ReadToEnd(); 
    int startPos = s.IndexOf(":", s.IndexOf("IPv4 Address")); 
    string output = s.Substring(startPos + 2, s.IndexOf("\r\n", startPos) - startPos - 2); 
    Console.WriteLine(output); 
    Console.ReadLine(); 
} 

Tenga en cuenta que no soy especialmente aficionado a este método - que probablemente sería mejor servido con algunas de las otras soluciones que se indican en este hilo - pero es una traducción más directa de tu script original.

0

Puede desplazarse para encontrar todas las direcciones IP.

String hostName = Dns.GetHostName();      
    IPHostEntry local = Dns.GetHostByName(hostName); 
    foreach (IPAddress ipaddress in local.AddressList) 
    { 
     ipaddress.ToString(); //this gives you the IP address 
     //logic here 
    } 
+0

Estos han quedado obsoletos. – fARcRY

Cuestiones relacionadas