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.
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.
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à.
I can now see a property called Caption
that lets me know the version of Windows.
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
.
Se conosci WQL, puoi anche selezionare la classe e specificare il “filtro” da solo creando la tua query WQL personalizzata.
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!
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.