Get-WmiObject: Query WMI per le informazioni sul computer

Ogni volta che abbiamo bisogno di scoprire qualsiasi informazione su un computer Windows e i suoi componenti, possiamo farlo con Get-WmiObject.

Non solo leggendo, ma sfruttando i metodi WMI, Get-WmiObject può anche eseguire azioni sui sistemi locali o remoti. Questo cmdlet è uno dei pochi in PowerShell che può lavorare con il repository WMI per facilitare la gestione di molti sistemi.

Scoprire le classi con Get-WmiObject

Nel suo modo più semplice, questo cmdlet può interrogare informazioni da un computer locale. Tutto ciò che devi sapere è lo spazio dei nomi (probabilmente root\cimv2 che è il valore predefinito) e la classe WMI in cui si trova l’informazione che stai cercando.

Ci sono migliaia di classi e probabilmente non sai ancora quale classe vorresti utilizzare. Utilizzando Get-WmiObject, possiamo interrogare tutte le classi disponibili in uno spazio dei nomi. Utilizzando Get-WmiObject -List, sarai in grado di visualizzare tutte le classi nello spazio dei nomi root\cimv2. Se hai bisogno di controllare le classi in un altro spazio dei nomi, puoi sempre utilizzare il parametro Namespace insieme ad esso.

PS> Get-WmiObject -List

NameSpace: ROOT\cimv2

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

Ottenere le proprietà WMI

Dopo aver ottenuto la classe, è quindi il momento di indagare e vedere quali proprietà sono presenti in quella classe. Forse vorrei vedere quale sistema operativo sta utilizzando un computer. Potrei essere in fase di creazione di un rapporto e vorrei vedere cosa sta eseguendo una macchina remota. Get-WmiObject ha un parametro ComputerName in cui è possibile specificare uno o più computer remoti anziché localmente.

Il mio computer remoto è un controller di dominio chiamato DC. Darò un’occhiata alla classe Win32_OperatingSystem per vedere quali proprietà ci sono dentro.

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

Questa è un’informazione utile, ma non vedo il nome del sistema operativo. Similmente a molti altri output di PowerShell, non si vedono tutte le proprietà. Per questo, dovremo usare Select-Object per restituire tutte le proprietà.

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

Trovare le proprietà WMI

E se non stai cercando una proprietà specifica ma piuttosto una proprietà che corrisponde a un valore specifico? Ad esempio, possiamo interrogare tutte le istanze nella classe CIM_DataFile, ma ciò restituirebbe ogni file nel sistema! Invece, possiamo filtrare le istanze per valore utilizzando il parametro Filter o il parametro Query. Vediamoli entrambi.

Utilizzando CIM_DataFile come esempio, forse voglio trovare solo istanze che rappresentano file compressi. Poiché la proprietà Compressed è una proprietà su ogni istanza ed è un valore booleano, posso usare il parametro Filter per inviare il filtro direttamente al provider WMI restituendo solo istanze che hanno una proprietà Compressed impostata su True.

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

Se conosci WQL, puoi anche selezionare la classe e specificare il “filtro” da solo creando la tua query WQL personalizzata.

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

Invocazione di metodi WMI

Get-WmiObject non solo può leggere informazioni da WMI, ma può anche facilitare l’invocazione dei metodi WMI. Un comune metodo WMI che viene invocato è il metodo Create nella classe Win32_Process. Ci sono diverse modalità per invocare i metodi WMI, come l’uso di Invoke-WmiMethod, ma questo può essere fatto anche con Get-WmiObject. Basta catturare un’istanza WMI e quindi chiamare il metodo su quell’oggetto.

Ecco un esempio di avvio remoto di notepad.exe su un computer remoto. Come bonus, stiamo utilizzando anche una credenziale alternativa per farlo!

$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 e PowerShell Remoting

Un’ultima cosa da sottolineare è che il successore di questo cmdlet è: Get-CimInstance. Anche se Get-CimInstance fornisce alcuni vantaggi nell’uso di PowerShell Remoting come protocollo predefinito di connettività remota, Get-WmiObject è talvolta più facile da usare.

Get-WmiObject utilizza DCOM per comunicare con computer remoti ed è di solito disponibile. In caso contrario, sarà necessario abilitare PowerShell Remoting su endpoint remoti quando si desidera utilizzare Get-CimInstance tramite WSMAN.

Per una panoramica completa, consulta la documentazione di Microsoft.

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