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: Cmdlet para inventariar los discos de las máquinas virtuales gestionadas por un servidor de SCVMM

Posted by urpiano en Miércoles 6 \06\UTC octubre \06\UTC 2010

Esta función de PowerShell lista los discos duros de las máquinas virtuales albergadas en los hosts de virtualización que administra un servidor de System Center Virtual Machine Manager. Puedes listar los discos de todas las máquinas o sólo los de aquellas que están albergadas en nodos de clúters. El listado se puede ver por pantalla o exportarlo a un fichero de valores separados por tabulador (ideal para ser abierto por Excel)

El Cmdlet incluye ayuda, pego a continuación la ayuda con modificador -Detailed (esta ayuda se basa en la prestación de ayuda basada en comentarios de PowerShell 2.0 ¿Qué todavía tienes la versión 1.0 y no la 2.0? ¿A qué esperas para instalarla si es mucho mejor?):

NOMBRE
    Get-VMDiskInventory
    
SINOPSIS
    Lista los discos vduros de las máquinas virtuales gestionadas por un
    servidor de SCVMM.
    
SINTAXIS
    Get-VMDiskInventory [[-VMM] ] [-Cluster] [[-Fichero] ] []
    
DESCRIPCIÓN
    Este Cmdlet permite obtener un listado de los discos duros de las máquinas
    virtuales que administra SCVMM. El Cmdlet lista los discos duros de todas
    las máquinas virtuales gestionadas por SCVMM o sólo aquellas que están
    alojadas en clúster. Los resultados se pueden mostrar por pantalla o enviar
    a un fichero de valores separados por tabulador (ideal para ser abierto con
    Excel).

PARÁMETROS
    -VMM 
        Nombre o IP del servidor SCVMM al que se consultará.
        
    -Cluster []
        Si se pasa este modificador, sólo se listarán los discos duros de las
        máquinas virtules que estén albergadas en cluster.
        
    -Fichero 
        Nombre y ruta del fichero de valores separados por tabulador que se
        generará con los resultados.
        
    
        Este cmdlet admite los parámetros comunes Verbose, Debug,
        ErrorAction, ErrorVariable, WarningAction, WarningVariable,
        OutBuffer y OutVariable. Para obtener más información, escriba:
        "get-help about_commonparameters".
    
    -------------------------- EJEMPLO 1 --------------------------
    
    C:\PS>Get-VMDiskInventory -VMM SCVMMTIA01
    
    Muestra por pantalla los discos duros de todas las máquinas virtuales
    administradas por el servidor de SCVMM de nombre SCVMMTIA01.
    
    -------------------------- EJEMPLO 2 --------------------------
    
    C:\PS>Get-VMDiskInventory -VMM SCVMMTIA01 -Cluster
    
    Muestra por pantalla los discos duros de todas las máquinas virtuales,
    administradas por el servidor de SCVMM de nombre SCVMMTIA01, que estén
    albergadas en clúster.
    
    -------------------------- EJEMPLO 3 --------------------------
    
    C:\PS>Get-VMDiskInventory -VMM SCVMMTIA01 -Cluster -Fichero d:\VMsEnCluster.tab
    
    Guarda en un fichero de valores separados por tabuladores un
    listado con los discos duros de todas las máquinas virtuales, administradas
    por el servidor de SCVMM de nombre SCVMMTIA01, que estén albergadas en
    clúster.

Este es el códgo del Cmdlet:

Function Get-VMDiskInventory([string] $VMM,
                             [switch] $Cluster,
                             [string] $Fichero)
{
 
    # Comprobamos si están cargados los Cmdlets de Virtual Machine Manager.
    # En caso contrario los cargamos.
    
    # Lo primero es almacenar la acción configurada para los errores que no
    # interrumpen (de forma predeterminada es "Continue")
    $Accion = $ErrorActionPreference
    
    # Cambiamos la acción a Stop, para que sí interrumpan y puedan ser
    # capturados por Try/Catch
    $ErrorActionPreference = "Stop"
    
    # Miramos si está cargada la snap-in de SCVMM. Si no lo está dará error,
    # de ahí el que lo capturemos con Try/Catch
    Try
    {
        # Cargamos la devolución de Get-PsSnapin en una variable para evitar
        # que sea parte de la devolución del Cmdlet
        $Snapin = Get-PSSnapin Microsoft.SystemCenter.VirtualMachineManager
    }
    Catch
    {
        # Si estamos aquí, es que Get-PsSnapin produjo un error y por tanto
        # el snap-in de SCVMM no está cargado, por lo que debemos cargarlo.
        # Para cargar el snap-in de SCVMM usamos una estructura Try/Catch,
        # por si la consola de SCVMM no estuviera instalada en el equipo y
        # por tanto no existiera este snap-in.
        Try
        {
            Add-PSSnapin -name Microsoft.SystemCenter.VirtualMachineManager
        }
        Catch
        {
            # Como se ha producido error al intentar cargar el snap-in de
            # SCVMM, se lo advertimos al usuario, restituimos la acción ante
            # errores que no interrumpen y terminamos el Cmdlet
            Write-Host "Es necesario tener instalada la consola de" `
                       "administración de SCVMM en este equipo para" `
                       "poder ejecutar este Cmdlet."
                       
            # Restituimos la acción original ante errores que no interrumpen
            $ErrorActionPreference = $Accion
            
            # Finalizamos el Cmdlet
            Break
        }   
    }
    # Restituimos el valor de $ErrorActionPreference
    $ErrorActionPreference = $Accion
 
    # Conectamos a SCVMM
    $SVMM = Get-VMMServer $VMM
    
    # Obtenemos los host, o todos o sólo los que pertenecen a
    # un clúster. En primer lugar, si sólo queremos los que
    # pertenecen a un clúster:
    If($Cluster)
    {
        # Iniciamos la colección de hosts.
        $VMHosts = @()
        
        # Recorremos los clústers administrados por SCVMM
        ForEach($HostCluster In Get-VMHostCluster)
        {
            # Recorremos los nodos del clúster
            ForEach($Nodo In $HostCluster.Nodes)
            {
                # Almacenamos el nodo en la colección
                $VMHosts += $Nodo
            }
        }
    }
    # Si queremos obtener todos los hosts:
    Else
    {
        $VMHosts = Get-VMHost
    }
    
    # Iniciamos la devolución de la función
    $Devolucion = @()
    
    # Recorremos la colección de Hosts
    ForEach($VMHost In $VMHosts)
    {
        # Obtenemos la colección de máquinas virtuales del Host
        $VMs = Get-VM -VMHost $VMHost
        
        # Recorremos la colección de máquinas virtuales
        ForEach($VM In $VMs)
        {
            # Recorremos los discos duros
            ForEach($HD In $VM.VirtualHardDisks)
            {
                # Dado que el objeto de tipo VirtualHardDisk no se
                # deja agregar propiedades con Add-Member, creamos
                # un objeto de tipo PsObject, que será el que obtenga
                # la devolucion
                $PsHD = New-Object PsObject
                ForEach($Propiedad In ($HD|Get-Member -MemberType Property))
                {
                    # Agregamos la propiedad actual al objeto PsObject.
                    # Cabe destacar el uso de Invoke-Expression para poder
                    # cargar el valor de la propiedad, dado que no sabemos
                    # su nombre y hay que expandirlo desde la propiedad
                    # Name de la variable $Propiedad; por ello hay que
                    # quitarle el significado al dolar de $HD, pues así
                    # conseguimos que la expresión que llegue a
                    # Invoke-Expression sea $HD.<NombreDePropiedad>
                    # (Por ejemplo $HD.Name)
                    Add-Member -InputObject $PsHD `
                               -MemberType NoteProperty `
                               -Name "$($Propiedad.Name)" `
                               -Value (Invoke-Expression `
                                                    "`$HD.$($Propiedad.Name)")
                }
                
                # Agregamos el nombre de la máquina virtual a la que está
                # conectado el disco virtual. Esta propiedad no es suministrada
                # por VirtualHardDisk, de ahí que la añadamos y que tuvieramos
                # la necesidad de crear el objeto PsObject para poder agregarla
                Add-Member -InputObject $PsHD `
                           -MemberType NoteProperty `
                           -Name VMName `
                           -Value "$($VM.Name)"
                # Agregamos el nombre del clúster en el que está integrado
                # el host (quedará en blanco si no está integrado a ningún
                # clúster)
                Add-Member -InputObject $PsHD `
                           -MemberType NoteProperty `
                           -Name VMCluster `
                           -Value "$($VMHost.HostCluster)"
                # Agregamos el disco a la devolución del Cmdlet
                $Devolucion += $PsHD
            }
        }
    }
 
    # Si debemos guardar en fichero los resultados,
    # así lo hacemos
    If($Fichero.Length -gt 0)
    {
        $Devolucion | Export-CSV -Delimiter "`t" $Fichero -NoTypeInformation
    }
    # Si no hay que guardar los resultados en fichero, los
    # mostramos por pantalla
    Else
    {
        $Devolucion
    }
 
#.SYNOPSIS
#   Lista los discos vduros de las máquinas virtuales gestionadas por un
#   servidor de SCVMM.
#.DESCRIPTION
#   Este Cmdlet permite obtener un listado de los discos duros de las máquinas
#   virtuales que administra SCVMM. El Cmdlet lista los discos duros de todas
#   las máquinas virtuales gestionadas por SCVMM o sólo aquellas que están
#   alojadas en clúster. Los resultados se pueden mostrar por pantalla o enviar
#   a un fichero de valores separados por tabulador (ideal para ser abierto con
#   Excel).
#.PARAMETER VMM
#   Nombre o IP del servidor SCVMM al que se consultará.
#.PARAMETER Fichero
#   Nombre y ruta del fichero de valores separados por tabulador que se
#   generará con los resultados.
#.PARAMETER Cluster
#   Si se pasa este modificador, sólo se listarán los discos duros de las
#   máquinas virtules que estén albergadas en cluster.
#.NOTES
#   Desarrollado por Fernando Reyes López
#   Octubre de 2010
#.LINK
#   http://freyes.svetlian.com -> Artículos de Fernando reyes
#.LINK
#   https://urpiano.wordpress.com -> El Blog de GualtrySoft
#.EXAMPLE
#     Get-VMDiskInventory -VMM SCVMMTIA01
#   Muestra por pantalla los discos duros de todas las máquinas virtuales
#   administradas por el servidor de SCVMM de nombre SCVMMTIA01.
#.EXAMPLE
#     Get-VMDiskInventory -VMM SCVMMTIA01 -Cluster
#   Muestra por pantalla los discos duros de todas las máquinas virtuales,
#   administradas por el servidor de SCVMM de nombre SCVMMTIA01, que estén
#   albergadas en clúster.
#.EXAMPLE
#     Get-VMDiskInventory -VMM SCVMMTIA01 -Cluster -Fichero d:\VMsEnCluster.tab
#   Guarda en un fichero de valores separados por tabuladores un
#   listado con los discos duros de todas las máquinas virtuales, administradas
#   por el servidor de SCVMM de nombre SCVMMTIA01, que estén albergadas en
#   clúster.
}

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: