English 中文(简体)
Get mac address from IP using DHCP?
原标题:

I am trying to create scripts/services that allow for waking PCs in a windows domain via WOL. Now i want to give the user the option to select an AD container as a starting point for the waking of PCs contained within. My initial thought is using DHCP as a repository to query for MAC addresses given the hostnames (which i can easily enough pull from AD given the container).

Is there a way to programmatically query the DHCP service/server, passing hostnames and recover the associated MAC addresses?

Or, is there a better/easier way to solve my problem?

最佳回答

Try dhcpexim.exe from microsoft.

or, if you prefer using pure C. DhcpEnumSubnetClientsV4

问题回答

This is a little bit wacky it seems that there s no way to query the DHCP server programmatically. Thanks cottsak for asking the question. I understand that the DHCP protocol doesn t have such a query, but I thought mayb the executable from Microsoft might have some way you can address it from the command line. I haven t heard anybody anywhere say that there is no such case, but it must be so.

WHOA, wait a minute... I think I found what we re looking for: NETSH. cf:

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

Where it says if you open a command prompt on the DHCP server you can run this command:

netsh dhcp server scope 192.168.1.0 show clients

and get a report such as this:

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

Yippeee! Thanks for the thread!! If it wasn t for this one, I enver would have narrowed my search to technet adn found that one.

No problem; because all of the machines are in your domain you can put together a VBScript that will get the MACAddress(es) from the local machine and store it as an attribute of the computer object in Active Directory.

Here s a quick hack on how to do that (save this as a .vbs-file):

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 & "
ootcimv2")
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

Because your clients aren t all in the "Member Servers" OU above you ll need to modify the above script to include a directory search for the strComputerName do get the COMPUTERLOCATION.

When you have a working script, ask your domain administrator to put the script as a start-up script targetting the computers you need to monitor; that way it ll execute whenever a computer boots up. You can also run the script as a scheduled task to get your data from any clients that haven t rebooted or use psexec or some other way you can think of to get the data immediately. Or you can rewrite the script entirely to remote connect to all of your machines and get the data that way (which might not be possible due to local firewalls). Or you could write a small .NET console application which does the same thing, it s up to you...

Also, although there is a networkAddress-attribute defined for computer objects; by default the computer object itself does not have access to write to this property. Because start up-scripts run in the context of the SYSTEM account on the particular machine the easiest thing is to use an attribute that the computer object (SELF) has write access to. The otherTelephone-attribute is multivalued and part of the Personal-Information Property Set which all computer objects has write access to by default. If you want to use the networkAddress-attribute you need to set explicit write access to that attribute for all of your computers.

Also you need to bear in mind that storing the the MAC address in Active Directory means that all of the users in your domain will have read access to it which in turn might possibly (depending on your environment) pose a small security risk.

To do it the way the network does.

Grab SharpPcap (Pcap wrapper for C#) and WinPcap (Windows) or libpcap (*nix). Write an application that creates SNMP packets to query the ARP table on the router.

Note: The ARP (Address Resolution Protocol) table is the table containing the mapping of IP address to MAC address.

I ve been thinking about implementing an example that does this lately but I don t have one to show yet. Once I do, I ll make sure it gets added to the SharpPcap examples found in the project s source tree.

You can t do that with DHCP. DHCP attributes IP from MAC, not the other way around. ARP is what converts IP into MAC but it s the machine itself that answers ARP requests so if it s off it s obviously not gonna answer ...

I suggest you store the MAC in your AD directly (I guess AD supports custom attributes ?)

you need to use arp to get a mac adress and doing so In C is a long process.

Mac adresses are hard coded, so if you have X computers go and get X mac addresses and tie them to the AD.

Note that the computer will have to be on to request its mac address.

Finding MAC address from IP address

Yeah dun worry about it, you can pull this info directly from DHCP if the PC has a lease.

Know how you right click and add a reservation in DHCP?

Look in DHCP for the unique ID . It s the MAC address, sans the colons.





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签