C#:查询客户端名称的DHCP

时间:2013-02-15 17:02:25

标签: c# windows dns dhcp

为了清晰起见进行最终编辑 - 在我的环境中,DNS只会为每个客户端存储一条记录。如果客户端具有多个NIC或更改子网,则原始IP将在DNS中注册,直到相应的DHCP记录到期(这是DHCP注册DNS地址的AD环境)。

在这种情况下,DNS有一个不正确的客户端记录。我想通过客户端名称查询DHCP,以查看租给它的所有IP。

我找到的唯一可能解决方案是从DHCP转储所有子网信息(由以下API支持)然后查询,但这在我的环境中是不可行的,因为多人会使用此应用程序,我不喜欢不希望在DHCP上造成额外的压力。

我无法更改DNS或DHCP的任何配置。

谢谢,


这类似于this问题,但使用引用的API (here),我只能通过IP查询。是否可以使用此API或任何其他API按主机名查询DHCP? (问题是,DNS为MachineA提供了一个旧IP,我想检索MachineA从DHCP服务器租用的任何其他IP)。

编辑:为了澄清,我想编写一个我可以在主机名中键入的程序,然后它将在DHCP服务器中查询该DHCP服务器管理的任何子网中该主机名的所有IP。这是为了解决具有多个NIC的机器注册对我无用的IP(无线)的问题,因此例如DNS结果可能是NICA(无线)但我想要NICB(有线)。

2 个答案:

答案 0 :(得分:2)

据我所知,您遇到了使用哪个IP地址的古老问题。现在,很多计算机都有多个网卡,一些是虚拟网卡,一些是本地网卡,一些是网络接入网等等......对于选择应用程序来说非常困难。大多数时候我只是制作应用程序托管配置项之类的东西的IP - 只是因为应用程序无法真正选择哪个是正确的 ip要使用的地址。例如两个网卡都具有相同的网络访问权限,您选择哪个?如果你运行应用程序两次,也许一个应该使用NIC 1而另一个应该使用NIC 2 - 应用程序将如何做出这个决定? (即它不能)。

话虽如此,根据您的需求,您可以寻找最好的NIC并获取其IP地址。例如,如果您想在非无线NIC上使用IPv4地址,则可以执行以下操作:

var ips = from ni
                in NetworkInterface.GetAllNetworkInterfaces()
            where ni.NetworkInterfaceType == NetworkInterfaceType.Ethernet
            from ip in ni.GetIPProperties().UnicastAddresses
            where ip.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork && ip.IsDnsEligible
            select ip;
IPAddress address = ips.First().Address;

...为了便于阅读而省略错误检查 - 应用适合您要求的任何错误检查。

您甚至可以检查地址是否是本地链接(即可以通过本地网段进行通信 - 这通常意味着由Windows而不是DNS / DHCP自动分配的地址)通过查看是否第一个IPv4地址的两个字节是169和254。

但是,您需要明确定义您的要求。简单地说“不受欢迎的无线IP”并没有提供明确和可验证的标准来说明哪种解决方案总能满足您的需求。

答案 1 :(得分:0)

如果您尝试在网络上找到计算机,则可能首先要查询DNS。想想一台网络上有静态 IP地址的机器。它只会使用名称服务注册其名称,如果机器的IP堆栈仅配置了静态地址,它将不会显示在DHCP中。

我不确定新计算机或最近更改的IP地址在DNS中显示需要多长时间。但是如果你想看看DHCP是否有不同的东西(更新),那么在首先从DNS尝试后查询DHCP。