Windows-hændelsesloggen er et vigtigt værktøj for administratorer til at spore fejl, advarsler og andre informationsrapporter, der logges af operativsystemet, dets komponenter eller programmer. Du kan bruge Event Viewer grafiske MMC snap-in (eventvwr.msc) for at se Windows-hændelsesloggen. I nogle tilfælde er det meget mere praktisk at bruge PowerShell til at parse og analysere information fra hændelsesloggene. I denne artikel lærer du, hvordan du brugerGet-WinEventcmdlet for at få oplysninger fra Windows hændelseslogfiler.
Indhold:
- Get-WinEvent: Søg i hændelseslogfilerne ved hjælp af PowerShell
- Hurtig begivenhedssøgning med FilterHashtable-indstillingen
- Avanceret Get-WinEvent-filtrering med FilterXml
- Hent hændelseslogfiler fra fjerncomputere
To cmdlets til at få adgang til hændelseslogposter er i øjeblikket tilgængelige i Windows:Hent-EventLogogGet-WinEvent.Vi anbefaler, at du bruger Get-WinEvent i de fleste tilfælde, da det er mere produktivt, især i scenarier, hvor du skal behandle et stort antal hændelser fra fjerncomputere. Get-EventLog cmdlet'en er forældet og blev brugt til at hente logfiler i tidligere versioner af Windows. Desuden understøttes Get-EventLog ikke i de seneste versioner af PowerShell Core 7.x.
Get-WinEvent: Søg i hændelseslogfilerne ved hjælp af PowerShell
For at bruge kommandoen Get-WinEvent skal du køre PowerShell som administrator. Hvis du forsøger at køre Get-WinEvent som en ikke-admin bruger, vil du ikke være i stand til at få adgang til visse logfiler, inklusive sikkerhedslogfilerne.
For at få en liste over hændelser fra en specifik log, skal du angive dens navn. For eksempel viser følgende kommando de sidste 20 hændelser fra systemloggen:
Get-WinEvent -LogName Application -MaxEvents 20
System-, applikations-, sikkerheds- eller opsætningslogfiler er de mest almindelige logfiler at forespørge på. Du kan også angive andre lognavne. Du kan få en komplet liste over hændelseslogfiler i Windows med kommandoen:
Get-WinEvent -ListLog *

For at se RDP-forbindelseshistorikken på en computer skal du f.eks. angiveMicrosoft-Windows-TerminalServices-RemoteConnectionManager/Operationallog:
Get-WinEvent -LogName Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational
Eller du kan hente SSH-forbindelseslogfilerne i Windows fra OpenSSH/Operational log:
Get-WinEvent -LogName OpenSSH/Operational
Du kan også vælge hændelser fra flere logfiler på én gang. Hvis du f.eks. ønsker at få information om fejl og advarsler fra system- og applikationslogfiler for de sidste 24 timer, skal du bruge følgende kode:
$StartDate = (Get-Date) - (New-TimeSpan -Day 1)
Get-WinEvent Application,System | Where-Object {($_.LevelDisplayName -eq "Error" -or $_.LevelDisplayName -eq "Warning") -and ($_.TimeCreated -ge $StartDate )}


Du kan bruge cmdlet'erne Select-Object eller Format-Table til kun at vise specifikke hændelsesfelter:
Get-WinEvent -LogName System | Format-Table Machinename, TimeCreated, Id, UserID

Du kan yderligere behandle data hentet fra hændelsesloggen. I dette eksempel vil vi straks konvertere brugernavnet til SID:
Get-WinEvent -filterhash @{Logname="system"} |
Select-Object @{Name="Computername";Expression = {$_.machinename}},@{Name="UserName";Expression = {$_.UserId.translate([System.Security.Principal.NTAccount]).value}}, TimeCreated
Hurtig begivenhedssøgning med FilterHashtable-indstillingen
Ovenstående metode til at filtrere specifikke hændelser fra Event Viewer-logfilerne med Where-Object kan være let at forstå, men den er ekstremt langsom, især hvis du vil søge gennem et stort antal hændelser. I de fleste tilfælde er det bedre at bruge Event Viewer-serversidefiltrering ved hjælp afFilterHashtablevalgmulighed.
Lad os nu prøve at generere en liste over fejl og advarsler over en 30-dages periode ved hjælp af Where-Object og FilterHashtable. Vi vil så brugeMeasure-Commandfor at sammenligne udførelsestiden for disse to PowerShell-kommandoer:
$StartDate = (Get-Date).AddDays(-30)
Først kontrollerer vi udførelsestiden for kommandoen med Where-Object-filteret:
(Measure-Command {Get-WinEvent Application,System | Where-Object {($_.LevelDisplayName -eq "Error" -or $_.LevelDisplayName -eq "Warning") -and ($_.TimeCreated -ge $StartDate )}}).TotalMilliseconds
Den samme kommando med FilterHashtable:
(Measure-Command {Get-WinEvent -FilterHashtable @{LogName="System",'Application'; Level =2,3; StartTime=$StartDate }}).TotalMilliseconds
Dette eksempel viser, at FilterHashtable-hændelsesfiltreringskommandoen er30 gange hurtigereend det sædvanlige Where-Object-filter (2.5sek vs76sekunder).


