我正在尝试创建脚本/服务,允许通过WOL唤醒Windows域中的PC。现在我想让用户选择一个AD容器作为唤醒其中包含的PC的起点。我最初的想法是使用DHCP作为存储库来查询给定主机名的MAC地址(我可以很容易地从给定容器的AD中拉出来)。
有没有办法以编程方式查询DHCP服务/服务器,传递主机名并恢复关联的MAC地址?
或者,是否有更好/更简单的方法来解决我的问题?
答案 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地址。
答案 6 :(得分:-1)
是的,担心它,如果PC有租约,你可以直接从DHCP提取这些信息。
知道如何右键单击并在DHCP中添加预订吗?
在DHCP中查找“唯一ID”。这是MAC地址,没有冒号。