El Blog de Gualtrysoft

Windows 2000/2003/2008, Active Directory, VBScript, Hyper-V, PowerShell y todo aquello interesante a la hora de usar, configurar y administrar Windows Server. También tenemos longanizas…

Powershell – Listar Las Máquinas Virtuales De Nuestros Servidores De Hyper-V

Posted by urpiano en Domingo 21 \21\UTC junio \21\UTC 2009

Si tenemos instalado Powershell en un equipo con el espacio de nombres WMI de Hyper-V (este proveedor lo tienen los equipos con Hyper-V y los Windows 7 a los que instalemos la consola de administración de Hyper-V), podemos listar las máquinas virtuales que tenemos en ellos con un sencillo comando de Powershell. En el ejemplo, suponemos que los servidores de Hyper-V son HV1, HV2 y HV3:

Get-WmiObject -Namespace root\virtualization `
-ComputerName HV1,HV2,HV3 `
-Query "SELECT * FROM Msvm_ComputerSystem" `
| Format-Table ElementName,PrimaryOwnerName,__Server -AutoSize

La salida que da este comando es algo así:

ElementName  PrimaryOwnerName     __SERVER
-----------  ----------------     --------
TIASRVSMCFW  TIADOM\SupIntVicente HV1
TIASRV1217   TIADOM\SupIntVicente HV1
TIASRV0603   TIADOM\SupIntVicente HV1
TIASRV0104   TIADOM\SupIntVicente HV1
TIASRVSMCLOG TIADOM\DocBacterio   HV1
TIASRV0604   TIADOM\DocBacterio   HV1
TIADMZ1201   TIADOM\AgFilemonPi   HV2
TIASRV1505   TIADOM\AgFilemonPi   HV2
TIASRV1503   TIADOM\AgFilemonPi   HV2
TIASSO0701   TIADOM\AgFilemonPi   HV2
TIASRV1502   TIADOM\DocBacterio   HV2
TIASRV1508   TIADOM\AgFilemonPi   HV2
TIADMZ1202   TIADOM\AgFilemonPi   HV2
TIAALLOT     TIADOM\DocBacterio   HV2
TIASRV1501   TIADOM\AgFilemonPi   HV2
TIASRV1208   TIADOM\DocBacterio   HV3
TIASRV0602   TIADOM\DocBacterio   HV3
TIASRV0801   TIADOM\DocBacterio   HV3
TIASRV1507   TIADOM\DocBacterio   HV3
TIASRV1201   TIADOM\DocBacterio   HV3
TIASRV0501   TIADOM\DocBacterio   HV3
TIASSO0101   TIADOM\DocBacterio   HV3
TIASRV2504   TIADOM\DocBacterio   HV3
TIASRV0500   TIADOM\DocBacterio   HV3
TIASRV0502   TIADOM\DocBacterio   HV3

En esta línea de comandos incluímos los nombres de los servidores de virtualización hardcoded. Más interesante sería poder recibirlos desde un fichero de texto, en el que tengamos un nombre de Host por línea; una cosa así:

HV1
HV2
HV3

Esto lo podemos hacer de esta manera (vamos a suponer que el fichero es \\SCVMM1\Listados\ServidoresHV.txt):

Cat \\SCVMM1\Listados\ServidoresHV.txt | `
ForEach-Object -Process { `
          Get-WMIObject -Namespace root\virtualization `
          -ComputerName $_ `
          -Query "SELECT * FROM Msvm_ComputerSystem"} | `
Format-Table ElementName,PrimaryOwnerName,__Server -AutoSize

¿No está mal verdad? Pero aún hay algo que no me gusta, y es el tener que escribir ese churro cada vez que tengamos que realizar el listado. Una opción sería crear una función que recibiera como parámetro el fichero donde está la lista, de manera que sólo invoquemos la función pasando el fichero:

 Function Listar-VM ($Fichero) { `
Cat $Fichero | `
ForEach-Object -Process { `
          Get-WMIObject -Namespace root\virtualization `
          -ComputerName $_ `
          -Query "SELECT * FROM Msvm_ComputerSystem"} | `
Format-Table ElementName,PrimaryOwnerName,__Server -AutoSize }

Una vez definida la función, para obtener la lista de máquinas virtuales de los servidores de Hyper-V listados en el fichero \\SCVMM1\Listados\ServidoresHV.txt basta con ejecutar:

Listar-VM \\SCVMM1\Listados\ServidoresHV.txt

¿Chulo, verdad? No obstante, esto nos obliga a crear la función cada vez que abramos Powershell. Para evitar esto, podemos crear (si no existe ya) en %UserProfile%\Mis Documentos\WindowsPowershell un fichero de nombre Profile.ps1 en el que ponemos el código de definición de la función. De esa manera, cada vez que abramos una consola de Powershell, la función será cargada, de manera que estará disponible. Si hacemos ésto, lo más probable es que al abrir la consola nos aparezca el mensaje:

File C:\Users\usuario\Documents\WindowsPowerShell\profile.ps1 cannot
be loaded because the execution of scripts is disabled on this system. Please see
"get-help about_signing" for more details. At line:1 char:2+ . <<<< 
'C:\Users\usuario\Documents\WindowsPowerShell\profile.ps1'

Esto es motivado porque de manera predeterminada Powershell no permite la ejecución de scripts. Para evitar esto, podemos configurar Powershell de manera que ejecute los scripts locales y pida que estén firmados los remotos. Esto se hace abriendo una consola de Powershell como administrador local de la máquina y ejecutando:

Set-ExecutionPolicy RemoteSigned

Una vez hecho ésto, cada vez que abramos una consola de Powershell la función estará disponible para nuestro usuario. Si queremos que esté disponible para todos los usuarios, el fichero Profile.ps1 debe estar ubicado en %windir%\system32\WindowsPowerShell\V1.0\; si ya existiese, habría que añadir el código al existente.

Por último, podemos querer que la consulta sobre los equipos sea realizada por otro usuario distinto del que lanza el script, por ejemplo por no ser este administrador en las máquinas de destino o por pertenecer a otro dominio estas máquinas. Para ello, con la modificación que pongo a continuación, al ejecutar el script, se abrirá una ventana de logon en la que podremos poner el usuario y la contraseña:

Function Listar-VM ($Fichero) { `
$u = Get-Credential;`
Cat $Fichero | `
ForEach-Object -Process { `
          Get-WMIObject -Namespace root\virtualization `
          -ComputerName $_ `
          -Query "SELECT * FROM Msvm_ComputerSystem" `
          -Credential $u } | `
Format-Table ElementName,PrimaryOwnerName,__Server -AutoSize }

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: