Автор оригинала: Mike Driscoll.
На днях на одном из списков рассылки имелся сообщение о том, что я следую в доступе к журналам событий Windows. Я думал, что это интересная тема, поэтому я пошел в поисках примеров и нашел довольно хороший пример на ActiveState Отказ В этой статье вы обнаружите, что я обнаружил.
Вероятно, просто просто прыгать прямо в код. Обратите внимание, что единственное, что понадобится, кроме Python, вам понадобится пакет Pywin32. Как только вы получите это, то вы можете следовать вдоль:
import codecs import os import sys import time import traceback import win32con import win32evtlog import win32evtlogutil import winerror #---------------------------------------------------------------------- def getAllEvents(server, logtypes, basePath): """ """ if not server: serverName = "localhost" else: serverName = server for logtype in logtypes: path = os.path.join(basePath, "%s_%s_log.log" % (serverName, logtype)) getEventLogs(server, logtype, path) #---------------------------------------------------------------------- def getEventLogs(server, logtype, logPath): """ Get the event logs from the specified machine according to the logtype (Example: Application) and save it to the appropriately named log file """ print "Logging %s events" % logtype log = codecs.open(logPath, encoding='utf-8', mode='w') line_break = '-' * 80 log.write("\n%s Log of %s Events\n" % (server, logtype)) log.write("Created: %s\n\n" % time.ctime()) log.write("\n" + line_break + "\n") hand = win32evtlog.OpenEventLog(server,logtype) total = win32evtlog.GetNumberOfEventLogRecords(hand) print "Total events in %s = %s" % (logtype, total) flags = win32evtlog.EVENTLOG_BACKWARDS_READ|win32evtlog.EVENTLOG_SEQUENTIAL_READ events = win32evtlog.ReadEventLog(hand,flags,0) evt_dict={win32con.EVENTLOG_AUDIT_FAILURE:'EVENTLOG_AUDIT_FAILURE', win32con.EVENTLOG_AUDIT_SUCCESS:'EVENTLOG_AUDIT_SUCCESS', win32con.EVENTLOG_INFORMATION_TYPE:'EVENTLOG_INFORMATION_TYPE', win32con.EVENTLOG_WARNING_TYPE:'EVENTLOG_WARNING_TYPE', win32con.EVENTLOG_ERROR_TYPE:'EVENTLOG_ERROR_TYPE'} try: events=1 while events: events=win32evtlog.ReadEventLog(hand,flags,0) for ev_obj in events: the_time = ev_obj.TimeGenerated.Format() #'12/23/99 15:54:09' evt_id = str(winerror.HRESULT_CODE(ev_obj.EventID)) computer = str(ev_obj.ComputerName) cat = ev_obj.EventCategory ## seconds=date2sec(the_time) record = ev_obj.RecordNumber msg = win32evtlogutil.SafeFormatMessage(ev_obj, logtype) source = str(ev_obj.SourceName) if not ev_obj.EventType in evt_dict.keys(): evt_type = "unknown" else: evt_type = str(evt_dict[ev_obj.EventType]) log.write("Event Date/Time: %s\n" % the_time) log.write("Event ID / Type: %s / %s\n" % (evt_id, evt_type)) log.write("Record #%s\n" % record) log.write("Source: %s\n\n" % source) log.write(msg) log.write("\n\n") log.write(line_break) log.write("\n\n") except: print traceback.print_exc(sys.exc_info()) print "Log creation finished. Location of log is %s" % logPath if __name__ == "__main__": server = None # None = local machine logTypes = ["System", "Application", "Security"] getAllEvents(server, logTypes, "C:\downloads")
Есть пара потенциальных предостережений к такому типу сценариев. Я проверил этот код как администратора на моих компьютерах и в качестве администратора домена на работе. Я не проверил его как любой другой тип пользователя. Поэтому, если у вас возникли проблемы, чтобы запустить этот код, проверьте ваши разрешения. Я проверил это из Windows XP и Windows 7. УК не блокирует эту активность в Windows 7, так что сделали его так же просто в использовании, как только XP. Тем не менее, события Windows 7 имели несколько Unicode в части сообщения кода, тогда как XP не сделал. Следите за этим и справляйтесь с этим соответственно.
Во всяком случае, давайте распадаем этот скрипт и посмотрим, как это работает. Сначала у нас есть ряд импорта. Мы используем кодеки Модули для кодирования файла журнала в UTF-8 на всякий случай в том случае, если в сообщении есть какой-то подлый Unicode. Мы используем Pywin32’s Win32Evtlog Модуль, чтобы открыть журнал событий и вытащить информацию из него. Согласно статье, которую я упомянул в начале, чтобы получить все события из журнала, вам нужно позвонить win32evtlog.readeventlog неоднократно, пока он не перестанет возвращать события. Таким образом, мы используем в то время как петля. Внутри петли While мы используем для Цикл, чтобы повторить события и извлечь идентификатор события, номер записи, сообщение события, источник событий и несколько других Tidbits. Мы входим в систему, а затем мы выходим на для петля и в то время как петля вызывает win32evtlog.readeventlog очередной раз.
Мы используем Traceback Модуль для распечатки любых ошибок, возникающих во время прогона скрипта. И это все, что есть к этому!
Обертывание
Как видите, использование пакета Pywin32 легко. Если вы застряли, у него есть отличная документация. Если эта документация не достаточно хороша, вы можете вернуться на MSDN вместо этого. Pywin32 – это легкая обертка вокруг API Windows, поэтому использование инструкций MSDN довольно проста. Во всяком случае, я надеюсь, что вы научились многое и найду это полезным.
Дальнейшее чтение
- Python и Unicode
- Pywin32.
- Pywin32 Документация от активации