МУ_ЛР_БОС. А. С. Новиковым и обсуждены на заседании кафедры
PowerShell 2._Теоретические_сведения'>1. Цель работы Получение практических навыков работы с журналами событий ОС Windows с использованием средства автоматизации PowerShell2. Теоретические сведения Рассмотрим командлеты PowerShell основанные на .NET, для работы с журналами событий. Начнем с самого простого командлета - Get-EventLog . Он позволяет получать данные и информацию о журналах событий.# смотрим список имеющихся журналов Get-EventLog –List # полученный список можно форматировать (сотмительное удовольствие) Get-EventLog -List | Format-List * # или получить сведения по определенному журналу Get-EventLog -List | Where-Object { $_ .Log -eq "Application" } | FL Поиск событий Поиск событий выглядит довольно просто т.к. он легко фильтруется через Where-Object. Для понимания того что мы ходит найти вводимGet-EventLog -Newest 1 -LogName application | Get-Member видим Смотрим первый столбик. Отсюда можно взять различные полезности (по имени) для поиска события по его ID и пр.# Взять 10 последних записей из журнала Application имеющих тип Error Get-EventLog -Newest 10 -LogName application | Where-Object { $_ .EntryType -eq "Error" } # Взять 100 последних записей из журнала Security с ID 529 Get-EventLog -Newest 100 -LogName security | Where-Object { $_ .EventID -eq "529" } | FL # Взять 100 последних записей из журнала Security только за сегодня Get-EventLog -Newest 100 -LogName security | Where-Object { $_ .TimeGenerated.Date -eq ( Get-Date ) .Date } | FL # Найти 100 записей из журнала Security за последние 7 дней с кодом 529 Get-EventLog -Newest 100 -LogName security | Where-Object {{ $_ .TimeGenerated.Date -eq ( Get-Date ) .AddDays ( - 7 )} -and { $_ .EventID -eq "529" }} Просмотр событий на локальном компьютере Для просмотра событий на локальном компьютере используйте все тот же командлет Get-EventLog с ключом -LogName и указанием имени нужного журнала.# доступный список журналов получаем с помощью Get-EventLog –List # для получения последних десяти событий вводим Get-EventLog -LogName application -Newest 10 # для запроса только ошибок вводим Get-EventLog -LogName application -Newest 100 - EntryType Error # для получения информации от определенного источника необходимо ввести Get-EventLog -LogName application -Newest 100 - source outlook Просмотр событий на удаленном компьютере Для получения данных журналов на удаленном хосте используется все тот же командлет Get-EventLog , синтаксис запросов прежний, требуется только указание параметра -ComputerName . # получаем список журналов с хоста под именем REMOTE_HOSTGet - EventLog - ComputerName REMOTE _ HOST - List Аналогичный функционал можно получить, если использовать WMI-класса Win32_NTEventlogFile $Logs = Get - WMIOject -Class Win32_NTEventLogFile - Computer REMOTE_HOST $Logs | FL Создание собственных журналов При написании какого-нибудь инструментария ведущего записи в журналах желательно (но необязательно) вести записи в отдельном журнале, имеющем осознанное имя, в моем случае это PsScripts.New - Eventlog -logname ‘PsScripts’ - Source ‘Logonscript’ Создание записей в журнале Для создания записей в журнале используется командлет Write-EventLog. write - eventlog -logname ‘PsScripts’ - Source ‘Logonscript’ -Message ‘Something bad happened’ -id 111 write - eventlog -logname ‘PsScripts’ - Source ‘Logonscript’ - eventID 112 - entrytype Information -message "PsApp added a user-requested feature to the display." -category 1 - rawdata 10 , 20 Очистка журналов Для очистки журнала используйте командлет Clear-Eventlog с параметром -LogName Clear - Eventlog -LogName "Application" Удаление журналов Созданный несколькими пунктами ранее журнал при необходимости можно удалить командой.Remove - Eventlog -logname ‘PsScripts’ Экспорт данных Для удобства анализа журналов можно их выгружать в CSV-формат. Get-EventLog -LogName system -newest 100 | Export-Csv -NoTypeInformation D:\Report\1.csv Правильнее результаты выгружать в обычный текстовый файл.Get-EventLog -LogName system -newest 100 | Out -File D:\Report\1.csv Примеры Резервное копирование файла журнала или журналов в зависимости от поставленной задачи.# наша цель – журнал Application $log = gwmi "Win32_NTEventLogFile WHERE LogFileName=’Application’" # сохраним его в файл $log .BackupEventlog ( "D:\Backup\Application-backup.evt" ) # второй вариант того же действия # тот же журнал Application $logName = "Application" # куда сохранять результат $path = "D:\Backup\" # сформируем имя файла $exportFile = $logName + ( get-date -f yyyyMMdd ) + ".evt" # запрашиваем данные $logFile = Get-WmiObject Win32_NTEventlogFile | Where-Object { $_ .logfilename -eq $logName } # сохраняем в файл $logFile .backupeventlog ( $path + $exportFile ) # остается только назначить задание в планировщике и дописать процедуру очистки журнала. Рассмотрим работу командлета Get-WinEvent который получает события из журналов и файлов журналов отслеживания событий (файлы созданные средством отслеживания событий для Windows (ETW)), как на локальном компьютере так и на удаленном.Примечание. Командлет Get-WinEvent работает только в Windows Vista, Windows Server 2008 R2 и последующих версиях Windows. Для работы потребуется установленный Microsoft .NET Framework 3.5 или более поздней версии. Для начала вызываем комадлет без параметров.Get - WinEvent Чтобы прервать выполнение команды нажмите CTRL+C. Информации много, причем бесполезной. Пора посмотреть детально на то чем мы располагаем и что можем сделать. Смотрим список всех журналов, имеющиеся на локальном компьютере.Get - WinEvent - ListLog * | ft - a Некоторые журналы могут быть пустыми (при выводе они будут только мешать) и поэтому немного видоизменяем запрос Get - WinEvent - ListLog * | Where { $_ .recordcount } Если нам требуются только «классические» журналы, которых гораздо меньше, для их просмотра используйте:Get - WinEvent - listlog * | Where { $_ .IsClassicLog -eq ‘True’ } Для получения количества событий из определенного журнала используйте:$events = Get - WinEvent -logname "Windows PowerShell" $ events . count После получения списков журналов можно продолжить изучение и перейти к поставщикам журналов событий (Provider).Примечание: Поставщик журнала событий — это программа или служба, которая записывает события в журнал событий. Посмотреть список всех провайдеров можно командой.Get - WinEvent - ListProvider * Определенного поставщика можно задать по имени или по маске.Get - WinEvent - ListProvider * update * Get - WinEvent - ListProvider * policy * Например, все установленные обновления запрашиваются из журнала следующим образом:$provider = Get - WinEvent - ListProvider Microsoft - Windows - WindowsUpdateClient $provider .events | ? { $_ .description -match "success" } | select id , description | ft -AutoSize Можно вытянув запрос в строку использовать Events вот так:( get - winevent - listprovider microsoft - windows - grouppolicy ) .events | format-table id , description - auto Фильтрация событий Для осмысленного поиска по журналам мы можем использовать традиционный командлет Where-Object примером чему может послужить запрос на выборку из журнала Application событий имеющих уровень Error (Level = 2).Get - WinEvent -logName Application - maxEvents 100 | Where-Object { $_ .Level -eq 2 } | Format-Table DisplayName , id , ProviderName - auto Для удобства поиска можно использовать не одно а сразу несколько условий, это достигается благодаря использованию FilterHashTable, FilterXML или FilterXPath. Подобная фильтрация эффективнее использования командлета Where-Object, поскольку фильтры применяются во время извлечения объектов (вместо того чтобы сначала извлечь все объекты, а затем фильтровать их). Для наглядной демонстрации можно привести методики получения события 4624, за последние сутки, тремя различными методами.# используем FilterHashTable $yesterday = ( get-date ) - ( new-timespan -day 1 ) get - winevent - FilterHashTable @ { LogName = ‘Security’ ; ID = "4624" ; StartTime = $yesterday } | ft TimeCreated , ID , Message # Используем FilterXML get - winevent - FilterXML "< QueryList > < Query Id=’0′ Path=’Security’ > < Select Path=’Security’ >*[System[(EventID=4624) and TimeCreated[timediff(@SystemTime) <= 86400000]]] < / Query > < / QueryList >" # используем FilterXPath Get - WinEvent -LogName Security - FilterXPath "* [ System [ (EventID=4624) and TimeCreated[timediff(@SystemTime) <= 86400000 ] ] ]" Получение данных из файла Данные можно получать и из сохраненных ранее файлов, для использования этой возможности необходимо только указать параметр -Path.Get - WinEvent -Path ‘c:\ps-test\Test-Log.evtx’ Экспорт данных В завершении остается только экспортировать полученные данные в файл. Например, в формат Csv:Get - WinEvent -LogName Application - MaxEvents 100 | select ID , Message | Export-Csv c:\temp\Applog2.csv Для работы с журналами на удаленных хостах используйте параметр -ComputerName и -Credential для указания необходимых учетных данных.# Получаем список журналов имеющих записи. Get - WinEvent - listlog * -ComputerName SRV01 | where { $_ .recordcount } # тоже самое только с указанием необходимых креденшелов Get - WinEvent - listlog * -ComputerName SRV01 -Credential ( Get-Credential ) | where { $_ .recordcount } Для примера можно привести экспорт журналов с трех серверов. При этом надо отметить что речь идет о серверах под управлением Windows 2008 и старше. Для работы с Windows 2003 используйте командлет Get-EventLog $list = "SRV01" , "SRV02" , "SRV03" foreach ( $server in $list ) { $server ; Get - WinEvent - ListLog "Windows PowerShell" -ComputerName $server | Export-Csv c:\temp\ $server - log2.csv } 3. Оборудование Персональный компьютер с установленной операционной системой MS Windows 2000 SP4 , XP SP 2, Vista или 7 .4. Задание на работу Используя Windows PowerShell, выполнить последовательность действий , описанных в теоретических положениях данной лабораторной работы: 1. Реализовать доступ и поиск событий в системных журналах. 2. Реализовать создание собственного журнала, добавление в него записей и удаление журнала. 3. Реализовать экспорт данных и очистку журнала. 4. Реализовать фильтрацию событий в системных журналах.5. Оформление отчета Отчет должен содержать: название и цель работы; краткие теоретические сведения о лабораторной работе; описание последовательности действий, совершенных в ходе выполнения лабораторной работы; скриншоты, иллюстрирующие проделанную работу. 6 Контрольные вопросы 6.1. Каким образом осуществляется доступ к журналам событий с использованием Windows PowerShell? 6.2. Каким образом можно реализовать поиск и промотр событий в системных журналах на локальном компьютере? 6.3. Каким образом можно реализовать поиск и промотр событий в системных журналах на удаленном компьютере? 6.4. Каким образом можно создавать собственные журналы и работать с ними с использованием Windows PowerShell? 6.5. Каким образом реализуется очистка и удаление журналов с исползованием Windows PowerShell? 6.6. Как реализовать экспорт данных из журналов событий с использованием Windows PowerShell? 6.7. Опишите назначение командлета Get-WinEvent. 6.8. Как реализовать фильтрацию событий в системных журналах с использованием командлета Get-WinEvent?7. Библиографический список 1. Олифер В.Г. Сетевые операционные системы: Учеб. пособие для вузов / В.Г. Олифер, Н.А. Олифер .— М.: Питер, 2003. — 544с. 2. Таненбаум Э. Современные операционные системы / Э. Таненбаум.— 2-е изд. — М.: Питер, 2006 .— 1038с. 3. Монадьеми П. Защита от хакеров в Windows XP/ П. Монадьеми, Б. Мюллер; пер. с нем. под ред. С.Н. Банникова.— М.: БИНОМ, 2005 .— 320с. 4. Немет Э. UNIX: Руководство системного администратора/ Э. Немет, Г. Снайдер, С. Сибасс, Т.Р. Хейн. 3-е изд. — М.: Питер, 2003 .— 925с.