【问题标题】:C#: Query DHCP for Client NameC#:在 DHCP 中查询客户端名称
【发布时间】:2013-02-15 17:02:25
【问题描述】:

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

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

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

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

谢谢,


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

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

【问题讨论】:

  • 你在这个 Scott.se 上进行过谷歌搜索吗?试试这个链接ianatkinson.net/computing/dhcpcsharp.htm
  • 您不清楚为什么Dns.GetHostEntry 之类的内容不适合您的需求。
  • @DJKRAZE 你好 DJ,如果我正确阅读了这段代码,那与我想要做的有点接近,但并不完全相同。似乎为子网中的客户端提取所有信息(我不知道)。我想尽可能轻松,如果可能的话,只为一个客户提取信息——我希望做一些可以重新分配的东西,所以不想造成不必要的压力
  • @PeterRitchie Peter,如果 nslookup 只返回一个地址,那是否意味着 Dns.GetHostEntry 也只会返回一个?我无法访问 DNS 服务器来查看记录的样子,所以不确定这种方法会带来什么,这就是我探索 DHCP 的原因。

标签: c# windows dns dhcp


【解决方案1】:

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

话虽如此,根据您的需要,您可以去寻找最好的 NIC 并获取它的 IP 地址。例如,如果你想要一个非无线网卡上的 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”并不能提供明确且可验证的标准来判断哪种解决方案将始终满足您的需求。

【讨论】:

  • 尽管我习惯性地对asking the client a question they cannot answer 持保留意见,但我为这个答案的技术正确性 +1 了 :-)
  • 也许我错过了,但我不确定答案如何适用 - 我不是在寻找客户的最佳路径,我想查看所有可能的路径进入客户,通过查询 DHCP 服务器,因为它将有多个客户端地址,而 DNS 只会告诉我注册的内容。如问题所述,无线 IP 是不可取的,我想要有线 IP,但有线/无线是任意的 - DNS 告诉我一个 IP,我想知道设备可能具有的其他 IP,因为 DNS IP 可能是不可取的。跨度>
  • 我不确定我是如何“从客户那里”(或向客户内部)发布的详细信息。它只是允许您使用 IP 地址过滤可能的 NIC——然后您可以使用这些 IP 地址来创建要侦听的套接字 (IN)。 DNS/DHCP 对有线/无线一无所知。我不清楚你怎么可能只用 DHCP/DNS 做你想做的事?无论如何,要让某些东西进入您的服务器,您必须首先创建一个套接字来侦听 有效 IP 地址,而不管 DNS/DHCP 缓存了什么。
  • @CodyGray 如果这是回答 SO 问题的有效性标准,那么几乎所有问题都必须关闭:)
  • @PeterRitchie 我的意思是说,虽然我没有完全听从你的回答,但我看不出它与我的问题有什么关系。在我看来,sn-p 是让应用程序根据特定标准选择 IP。我不能把它应用到每台机器上,也不能把它应用到 DNS 或 DHCP 服务器上。我正在寻找一种使用 C# 查询 DHCP 以获取主机名租用的所有 IP 的方法。在我的场景中,DNS 只为一台机器注册一个 IP,而我知道的唯一可以查看它可能拥有的其他 IP 的地方是 DHCP。
【解决方案2】:

如果您试图在网络上定位一台机器,那么查询 DNS 可能是您首先要做的事情。即想象一台在网络上有 静态 ip 地址的机器。它只会在名称服务中注册其名称,如果机器的 IP 堆栈仅配置为静态地址,则它根本不会显示在 DHCP 中。

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

【讨论】:

  • 主要问题是无线IP是在DNS中注册的,而不是有线IP。这些机器无法通过无线进行远程管理,所以如果我只有名字,我就无法远程管理它们。我也无法更改 DNS 或 DHCP 服务器上的任何内容,因此我正在寻找一种通过客户端名称查找机器有线 IP 的方法。
猜你喜欢
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
  • 2019-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多