C#:查询DHCP以获取客户端名称

本文关键字:客户端 获取 查询 DHCP | 更新日期: 2023-09-27 17:59:39

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

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

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

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

谢谢,


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

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

C#:查询DHCP以获取客户端名称

据我所知,您遇到了使用哪个IP地址的古老问题。现在,许多计算机都有多个NIC,有些是虚拟的,有些只是本地的,有些可以上网,等等……对于应用程序来说,选择非常困难。大多数时候,我只是将应用程序承载套接字等内容的IP作为配置项——这只是因为应用程序无法真正选择要使用的正确IP地址。例如,两个NIC都具有相同的网络访问权限,您选择哪一个?如果你运行两次应用程序,也许一个应该使用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;

为了可读性,省略了错误检查——应用任何适合您需求的错误检查。

你甚至可以通过查看IPv4地址的前两个字节是169和254来检查该地址是否是链接本地的(即可以在本地网段之外通信——这通常意味着由Windows而不是DNS/DHCP自动分配的地址)。

但是,您需要具体定义您的需求是什么。简单地说"不受欢迎的无线IP"并不能提供明确和可验证的标准来判断什么解决方案总是能满足您的需求。

如果您试图在网络上定位机器,那么查询DNS可能是您想要首先做的。例如,想象一台在网络上具有静态ip地址的机器。它只会在名称服务中注册自己的名称,如果机器的IP堆栈只配置了静态地址,它就不会出现在DHCP att all中。

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