#!/usr/bin/env python import ctypes import socket import struct def get_macaddress(host): """ Returns the MAC address of a network host, requires >= WIN2K. """ # Check for api availability try: SendARP = ctypes.windll.Iphlpapi.SendARP except: raise NotImplementedError('Usage only on Windows 2000 and above') # Doesn't work with loopbacks, but let's try and help. if host == '127.0.0.1' or host.lower() == 'localhost': host = socket.gethostname() # gethostbyname blocks, so use it wisely. try: inetaddr = ctypes.windll.wsock32.inet_addr(host) if inetaddr in (0, -1): raise Exception except: hostip = socket.gethostbyname(host) inetaddr = ctypes.windll.wsock32.inet_addr(hostip) buffer = ctypes.c_buffer(6) addlen = ctypes.c_ulong(ctypes.sizeof(buffer)) if SendARP(inetaddr, 0, ctypes.byref(buffer), ctypes.byref(addlen)) != 0: raise WindowsError('Retreival of mac address(%s) - failed' % host) # Convert binary data into a string. macaddr = '' for intval in struct.unpack('BBBBBB', buffer): if intval > 15: replacestr = '0x' else: replacestr = 'x' macaddr = ''.join([macaddr, hex(intval).replace(replacestr, '')]) return macaddr.upper() if __name__ == '__main__': print 'Your mac address is %s' % get_macaddress('localhost')