使用DHCP从IP获取mac地址?

时间:2009-11-23 08:52:26

标签: c# active-directory mac-address dhcp wake-on-lan

我正在尝试创建脚本/服务,允许通过WOL唤醒Windows域中的PC。现在我想让用户选择一个AD容器作为唤醒其中包含的PC的起点。我最初的想法是使用DHCP作为存储库来查询给定主机名的MAC地址(我可以很容易地从给定容器的AD中拉出来)。

有没有办法以编程方式查询DHCP服务/服务器,传递主机名并恢复关联的MAC地址?

或者,是否有更好/更简单的方法来解决我的问题?

7 个答案:

答案 0 :(得分:1)

尝试dhcpexim.exe from microsoft

或者,如果您更喜欢使用纯C. DhcpEnumSubnetClientsV4

答案 1 :(得分:1)

没问题;因为所有计算机都在您的域中,您可以将VBScript放在一起,从本地计算机获取MACAddress,并将其作为Active Directory中计算机对象的属性存储。

这是一个快速破解如何做到这一点(将其保存为.vbs文件):

Option Explicit

Const ADS_PROPERTY_UPDATE = 2
Const COMPUTERLOCATION = "ou=Member Servers,dc=yourdomain,dc=com"
Const ATTRIBUTETOUSE = "otherTelephone"

Dim wshNetwork, strComputerName
Set wshNetwork = WScript.CreateObject("WScript.Network")
strComputerName = wshNetwork.ComputerName

Dim objWMIService, colNetCards, objComputer, objNetCard
Set objWMIService = GetObject("winmgmts:\\" & strComputerName & "\root\cimv2")
Set colNetCards = objWMIService.ExecQuery("Select * From Win32_NetworkAdapterConfiguration Where IPEnabled = True")
Set objComputer = GetObject("LDAP://cn=" & strComputerName & "," & COMPUTERLOCATION) 
For Each objNetCard in colNetCards
    objComputer.PutEx ADS_PROPERTY_APPEND, ATTRIBUTETOUSE, Array(objNetCard.MACAddress)
    objComputer.SetInfo
Next

由于您的客户并非全部位于上方的“会员服务器”OU中,因此您需要修改上述脚本,以便strComputerName包含a directory search来获取COMPUTERLOCATION

当您有一个工作脚本时,请让您的域管理员将该脚本作为一个启动脚本,以您需要监控的计算机为目标;这样,只要电脑启动它就会执行。您还可以将脚本作为计划任务运行,以从未重新启动的任何客户端获取数据,或使用psexec或您可以想到的其他方式立即获取数据。或者,您可以完全重写脚本以远程连接到所有计算机并以此方式获取数据(由于本地防火墙可能无法实现)。或者您可以编写一个小型的.NET控制台应用程序来执行相同的操作,这取决于您...

此外,虽然为计算机对象定义了networkAddress - 属性;默认情况下,计算机对象本身无权写入此属性。因为启动脚本在特定计算机上的SYSTEM帐户的上下文中运行,所以最简单的方法是使用计算机对象(SELF)具有写访问权限的属性。 otherTelephone - 属性是多值的,是Personal-Information Property Set的一部分,默认情况下所有计算机对象都具有写入权限。如果要使用networkAddress - 属性,则需要为所有计算机设置对该属性的显式写入权限。

此外,您还需要记住,将MAC地址存储在Active Directory中意味着您域中的所有用户都具有对其的读取权限,这反过来可能(取决于您的环境)会带来很小的安全风险

答案 2 :(得分:1)

按照网络的方式进行。

抓取SharpPcap(C#的Pcap包装)和WinPcap(Windows)或libpcap(* nix)。编写一个创建SNMP数据包的应用程序来查询路由器上的ARP表。

注意:ARP(地址解析协议)表是包含IP地址到MAC地址映射的表。

我一直在考虑实施最近这样做的例子,但我还没有一个要显示的例子。一旦我这样做,我将确保它被添加到项目源代码树中的SharpPcap示例中。

答案 3 :(得分:1)

这有点古怪似乎没有办法以编程方式查询DHCP服务器。感谢cottsak提问。我知道DHCP协议没有这样的查询,但我认为可能来自Microsoft的可执行文件可能有一些方法可以从命令行解决它。我没有听到任何人说没有这种情况,但必须如此。

WHOA,等一下......我想我找到了我们正在寻找的东西:NETSH。比照:

http://social.technet.microsoft.com/Forums/en/ITCG/thread/afb4be16-09bd-4260-b515-8323d85d4ccb

如果在DHCP服务器上打开命令提示符,则可以运行此命令:

netsh dhcp服务器范围192.168.1.0 show clients

并获得如下报告:

10.10.98.53 - 255.255.255.0 -00-0c-29-02-a4-09 - 永不过期-D 10.10.98.54 - 255.255.255.0 - 00-22-19-10-29-75 -1/21/2012 8:39:25 AM -D

Yippeee!谢谢你的线程!!如果不是这个,我会把我的搜索范围缩小到technet,并且发现了一个。

答案 4 :(得分:0)

你不能用DHCP做到这一点。 DHCP从MAC中归属IP,而不是相反。 ARP是将IP转换为MAC的原因,但它是机器本身可以应答ARP请求,所以如果它关闭它显然不会回答......

我建议你直接在你的AD中存储MAC(我猜AD支持自定义属性?)

答案 5 :(得分:0)

你需要使用arp获取mac地址并这样做在C中是一个漫长的过程。

Mac地址是硬编码的,因此如果您有X台计算机,请获取X mac地址并将其绑定到AD。

请注意,必须启用计算机才能请求其mac地址。

Finding MAC address from IP address

答案 6 :(得分:-1)

是的,担心它,如果PC有租约,你可以直接从DHCP提取这些信息。

知道如何右键单击并在DHCP中添加预订吗?

在DHCP中查找“唯一ID”。这是MAC地址,没有冒号。