Автор оригинала: Mike Driscoll.
В прошлом месяце я написал сообщение о том, чтобы получить системную информацию Windows, и я упомянул в одном из моих комментариев, что был еще один скрипт, который сделал некоторые из этого, а также другие вещи, но я не мог его найти. Ну, сегодня я пошел копать для этого и нашел сценарий, который я хотел. Таким образом, мы возвращаемся по дыре кролика для некоторых советов и трюков для получения информации о прекрасном мире Windows, используя Python.
Следующие скрипты взяты из сценария входа в систему, который я использую, и обслуживаю при моей работе. Обычно нам нужно несколько способов определить конкретную машину пользователя. К счастью, большинство рабочих станций имеют несколько уникальных идентификаторов, таких как IP, MAC-адрес и имя рабочей станции (хотя ни один из них не обязательно должен быть уникальным … у нас на самом деле была рабочая станция, которая имела нисхол с тем же Mac, что и один из наших серверов , Например). Во всяком случае, давайте доберемся до кода!
Как получить имя вашей рабочей станции
В этом разделе мы будем использовать модуль платформы, чтобы получить имя нашего компьютера. Мы на самом деле упомянули этот трюк в моем предыдущем в моей предыдущей статье, но поскольку нам нужна эта информация для следующего фрагмента, я собираюсь повторить этот трюк здесь:
from platform import node computer_name = node()
Это было довольно безболезненно, верно? Только две строки кода, и у нас есть то, что нам нужно. Но есть на самом деле, по крайней мере, еще один способ получить это:
import socket computer_name = socket.gethostname()
Этот фрагмент также чрезвычайно прост, хотя первый немного короче. Все, что нам нужно было сделать, это импортировать встроенный розетка Модуль и позвоните его GetHostName метод. Теперь мы готовы получить IP-адрес нашего ПК.
Как получить IP-адрес вашего ПК с Python
Мы можем использовать информацию, которую мы выбрали выше, чтобы получить IP-адрес нашего ПК:
import socket ip_address = socket.gethostbyname(computer_name) # or we could do this: ip_address2 = socket.gethostbyname(socket.gethostname())
В этом примере мы снова используем розетка Модуль, но на этот раз мы его GetHostbyName Способ и пройти во имя ПК. розетка Затем модуль вернет IP-адрес.
Вы также можете использовать Тим Золотой WMI модуль Отказ В следующем примере исходит от его замечательной кулинарной книги WMI:
import wmi c = wmi.WMI () for interface in c.Win32_NetworkAdapterConfiguration (IPEnabled=1): print interface.Description for ip_address in interface.IPAddress: print ip_address print
Все, что он делает, если петля по установленным сетевым адаптерам и распечатает их соответствующие описания и IP-адреса.
Как получить MAC-адрес с Python
Теперь мы можем обратить наше внимание на получение MAC-адреса. Мы посмотрим на два разных способа получить его, начиная с рецепта ActiveState:
def get_macaddress(host='localhost'): """ Returns the MAC address of a network host, requires >= WIN2K. """ # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/347812 import ctypes import socket import struct # 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' if macaddr != '': macaddr = ':'.join([macaddr, hex(intval).replace(replacestr, '')]) else: macaddr = ''.join([macaddr, hex(intval).replace(replacestr, '')]) return macaddr.upper()
Поскольку я не писал код выше, я не буду входить в него в глубину. Тем не менее, я понимаю, что этот сценарий работает с первой проверкой, чтобы увидеть, может ли он сделать запрос ARP, который доступен только в Windows 2000 и выше. После того, как это подтвердило, он пытается использовать модуль CTYPES, чтобы получить адрес INET. После этого сделано, он проходит через некоторые вещи, которые я не понимаю, чтобы построить MAC-адрес.
Когда я впервые начал поддерживать этот код, я думал, что должен быть лучший способ получить MAC-адрес. Я думал, что, возможно, модуль WMI Tim Golden WMI или, возможно, пакет Pywin32 будет ответом. Я довольно уверен, что он дал мне следующий фрагмент или я нашел его на одном из архивов списка рассылки Python:
def getMAC_wmi(): """uses wmi interface to find MAC address""" interfaces = [] import wmi c = wmi.WMI () for interface in c.Win32_NetworkAdapterConfiguration (IPEnabled=1): if interface.DNSDomain == 'www.myDomain.com': return interface.MACAddress
К сожалению, хотя этот метод работает, заметно замедлял сценарий входа в систему, поэтому я закончил использовать оригинальный метод в конце. Я думаю, что г-н Golden выпустил более новую версию модуля WMI, так что это возможно, что теперь это быстрее.
Как получить имя пользователя
Получение входа в текущее имя пользователя с Python Trivial. Все, что вам нужно, это Pywin32 пакет Отказ
from win32api import GetUserName userid = GetUserName()
Один быстрый импорт, и у нас есть имя пользователя в двух строках кода.
Как найти, какие группы пользователь в
Мы можем использовать UserID, который мы приобрели выше, чтобы узнать, какие группы это в.
import os from win32api import GetUserName from win32com.client import GetObject def _GetGroups(user): """Returns a list of the groups that 'user' belongs to.""" groups = [] for group in user.Groups (): groups.append (group.Name) return groups userid = GetUserName() pdcName = os.getenv('dcName', 'primaryDomainController') try: user = GetObject("WinNT://%s/%s,user" % (pdcName, userid)) fullName = user.FullName myGroups = _GetGroups(user) except Exception, e: try: from win32net import NetUserGetGroups,NetUserGetInfo myGroups = [] groups = NetUserGetGroups(pdcName,userid) userInfo = NetUserGetInfo(pdcName,userid,2) fullName = userInfo['full_name'] for g in groups: myGroups.append(g[0]) except Exception, e: fullname = "Unknown" myGroups = []
Это более пугающее, чем любой из предыдущих скриптов, на которых мы смотрели, но это на самом деле довольно легко понять. Сначала мы импортируем модули или метод, который нам нужен. Далее у нас есть простая функция, которая принимает пользовательский объект в качестве своего единственного параметра. Эта функция будет включать в себя групп пользователя и добавить их в список, который затем возвращается к абонеру. Следующая часть головоломки получает основной контроллер домена, который мы используем ОС модуль для.
Мы передаем PDCName и UserID в GetObject (что является частью модуля Win32Com), чтобы наш пользовательский объект. Если это работает правильно, то мы можем получить полное имя и группы пользователя. Если он не удается, то мы ловим ошибку и попытаемся получить информацию с некоторыми функциями из модуля Win32Net. Если это также не удается, мы просто устанавливаем некоторые значения по умолчанию.
Обертывание
Надеюсь, вы узнали некоторые ценные трюки для использования в вашем собственном коде. Я использовал эти сценарии в течение нескольких лет с Python 2.4+, и они отлично работают!