Export protokolů a událostí v PowerShellu: kompletní průvodce

Poslední aktualizace: 16/10/2025
Autor: Isaac
  • PowerShell zaznamenává vaši aktivitu do protokolu Windows PowerShell a umožňuje upravit, co se zapisuje, pomocí preferenčních proměnných.
  • Get-EventLog je vhodný pro klasické protokoly; Get-WinEvent a hashtable filtry jsou moderní a efektivnější volbou.
  • Pro nativní EVTX použijte wevtutil epl; pro tabulková data zabraňují zkrácení parametry Select-Object a Export-Csv.

Export protokolů a událostí v PowerShellu

Pokud pracujete se systémy Windows, dříve či později budete potřebovat generovat reporty z protokolu událostí. PowerShell je švýcarský nůž pro dotazování, filtrování a export protokolů bez nutnosti klikání v Prohlížeči událostí a také umožňuje automatizovat tento proces pro více počítačů současně.

V následujících řádcích naleznete praktického a komplexního průvodce sestaveného ze spolehlivých referencí a příkladů z reálného světa, který vám pomůže pochopit, jak PowerShell zaznamenává svou vlastní aktivitu, jak tato data zobrazit a především jak exportovat události do formátu CSV, XML a EVTX pomocí robustních technik založených na Get-EventLog, Get-WinEvent a nástroji wevtutil.

Jak PowerShell zaznamenává události a kde je zobrazit

Systém Windows vytváří specifický protokol s názvem protokol Windows PowerShellu, který zaznamenává aktivitu interpretu a jeho poskytovatelů. Tento protokol lze otevřít z Prohlížeče událostí nebo z PowerShellu pomocí rutin, které čtou události, například Get-EventLog.

Systém ihned po instalaci zaznamenává události enginu a dodavatele, i když můžete pomocí preferenčních proměnných upravit, co se zaznamenává. Můžete také přidat podrobnosti o provádění příkazů , pokud potřebujete pro diagnostiku větší granularitu.

Chcete-li si okamžitě prohlédnout obsah registru Windows PowerShellu z konzole, můžete spustit:
Get-EventLog -LogName 'Windows PowerShell'. Pak použijte rutiny Sort-Object, Group-Object a formátování. třídit, seskupovat nebo prezentovat výstup čitelnějším způsobem.

Například pro seskupení podle ID události máte několik užitečných možností:
Get-EventLog 'Windows PowerShell' | Format-Table -GroupBy EventID
Get-EventLog 'Windows PowerShell' | Sort-Object EventID | Group-Object EventID. Pokud potřebujete zobrazit všechny dostupné klasické záznamy v týmu, běh Get-EventLog -List.

Kromě rutin registru můžete k prohlížení podrobností souborů .evt a .evtx použít službu WMI. Pomocí Get-WmiObject můžete dotazovat třídy Win32 související s událostmi., například:
Get-WmiObject Win32_NTEventlogFile | Where-Object LogFileName -EQ 'Windows PowerShell' | Format-List -Property *
Get-WmiObject -List | Where-Object Name -Like 'Win32*Event*'

Výběr toho, co zaznamenávat: preferenční proměnné

PowerShell zpřístupňuje šest preferenčních proměnných, které určují, které události se dostanou do protokolu Windows PowerShellu. Pro každý rozsah protokolování existují dvě proměnné : engine, providers a commands. Proměnné LifecycleEvent zaznamenávají běžné události spuštění a zastavení; proměnné Health zaznamenávají chyby.

Proměnlivý Co zaznamenává
$LogEngineLifecycleEvent Boot a zastavte PowerShellový engine
$LogEngineHealthEvent Chyby programu PowerShell
$LogProviderLifecycleEvent Spuštění a ukončení poskytovatelů PowerShellu
$LogProviderHealthEvent Chyby poskytovatele PowerShellu
$LogCommandLifecycleEvent Spouštěcí a ukončovací příkazy
$LogCommandHealthEvent Chyby příkazů

