如何获取包含“skipassource”地址的Windows 2008和.NET中的系统IP地址列表?

时间:2012-03-29 22:42:40

标签: c# .net windows windows-server-2008-r2 windows-networking

我有一些在Windows 2003下运行良好的现有代码,以获取绑定到服务器的IP地址列表:

foreach (IPAddress addr in (Dns.GetHostEntry(Dns.GetHostName())).AddressList)
{
    // Code here to act on each address
}

当我在Windows 2008服务器上运行此代码时,它只返回一个IP地址。经过进一步调查,似乎机器正在侦听的所有其余IP地址都是使用netsh int ipv4 add address命令并指定skipassource=true标志添加的。

有没有办法在我的查询中包含这些地址,即返回服务器上的所有地址?

(如果您感到好奇,skipassource=true标志已设置,因为Windows 2008在网络中引入了新行为,允许它决定它认为哪些IP地址为“主要”,而其他应用程序依赖我们能够选择主要版本。在Windows 2008中执行此操作的唯一方法是将所有其他地址标记为skipassource=true。)

编辑这个问题现在只是为了满足我的好奇心,因为我已经解决了这个问题。我上面的原始代码用于运行服务器上的所有IP,并查看它是否找到了我正在寻找的特定IP的匹配项。我现在检查我所在的服务器是否已经在运行侦听该特定IP地址/端口的服务,因此我不再需要遍历所有IP。不过,我仍有兴趣听听是否有原始问题的答案。

编辑感谢@aKzenT提供解决方案。我现在使用NetworkInteface.GetAllNetworkInterfaces()来访问所有IP,而不是Dns.GetHostEntry()。我的最终代码如下所示:

foreach (NetworkInterface netface in NetworkInterface.GetAllNetworkInterfaces())
{
    foreach (UnicastIPAddressInformation uni in netface.GetIPProperties().UnicastAddresses)
    {
        IPAddress addr = uni.Address;
        // Code here to act on each address
    }
}

1 个答案:

答案 0 :(得分:2)

skipassource旨在不在DNS名称系统中包含IP地址,因此我认为您必须找到另一种方式而不是Dns.GetHostEntry

您是否尝试过查看System.Net.NetworkInformation命名空间?

我认为如果您通过GetAllNetworkInterfaces遍历适配器,然后调用GetIPProperties以获取适配器的IP属性,然后检查UnicastAddresses您是否可以构建IP地址列表。虽然没经过测试。

另见: http://msdn.microsoft.com/de-de/library/system.net.networkinformation.networkinterface.getallnetworkinterfaces.aspx