Get-WmiObject: Query WMI voor computergegevens

Telkens wanneer we informatie willen ontdekken over een Windows-computer en de componenten ervan, kunnen we dat doen met Get-WmiObject.

Niet alleen lezen, door gebruik te maken van WMI-methoden kan Get-WmiObject ook acties uitvoeren op lokale of externe systemen. Deze cmdlet is een van de vele in PowerShell die kunnen werken met het WMI-register om het beheer van veel systemen veel gemakkelijker te maken.

Ontdekken van klassen met Get-WmiObject

In de meest eenvoudige vorm kan deze cmdlet informatie opvragen vanaf een lokale computer. Het enige wat u hoeft te weten is de namespace (waarschijnlijk standaard root\cimv2) en de WMI-klasse waar de informatie die u zoekt zich bevindt.

Er zijn duizenden klassen en u weet waarschijnlijk nog niet welke klasse u wilt gebruiken. Met behulp van Get-WmiObject kunnen we alle beschikbare klassen in een namespace opvragen. Met Get-WmiObject -List kunt u alle klassen in de namespace root\cimv2 zien. Als u klassen in een andere namespace wilt controleren, kunt u ook de parameter Namespace gebruiken.

PS> Get-WmiObject -List

NameSpace: ROOT\cimv2

Name				Methods	Properties
CIM_Indication		{}		{CorrelatedIndications, IndicationFilterName, IndicationIde...
CIM_ClassIndication	{}    	{ClassDefinition, CorrelatedIndications, IndicationFilterNa........

WMI-eigenschappen verkrijgen

Zodra u de klasse hebt, is het tijd om te onderzoeken welke eigenschappen zich in die klasse bevinden. Misschien wil ik bijvoorbeeld zien welk besturingssysteem een computer gebruikt. Ik bouw misschien een rapport en wil zien wat een externe machine draait. Get-WmiObject heeft een parameter ComputerName waar u één of meer externe computers kunt opgeven in plaats van lokaal.

Mijn externe computer is een domeincontroller genaamd DC. Ik zal naar de klasse Win32_OperatingSystem kijken om te zien welke eigenschappen daar aanwezig zijn.

PS> Get-WmiObject -ComputerName DC -Class Win32_OperatingSystem

SystemDirectory : C:\Windows\system32
Organization    :
BuildNumber     : 9600
RegisteredUser  : Windows User
SerialNumber    : 00252-00108-14656-AA864
Version         : 6.3.9600

Dat is nuttige informatie, maar ik zie de naam van het besturingssysteem niet. Net als bij veel andere PowerShell-uitvoer zie je niet alle eigenschappen. Hiervoor moeten we Select-Object gebruiken om alle eigenschappen terug te geven.

Get-WmiObject -ComputerName DC -Class Win32_OperatingSystem | Select-Object -Property *

I can now see a property called Caption that lets me know the version of Windows.

PS> (Get-WmiObject -ComputerName DC -Class Win32_OperatingSystem | Select-Object -Property *).Caption Microsoft Windows Server 2012 R2 Standard

WMI-eigenschappen vinden

Wat als je niet op zoek bent naar een specifieke eigenschap, maar eerder naar een eigenschap die overeenkomt met een specifieke waarde. Bijvoorbeeld, we kunnen alle instanties in de klasse CIM_DataFile bevragen, maar dat zou elk bestand op het systeem retourneren! In plaats daarvan kunnen we instanties filteren op waarde met behulp van de Filter– of Query-parameter. Laten we beide doornemen.

Als voorbeeld gebruik ik de klasse CIM_DataFile, misschien wil ik alleen instanties vinden die gecomprimeerde bestanden vertegenwoordigen. Aangezien het Compressed-kenmerk een eigenschap is van elke instantie en het een booleaanse waarde is, kan ik de Filter-parameter gebruiken om de filter rechtstreeks naar de WMI-provider te sturen, waarbij alleen instanties worden geretourneerd met een Compressed-eigenschap van True.

Get-WmiObject -Class CIM_DataFile -Filter "Compressed = 'True'"

Als je bekend bent met WQL, kun je ook de klasse selecteren en de “filter” zelf specificeren door je eigen WQL-query te maken.

Get-WmiObject -Query "SELECT * FROM CIM_DataFile WHERE Compressed = 'True'"

WMI-methoden oproepen

Get-WmiObject kan niet alleen informatie uit WMI lezen, maar het kan ook het oproepen van WMI-methoden vergemakkelijken. Een veelvoorkomende WMI-methode die wordt opgeroepen, is de Create-methode op de klasse Win32_Process. Er zijn verschillende manieren om WMI-methoden op te roepen, zoals het gebruik van Invoke-WmiMethod, maar dit kan ook worden gedaan met Get-WmiObject. We moeten gewoon een WMI-instantie vastleggen en vervolgens de methode op dat object aanroepen.

Hier is een voorbeeld van het op afstand starten van notepad.exe op een externe computer. Als bonus gebruiken we ook alternatieve referenties om dit te doen!

$cred = get-credential
$process = Get-WmiObject -Query "SELECT * FROM Meta_Class WHERE __Class = 'Win32_Process'" -namespace "root\cimv2" -computername 'FOO' -credential $cred $process.Create( "notepad.exe" )

WMI, DCOM en PowerShell Remoting

Nog een laatste ding om op te merken is dat de opvolger van deze cmdlet: Get-CimInstance is. Hoewel Get-CimInstance enkele voordelen biedt ten opzichte van het gebruik van PowerShell Remoting als standaardprotocol voor externe verbindingen, is Get-WmiObject soms eenvoudiger te gebruiken.

Get-WmiObject gebruikt DCOM om te communiceren met externe computers en is meestal ook beschikbaar. Anders moet u PowerShell Remoting inschakelen op externe eindpunten als u Get-CimInstance via WSMAN wilt gebruiken.

Voor een volledige uitleg, bekijk de Microsoft-documentatie.

Source:
https://adamtheautomator.com/get-wmiobject/