Následující typy jsou ve výchozím nastavení aktivovány: $LogEngineLifecycleEvent, $LogEngineHealthEvent, $LogProviderLifecycleEvent y $LogProviderHealthEvent. Aktivace nebo deaktivace libovolného typu stačí přiřadit $true o $false k odpovídající proměnné v aktuální relaci:

# Activar eventos de ciclo de vida de comandos
$LogCommandLifecycleEvent = $true

# Desactivar eventos de ciclo de vida de proveedores
$LogProviderLifecycleEvent = $false

Poznámka: Některé události nelze zakázat, například ty, které indikují spuštění enginu PowerShellu nebo základních poskytovatelů. K těmto událostem dochází před načtením profilů a hostitelem, který přijímá příkazy , takže nezávisí na vaší konfiguraci. Pokud chcete, aby tato nastavení platila vždy, přidejte přiřazení do svého profilu PowerShellu.

  Jak rozdělit dokument Wordu do více souborů

Protokolování spuštění v modulech a pluginech

Od verze PowerShell 3.0 mohou moduly a moduly snap-in protokolovat provádění funkcí a rutin nastavením vlastnosti LogPipelineExecutionDetails na hodnotu $true. V PowerShellu 2.0 je tato funkce dostupná pouze pro moduly snap-in., ale v moderních verzích se to týká i modulů.

Pokud je LogPipelineExecutionDetails platný $truePowerShell zapisuje události spuštění relace do protokolu Windows PowerShellu v Prohlížeči událostí. Změna ovlivní pouze aktuální relaci., pokud to nevynutíte direktivně.

# Módulos
Import-Module Microsoft.PowerShell.Archive
$m = Get-Module Microsoft.PowerShell.Archive
$m.LogPipelineExecutionDetails = $true

# Complementos (PSSnapin)
$m = Get-PSSnapin Microsoft.PowerShell.Core
$m.LogPipelineExecutionDetails = $true

Toto protokolování můžete také povolit nebo zakázat pomocí skupinových zásad pomocí nastavení Povolit protokolování modulů. Tato direktiva umožňuje vypsat názvy modulů a pluginů se zástupnými znaky.Když direktiva vynutí protokolování modulu, její vlastnost LogPipelineExecutionDetails je nastavena na hodnotu . $true pro všechny relace a nelze jej ručně změnit.

Cesty zásad skupiny pro tuto konfiguraci:
Computer Configuration\ Administrative Templates\ Windows Components\ Windows PowerShell
User Configuration\ Administrative Templates\ Windows Components\ Windows PowerShell. Zásady pro uživatele mají přednost před zásadami pro počítača oba přepíší hodnotu vlastnosti v modulech a pluginech.

O bezpečnosti a auditu

Registr Windows PowerShellu je určen k zajištění provozního přehledu a pomoci s diagnostikou. Není navržen tak, aby byl bezpečný ani k ukládání citlivých dat. Stejně jako u jiných položek registru aplikací ve Windows je jeho účelem být čitelný a užitečný pro uživatele.

V mnoha prostředích mohou uživatelé číst a zapisovat do protokolů událostí. Uživatel se zlými úmysly by mohl číst události na lokálních nebo vzdálených počítačích, vkládat falešné položky a dokonce zasahovat do samotného procesu zápisu . Pro přísné požadavky na audit jsou nezbytné další kontroly a zabezpečené kanály událostí.

Get-EventLog: Syntaxe, parametry a základní příklady

Rutina Get-EventLog načítá události a protokoly z lokálních nebo vzdálených počítačů. Ve výchozím nastavení se dotazuje lokálního počítače, ale s parametrem -ComputerName můžete cílit na další počítače, aniž byste museli povolit vzdálenou komunikaci PowerShellu. Důležité: Get-EventLog funguje pouze s klasickými protokoly, jako jsou Application, System nebo Security; pro moderní kanály použijte Get-WinEvent.

