Hoe vind je info over het opnieuw opstarten voor machines in het netwerk met PowerShell en Windows event logs

Het kunnen bepalen wanneer een computer voor het laatst opnieuw is opgestart, is een taak die elk support team op een of ander moment moet uitvoeren. Windows heeft verschillende manieren om herstart informatie te vinden, maar de meeste van deze oplossingen zijn moeilijk te gebruiken als je het van meerdere computers moet weten of wanneer deze computer en netwerken geen historische informatie verstrekken. In dit artikel bekijken we de beschikbare opties en zie je  hoe je de benodigde informatie via PowerShell kunt opvragen.

Reboot tijd ophalen vanuit Windows

Er zijn verschillende manieren om de laatste keer dat een computer opnieuw is opgestart op te halen. De beschikbare opties voor het opvragen van de "uptime" of de laatste keer dat een computer is opgestart zijn redelijk, maar ze kunnen moeilijk te vinden zijn. Als je de uptime voor veel computers wilt controleren, zijn de methoden die in Windows zijn ingebouwd niet ontworpen om informatie te rapporteren voor meerdere computers of voor computers die zich op verschillende locaties kunnen bevinden.

Het hulpprogramma SystemInfo dat in Windows is ingebouwd, geeft de laatste reboot tijd weer in een gemakkelijk te verteren indeling, maar alleen na het filteren van de gegevens:

Systeminfo | find "System Boot Time"
System Boot Time:          12/17/2019, 9:46:08 PM

Voor wie meer vertrouwd is met een programmatische oplossing, kunnen we de laatste keer dat een computer opnieuw is opgestart uit WMI halen, maar de output is moeilijk te begrijpen:

PS C:\> Wmic os get lastbootuptime
LastBootUpTime
20191217214608.500331-300

Reboot informatie kan ook worden gevonden met behulp van de opdracht Net Statistics , kijken naar statistieken op uw NIC en de waarde van "Up Time" krijgen van Taakbeheer. Als u op zoek bent naar herstartinformatie voor een eenmalig verzoek, een van deze opties zijn misschien alles wat je nodig hebt. Maar wat als u deze informatie van een externe computer nodig hebt? Hoe zit het met meerdere computers in uw netwerk? Deze opties hebben beperkingen en kunnen moeilijk te gebruiken zijn in scripts of op meerdere machines.

PowerShell gebruiken om query's uit te voeren op Windows event logs

Een over het hoofd geziene plek voor het vinden van informatie wanneer computers voor het laatst zijn opgestart is de Windows Event Logs. Microsoft schrijft een schat aan informatie naar event logs over verschillende gebeurtenissen met betrekking tot het afsluiten en opnieuw starten van bewerkingen. De events en de bijbehorende ID's blijven volg en documenteer alle power-up, power down en uptime situaties met betrekking tot runtime en power cycling. De kunst is om te weten waar je op moet letten en hoe je de gegevens kunt omzetten in iets nuttigs en gemakkelijks om mee te werken.

Er zijn vijf event-id's die zijn gereserveerd voor activering-, uitschakel- en uptime-events.


Event ID Description
1074 System has been shutdown by a process/user
6005 The Event log service was started
6006 The Event log service was stopped
6008 The previous system shutdown at time on date was unexpected
6013 The system uptime is number seconds

 

Event-ID 1704 documenteert de afsluit activiteiten. Event-id's 6006, 6008 en 6013 documenteren events die verband houden met een energiecyclus en kunnen al dan niet nuttig zijn, afhankelijk van uw specifieke situatie. Het koppelen van de 6000-eventsn met 1074 geeft een beeld van hoe lang het opnieuw opstarten van bewerkingen moest worden voltooid. 6008 is belangrijk om te herkennen wanneer een computer mogelijk blauw scherm heeft of onverwacht stroom heeft verloren. 6013 is niet gerelateerd aan power cycle-events, maar documenteert hoe lang een computer al actief is sinds de laatste herstart.

We kunnen een query van deze informatie maken met behulp van een eenvoudige PowerShell-code. Laten we beginnen met de 1074 events en kijken hoe dat eruit ziet.

PS C:\> Get-WinEvent -FilterHashtable @{logname = 'System'; id = 1074} | Format-Tabel -wrap


Met één regel code kunnen we snel alle herstartinformatie uit de logboeken halen en een duidelijk beeld zien van wanneer de pc opnieuw is opgestart. Houd er rekening mee dat dit logboek afkomstig is van een nieuw gebouwde pc met slechts een paar logboekvermeldingen. De PowerShell-opdracht retourneert ALLE overeenkomsten vermeldingen in het event log. Als de pc die wordt opgevraagd een jaar of twee oud is, kan de lijst met geretourneerde gebeurtenissen lang zijn. Gebruik de parameter -MaxEvents om de lijst met gebeurtenissen af te slanken.

