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.
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í.
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.
I can now see a property called Caption
that lets me know the version of Windows.
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
.
Si conoces WQL, también puedes seleccionar la clase y especificar el “filtro” por ti mismo creando tu propia consulta WQL.
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!
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.