Jedna poznámka ke kompatibilitě, kterou je dobré si zapamatovat: Get-EventLog a Get-WinEvent nejsou v prostředí Windows PE podporovány . Pokud pracujete s předinstalovanými prostředími, budete muset najít alternativy.

Praktické příklady pro každodenní použití s ​​Get-EventLog:
Seznam dostupných záznamů
Get-EventLog -List

Posledních 5 událostí ze systémového protokolu
Get-EventLog -LogName System -Newest 5

Nejčastější původy mezi 1000 nejnovějšími událostmi
$events = Get-EventLog -LogName System -Newest 1000
$events | Group-Object -Property Source -NoElement | Sort-Object Count -Descending

Pouze chyby v systému
Get-EventLog -LogName System -EntryType Error

Filtrovat podle ID instance a zdroje
Get-EventLog -LogName System -InstanceId 10016 -Source DCOM

Prohlížení více zařízení najednou
Get-EventLog -LogName System -ComputerName Server01,Server02,Server03. Nezapomeňte, že -ComputerName podporuje NetBIOS, IP nebo FQDN., a také bod pro domácí tým.

Vyhledávání podle textu ve zprávě
Get-EventLog -LogName System -Message *description*

Zobrazit všechny vlastnosti události
$a = Get-EventLog -LogName System -Newest 1
$a | Select-Object -Property *

Filtrovat podle zdroje a ID události a zobrazit konkrétní pole
Get-EventLog -LogName Application -Source Outlook | Where-Object { $_.EventID -eq 63 } | Select-Object Source,EventID,InstanceId,Message

Seskupit podle uživatele
Get-EventLog -LogName System -UserName 'NT*' | Group-Object UserName -NoElement | Select-Object Count,Name

Filtrovat podle časového rozsahu
$begin = Get-Date -Date '01/17/2019 08:00:00'
$end = Get-Date -Date '01/17/2019 17:00:00'
Get-EventLog -LogName System -EntryType Error -After $begin -Before $end. Parametry -After a -Before omezují časový rozsah. ale ve výstupu se neobjevují.

  Jak si udělit oprávnění správce ve Windows 11 krok za krokem

Klíčové parametry a užitečné detaily, které je třeba si zapamatovat:
-Název protokolu (povinné) podporuje zástupné znaky; -Seznam zobrazuje dostupné záznamy; -ComputerName akceptuje NetBIOS název, IP adresu nebo FQDN; -Nejnovější vrací N nedávných událostí; -Typ položky filtrovat podle Chyba, Informace, FailureAudit, SuccessAudit nebo Varování; -Uživatelské_jméno y -Zdroj přijímat divoké karty; -Zpráva filtrovat podle textu; -ID instance y -Index akceptovat seznamy oddělené čárkami; -Po y -Před přijmout datum a čas; -AsBaseObject vrací objekty System.Diagnostics.EventLogEntry; -AsString vrací řetězce v množině -List

Get-WinEvent vs. Get-EventLog

Get-WinEvent je moderní rutina pro zpracování protokolů založená na technologii protokolování událostí systému Windows, která byla představena ve Windows Vista. Podporuje moderní kanály, dotazy XML XPath, filtry hashtable a vylepšený výkon s velkými svazky.

Zatímco Get-EventLog je ponechán na protokoly Pro běžné scénáře se doporučuje klasika Get-WinEvent. Typický filtr podle rozsahu dat a protokolu mohlo by být:
Get-WinEvent -FilterHashtable @{ LogName = 'System'; StartTime = (Get-Date).AddDays(-30) }

Největší silnou stránkou Get-WinEvent jsou jeho pokročilé dotazy (XPath nebo FilterHashtable) a také schopnost číst odběry a vlastní protokoly. Pokud potřebujete exportovat do CSV nebo XML, můžete data přesměrovat do Select-Object a Export-Csv nebo Export-Clixml, čímž získáte čisté a použitelné struktury.

Export událostí do formátů CSV, XML a EVTX bez ztráty dat

