Get-WmiObject: Consulta WMI para obtener información de la computadora

Cada vez que necesitamos descubrir cualquier información sobre una computadora con Windows y sus componentes, podemos hacerlo con Get-WmiObject.

No solo leyendo, mediante los métodos WMI, Get-WmiObject también puede ejecutar acciones en sistemas locales o remotos. Este cmdlet es uno de los pocos en PowerShell que puede trabajar con el repositorio WMI para facilitar en gran medida la administración de muchos sistemas.

Descubriendo Clases con Get-WmiObject

En su forma más básica, este cmdlet puede consultar información de una computadora local. Todo lo que necesitarás saber es el espacio de nombres (probablemente root\cimv2, que es el predeterminado) y la clase WMI donde se encuentra la información que estás buscando.

Existen miles de clases y probablemente aún no sepas cuál te gustaría usar. Utilizando Get-WmiObject, podemos consultar todas las clases disponibles en un espacio de nombres. Usando Get-WmiObject -List, podrás ver todas las clases en el espacio de nombres root\cimv2. Si necesitas verificar clases en otro espacio de nombres, siempre puedes usar el parámetro Namespace junto con eso también.

PS> Get-WmiObject -List

NameSpace: ROOT\cimv2

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

Obteniendo Propiedades de WMI

Una vez que tienes la clase, es el momento de investigar y ver qué propiedades hay en esa clase. Tal vez quiera ver qué sistema operativo tiene una computadora. Puede ser que esté creando un informe y quiera ver qué está ejecutando una máquina remota. Get-WmiObject tiene un parámetro ComputerName donde puedes especificar una o más computadoras remotas en lugar de localmente.

Mi ordenador remoto es un controlador de dominio llamado DC. Voy a mirar la clase Win32_OperatingSystem para ver qué propiedades hay allí.

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

Esta es información útil, pero no veo el nombre del sistema operativo. Similar a muchas otras salidas de PowerShell, no se ven todas las propiedades. Para eso, tendremos que usar Select-Object para devolver todas las propiedades.

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

Encontrar Propiedades WMI

¿Qué pasa si no estás buscando una propiedad específica sino una propiedad que coincida con un valor específico? Por ejemplo, podemos consultar todas las instancias en la clase CIM_DataFile, ¡pero eso devolvería cada archivo en el sistema! En cambio, podemos filtrar las instancias por valor utilizando el parámetro Filter o el parámetro Query. Vamos a revisar ambos.

Usando la clase CIM_DataFile como ejemplo, tal vez solo quiero encontrar instancias que representen archivos comprimidos. Dado que la propiedad Compressed es una propiedad en cada instancia y es un valor booleano, puedo usar el parámetro Filter para enviar el filtro directamente al proveedor WMI, devolviendo solo las instancias que tienen una propiedad Compressed de True.

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

Si conoces WQL, también puedes seleccionar la clase y especificar el “filtro” por ti mismo creando tu propia consulta WQL.

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

Invocando Métodos WMI

Get-WmiObject no solo puede leer información de WMI, sino que también puede facilitar la invocación de métodos WMI. Un método WMI común que se invoca es el método Create en la clase Win32_Process. Hay varias formas de invocar métodos WMI, como usar Invoke-WmiMethod, pero también se puede hacer con Get-WmiObject. Solo necesitamos capturar una instancia de WMI y luego llamar al método en ese objeto.

Aquí tienes un ejemplo de cómo iniciar notepad.exe de forma remota en una computadora remota. ¡Como bono, también estamos utilizando credenciales alternativas para hacerlo!

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

Otra cosa importante es que el sucesor de este cmdlet es: Get-CimInstance. Aunque Get-CimInstance proporciona algunas ventajas al utilizar PowerShell Remoting como su protocolo de conectividad remota predeterminado, Get-WmiObject a veces es más fácil de usar.

Get-WmiObject utiliza DCOM para comunicarse con computadoras remotas y generalmente también está disponible. De lo contrario, deberás habilitar PowerShell Remoting en los puntos finales remotos si deseas usar Get-CimInstance a través de WSMAN.

Para obtener una descripción completa, consulta la documentación de Microsoft.

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