PS C:\> Get-WinEvent -FilterHashtable @{logname = 'System'; id = 1074} -MaxEvents 1 | Format-Tabel -wrap


Als we de events van meerdere pc's willen krijgen, dan is het nog maar één regel code:

PS C:\> $computers = "Server1","Server2"
PS C: \\ > $computers | ForEach-Object {Get-WinEvent -ComputerName $_  -FilterHashtable @{logname = 'System'; id = 1074} -MaxEvents 2 | format-table -wrap}



U kunt in het bovenstaande gedeelte van de code zien dat we een nieuw object maken met de naam $EventData dat de velden Datum, EventID, User, Action, Reason, ReasonCode, Opmerking, Computer, Message, Process bevat. Deze velden hebben dezelfde namen als de velden in de event logs.

Zodra het object is gemaakt, moeten we de event-id data uit de event log toewijzen aan de $EventData velden. Het enige dat dit doet, is PowerShell vertellen waar de gegevens in ons nieuwe object moeten worden geschreven wanneer het een logboekvermelding uit de event log leest.

Het is misschien niet duidelijk wat er gaande is op de volgende gebieden:

$EventData.User = $_.Properties [6].Value
$EventData.Process = $_.Properties[0].Value
$EventData. Action = $_.Properties[4].Value
$EventData. Reason = $_.Properties[2].Value
$EventData. ReasonCode = $_.Properties[3].Value
$EventData. Comment = $_.Properties[5].Value

Deze velden bevatten de gegevens van onze 1074 events. Als u naar een van de eerdere voorbeelden kijkt, zult u merken dat er een berichtveld is en binnen de berichtgegevens zijn er extra gegevensvelden genaamd Reason, Reason Code, Shutdown Type en Comment. Die gegevens worden opgeslagen in een array, die niets meer is dan een tabel met een heleboel rijen. Om de gegevens eruit te halen, moeten we al die rijen scheiden in verschillende velden in onze $EventData object dat we hebben gemaakt.

De getallen tussen haakjes na het woord eigenschappen vertegenwoordigen het rijnummer in de tabel. Hoe kwam ik daar achter? De informatie staat in de event log, het is gewoon niet duidelijk op het eerste gezicht. Let op de velden in de onderstaande schermafbeelding genaamd Param1 tot en met Param7. Ik heb eerder gezegd dat de gegevens zich in een array bevinden. De rijen in een array hebben elk een aantal van een "index". De data in de array zijn toegankelijk als in welke cijferrij de gegevens zich bevinden. De index in een array begint altijd met nul, dus de array-index voor onze data is 0-6 en die index vertegenwoordigt Param1 tot en met Param7.

 

Als je problemen ondervindt, heb ik alle code opgeslagen als een functie genaamd Get-RestartInfo die je kunt downloaden van mijn GitHub-repo. De functie gebruikt dezelfde code als in dit artikel plus een paar extra bits om meer hulp te bieden. Om de functie uit te voeren, laadt u deze in het geheugen en roept u de functie als volgt aan:

 

De uitvoer wordt nu in opeenvolgende volgorde op datum weergegeven. Die extra gebeurtenis-id's helpen een verhaal te vertellen over wat er is gebeurd en hoe lang het duurde om herstarts te voltooien. Dit is ook een goed moment om te vermelden dat er soms te veel gegevens zijn om in een PowerShell weer te geven troosten. Wanneer deze situaties zich voordoen, kunt u Out-Gridview gebruiken om een beter beeld van uw gegevens te krijgen.

Dezelfde opdracht hierboven met Out-GridView ziet er als volgt uit:

PS C:\> Get-RestartInfo | Out-Gridview

De resultaten zien er als volgt uit:

 

Het gebruik van PowerShell om eventlog data op te halen is handig wanneer u meer dan alleen de meest recente informatie wilt zien van wanneer computers herstart zijn. Wat u hier hebt gezien, is hoe u de event logs kunt opvragen met behulp van één regel code om de herstartinformatie voor een computer op te halen. Vervolgens bouwden we voort op die ene regel code om dezelfde informatie van meer dan één computer op te halen. Voor het opvragen van meerdere computers was slechts één extra regel code nodig. Vervolgens hebben we ons eigen script gemaakt om de output van de resultaten beter weer te geven.

Door onze code op te slaan als een script, kunnen we de query opnieuw uitvoeren en hoeven we niet alle syntaxis opnieuw te typen. U kunt uw eigen versie van dit script maken en de output precies aanpassen zoals u wilt of mijn code downloaden en bewerken.

 

 

 

 

 

Tags