Hvis du har brug for at finde hændelser efter EventID, skal du bruge følgende kommando med parameteren FilterHashtable:
Get-WinEvent -FilterHashtable @{logname="System";id=1074}|ft TimeCreated,Id,Message
I dette eksempel har vi modtaget de seneste Windows-genstart- og shutdown-begivenheder, hvilket giver os mulighed for at bestemme, hvem der genstartede eller lukkede Windows-maskinen ned.
FilterHashtable-argumentet giver dig mulighed for at filtrere efter følgende hændelsesattributter:
- Lognavn
- Udbydernavn
- Sti
- Nøgleord (brug 9007199254740992 til at søge efter vellykkede begivenheder og 4503599627370496 for mislykkede)
- ID
- Niveau (1=FATALT, 2=FEJL, 3=Advarsel, 4=Information, 5=DEBUG, 6=TRACE, 0=Info)
- Starttid
- EndTime
- UserID (brugerens SID)
- Data
Her er et eksempel på søgning efter en begivenhed over et bestemt tidsrum:
Get-WinEvent -FilterHashTable @{LogName="System"; StartTime=(get-date).AddDays(-7); EndTime=(get-date).AddHours(-1); ID=1234}
Kommandoen nedenfor kan bruges, hvis du ønsker at finde specifik tekst i begivenhedsbeskrivelsen:
Læs mere:Sådan skriver du logfiler til Windows Event Viewer fra PowerShell/CMD
Get-WinEvent -FilterHashtable @{logname="System"}|Where {$_.Message -like "*USB*"}


Avanceret Get-WinEvent-filtrering med FilterXml
Get-WinEvent-filtrene med FilterHashtable-indstillingen har nogle begrænsninger. Hvis du skal bruge komplekse forespørgsler med mange kriterier til at vælge begivenheder efter, skal du brugeFilterXmlflag, som giver dig mulighed for at foretage valget ved hjælp af en XML-forespørgsel. I lighed med FilterHashtable er FilterXml-filtre server-side. Det betyder, at du får resultatet ret hurtigt.
For eksempel, her er en anden måde at få de seneste fejl fra systemloggen for de sidste 30 dage:
$xmlQuery = @'
<QueryList>
<Query Id="0" Path="System">
<Select Path="System">*[System[(Level=2 or Level=3) and TimeCreated[timediff(@SystemTime) <= 2592000000]]]</Select>
</Query>
</QueryList>
'@
Get-WinEvent -FilterXML $xmlQuery


For at generere en kompleks XML-forespørgselskode kan du bruge Event Viewer grafiske konsol:
- Kør kommandoen
eventvwr.msc; - Find den log, du vil oprette en forespørgsel til, og klikFiltrer aktuel log;


- Vælg de nødvendige forespørgselsparametre i filterformularen. I dette eksempel vil jeg finde hændelser med specifikke hændelses-id'er for de sidste 7 dage for en bestemt bruger;


- For at få XML-forespørgselskoden skal du gå til XML-fanen og kopiere XPath-koden (
CTRL+A,CTRL+C);

- Du kan redigere denne forespørgsel manuelt, hvis det er nødvendigt.
For at eksportere listen over begivenheder til en CSV-fil, skal du bruge Export-CSV-cmdlet'en:
$Events= Get-WinEvent -FilterXML $xmlQuery
$events| Export-CSV "C:psFilterSYSEvents.csv" -NoTypeInformation -Encoding UTF8
Hent hændelseslogfiler fra fjerncomputere
For at få hændelser fra en fjerncomputer skal du blot angive dens navn i-Computernavnparameter:
$computer="mun-dc01"
Get-WinEvent -ComputerName $computer -FilterHashtable @{LogName="System"; StartTime=(get-date).AddHours(-24)} | select Message,Id,TimeCreated
Du kan forespørge flere fjernværter på én gang for at søge efter specifikke begivenheder. Du kan få listen over fjerncomputere fra en tekstfil:
$servers = Get-Content -Path C:psservers.txt
Eller fra Active Directory:
$servers = (Get-ADComputer -Filter 'operatingsystem -like "*Windows Server*" -and enabled -eq "true"').Name
foreach ($server in $servers) {
Get-WinEvent -ComputerName $server -MaxEvents 5 -FilterHashtable @{
LogName="System"; ID= 1234
} | Select-Object -Property ID, MachineName
}
Her er et andet eksempel på søgning efter lockout-hændelser for brugerkonto på alle domænecontrollere:
$Username="a.muller"
Get-ADDomainController -fi * | select -exp hostname | % {
$GweParams = @{
'Computername' = $_
'LogName' = 'Security'
'FilterXPath' = "*[System[EventID=4740] and EventData[Data[@Name="TargetUserName"]='$Username']]"
}
$Events = Get-WinEvent @GweParams
$Events | foreach {$_.Computer + " " +$_.Properties[1].value + ' ' + $_.TimeCreated}
}










![[Windows Tip] Sådan deaktiveres Windows Defender permanent](https://media.askvg.com/articles/images5/Turn_Off_Windows_Defender_Windows_10.png)

