如何在.NET中获取本地IP?

时间:2009-06-05 16:40:59

标签: .net vbscript wmi

我有以下返回本地IP地址的vbscript代码。它很棒。我试图在我的winform .net应用程序中提供相同的功能。

我遇到的所有解决方案都涉及使用DNS。关于如何“移植”此脚本以在.net中使用的任何想法?

另一种方法可能吗?

谢谢!

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

5 个答案:

答案 0 :(得分:9)

您可以通过查询网络接口来执行此操作,但这将包括所有本地地址,因此如果有多个接口(可能会有多个接口),您可能必须添加where子句来选择所需的子句。 )。它肯定不是你脚本的直接端口,但希望有一些用处:

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

注意:如果您只想要IPv4地址,则可以将查询更改为:

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();     

答案 1 :(得分:5)

using System.Net;

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

[编辑]嗯......刚才意识到你提到你不想使用DNS ......为什么会这样?

[编辑]从评论中提升......

更简单版本如果你只关心本地,空字符串传递给GetHostEntry将默认返回本地

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

答案 2 :(得分:2)

看起来您的脚本正在调用ipconfig,将输出保存到文件,然后解析文件。如果你想这样做,你会做这样的事情:

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();
}

请注意,我并不特别喜欢这种方法 - 您可能会更好地使用此主题中列出的其他一些解决方案 - 但它是您原始脚本的更直接的翻译。

答案 3 :(得分:1)

我个人会建议使用DNS,但是如果你绝对不想,你可以通过调用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);

这应该正确地获得ip但可能需要一些调整。

答案 4 :(得分:0)

您可以滚动浏览以查找所有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 
    }