Častým problémem při exportu událostí do souboru je použití příkazu `Format-Table` následovaného příkazem `Out-File`: `Format-Table` vytváří výstup určený pro obrazovku a může zkracovat sloupce nebo ořezávat zprávy . Pokud chcete exportovat data, použijte `Select-Object` a `Export-Csv` k získání kompletních sloupců.

Příklad exportu bezpečnostního protokolu do formátu CSV za posledních 7 dní s vybranými sloupci a bez ztrát:
$desde = (Get-Date).AddDays(-7)
Get-WinEvent -FilterHashtable @{ LogName = 'Security'; StartTime = $desde } |
Select-Object TimeCreated,Id,LevelDisplayName,ProviderName,Message,UserId,MachineName |
Export-Csv -Path 'C:\temp\security-ultimos7dias.csv' -NoTypeInformation -Encoding UTF8. Pokud stále chcete prostý text, použijte raději Out-String s velkou šířkou a poté Set-Content aby nedošlo k pořezání.

# Alternativa a TXT sin truncado
a) Salida de tabla legible en archivo
Get-EventLog -LogName System -Newest 200 |
  Format-Table TimeGenerated,EntryType,Source,EventID,Message -Wrap |
  Out-String -Width 4096 |
  Set-Content -Path 'C:\temp\system-200.txt' -Encoding UTF8

b) Exportación a XML de objetos (no .evtx)
Get-WinEvent -LogName Application -MaxEvents 500 |
  Export-Clixml -Path 'C:\temp\application-500.xml'

Pokud je vaším cílem nativní soubor .evtx, nepokoušejte se jej vytvořit pomocí Out-File nebo přesměrování: soubory .evtx jsou generovány pouze subsystémem událostí systému Windows . Podporovaným nástrojem pro export do souboru .evtx je wevtutil s volbou epl.

Exportujte posledních 30 dní do souboru .evtx pro Systém, Zabezpečení, Nastavení a Aplikace s jednou složkou na počítač a vytvořte adresář, pokud neexistuje:
$computer = $env:COMPUTERNAME
$exportDir = ::Combine($env:PUBLIC, 'Desktop\AuditLogs-' + $computer)
if (-not (Test-Path $exportDir)) { New-Item -ItemType Directory -Path $exportDir | Out-Null }
$stamp = Get-Date -Format 'MM-dd-yyyy_HHmm'
wevtutil.exe epl System "$exportDir\$stamp`_SystemLog30days.evtx" '/q:*]]' /ow:true
wevtutil.exe epl Security "$exportDir\$stamp`_SecurityLog30days.evtx" '/q:*]]' /ow:true
wevtutil.exe epl Setup "$exportDir\$stamp`_SetupLog30days.evtx" '/q:*]]' /ow:true
wevtutil.exe epl Application "$exportDir\$stamp`_ApplicationLog30days.evtx" '/q:*]]' /ow:true. Dotaz XPath používá timediff k filtrování posledních 30 dnů v milisekundách..

Dalším velmi praktickým vzorem je iterovat sadou protokolů a vytvořit název souboru se serverem a časovým razítkem. S malým časovačem si můžete vizualizovat celkovou dobu zpracování, pokud exportujete velké objemy.

