Рубрики
Без рубрики

Pywin32: получение журналов событий Windows

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: 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 довольно проста. Во всяком случае, я надеюсь, что вы научились многое и найду это полезным.

Дальнейшее чтение