$logArray = @('System','Security','Application','Setup')
$server   = $env:COMPUTERNAME
$path     = 'C:\WindowsEventLogs\'
if ($path -notmatch '.+?\\$') { $path += '\' }
if (-not (Test-Path -Path $path)) { New-Item -ItemType Directory -Path $path | Out-Null }
$tag      = Get-Date -Format 'yyyyMMddHHmm'
$sw       = ::StartNew()
foreach ($log in $logArray) {
  $dest = $path + $server + '-' + $log + '-' + $tag + '.evtx'
  Write-Host ('Extrayendo el log {0}' -f $log)
  wevtutil epl $log $dest
  # Para limpiar tras exportar: wevtutil cl $log
}
$sw.Stop(); '{0} segundos' -f (::Round($sw.Elapsed.TotalSeconds,2))

Pokud pracujete s více počítači současně a chcete generovat soubory CSV pro každý počítač, přečtěte si seznam datových zdrojů a použijte časový filtr. Pro export dat se vyhněte vzoru Format-Table | Out-File ; použijte Select-Object a Export-Csv s kódováním UTF-8.

$assetList = Get-Content -Path 'C:\temp\assetlist.txt'
$desde     = (Get-Date).AddDays(-7)
foreach ($pc in $assetList) {
  $dest = "C:\\temp\\$pc-security-7dias.csv"
  Get-WinEvent -ComputerName $pc -FilterHashtable @{ LogName='Security'; StartTime=$desde } |
    Select-Object TimeCreated,Id,LevelDisplayName,ProviderName,Message,UserId,MachineName |
    Export-Csv -Path $dest -NoTypeInformation -Encoding UTF8
}
Write-Host 'Exportación completada'

Řešení problémů s exportem protokolů

Poškozené soubory .evtx: K tomu obvykle dochází, když se někdo pokusí použít Out-File k vytvoření souboru .evtx. Soubor .evtx není prostý text; platné soubory generuje pouze wevtutil epl . Opakujte export pomocí správného nástroje.

  Chyba Photoshopu: Scratch Disks Full [Opraveno ve 3 krocích]

Oříznutí dat v souborech CSV nebo TXT: příčinou je téměř vždy formátování před exportem, například pomocí `Format-Table`. Zlatým pravidlem je vybrat vlastnosti pomocí `Select-Object` a exportovat pomocí `Export-Csv` . Pokud potřebujete čitelnou tabulku, použijte `-Wrap` a šířku ovládejte pomocí `Out-String -Width 4096`.

Nedostatečná oprávnění v protokolu zabezpečení: Chcete-li číst události zabezpečení na vzdálených nebo lokálních počítačích, musíte patřit do privilegovaných skupin (například administrátoři počítačů). Pokud Get-EventLog nebo Get-WinEvent vrátí chybu „access denied“ ( přístup odepřen ), zkontrolujte členství a zásady.

Výkon: Při použití `Get-WinEvent` vždy filtrujte u zdroje pomocí `-FilterHashtable`. Vyhněte se načítání všeho a následnému filtrování pomocí `Where-Object` , zejména u hlučných protokolů, jako je `Security`. Pro `Get-EventLog` použijte `-Newest` a nativní parametry filtru.

Prostředí Windows PE: Tato prostředí nejsou podporována nástroji Get-EventLog ani Get-WinEvent. Pokud se nacházíte v prostředí před instalací, zvažte použití specializovaných nástrojů nebo sběr dat po úplném nasazení systému.

Rychlé recepty

Seznam všech dostupných klasických nahrávek
Get-EventLog -List

Počítání událostí podle typu v systému
Get-EventLog -LogName System | Group-Object EntryType -NoElement | Sort-Object Count -Desc

Vyhledávání událostí pomocí klíčového slova ve zprávě
Get-EventLog -LogName Application -Message *timeout*

Vícetýmové akce paralelně
'Srv01','Srv02','Srv03' | ForEach-Object { Get-EventLog -LogName System -ComputerName $_ -Newest 100 }. Přidat Select-Object do řídicích sloupců a Export-CSV pro zachování výsledky na disku.

S výše uvedeným nyní máte kritéria pro výběr správného nástroje a techniky: Get-EventLog pro klasický přístup, Get-WinEvent pro moderní a wevtutil, pokud chcete EVTX . Použitím filtrů u zdroje, výběrem vlastností před exportem a vyhnutím se předformátování výstupu dosáhnete spolehlivých, úplných a rychlých exportů lokálně i vzdáleně a můžete je naplánovat pomocí úkolů , abyste se o to nemuseli starat každý měsíc.

Příkaz Get-WinEvent v PowerShellu
Související článek:
Jak použít příkaz Get-WinEvent v PowerShellu