Cómo listar las funciones instaladas de todos tus Windows Server

Con un sencillo script en PowerShell seremos capaces de listar las características (Features) que tenemos instaladas en los servidores Windows de nuestra infraestructura.

Primero necesitamos preparar una lista de todos nuestros servidores en un archivo txt, para ello simplemente vamos a anotar el HOSTNAME de cada uno de ellos, en un archivo que podemos llama hostname.txt, o servers.txt. Es importante que recordemos el nombre y la ruta del archivo.

El siguiente script lo podéis descargar desde el Centro de scripts de Microsoft TechNet Gallery.

[ps]cls
if (Get-Module -ListAvailable -Name ServerManager) {
    $domain= 'DOMAIN\username'
    $pass=ConvertTo-SecureString -String 'YourPassword' -AsPlainText -Force
    $creds=New-Object System.Management.Automation.pscredential -ArgumentList $domain, $pass

    (Get-Content C:\path\servers.txt| `
    Foreach{Invoke-Command -ComputerName $_ -Verbose -ScriptBlock{get-windowsfeature | `
    Where-Object{$_.installed -eq $true -and $_.featuretype -eq 'Role'} |   
    select name, installed -ExcludeProperty subfeatures} -Credential $creds}) | `
    Format-Table -Property Name, Installed, @{name='Server Name';expression={$_.pscomputername}} -AutoSize
} else {
    Write-Host "Error! El módulo ServerManager no está instalado. Por favor, ejecuta el siguiente cmdlet para importarlo:`n";Write-Host -f Yellow "import-module servermanager`n"
}}[/ps]

 

Ahora sólo tenemos que editar la ruta en nuestro archivo .ps1, y ejecutamos el script para obtener la lista con las características instaladas en los servidores de nuestra infraestructura.

Hay que tener en cuenta que el script sólo nos listará las características instaladas, pero si también queremos listar los roles, debemos eliminar el  -and $_.featuretype -eq 'Role', quedando así.

[ps]cls
if (Get-Module -ListAvailable -Name ServerManager) {
    $domain= 'DOMAIN\username'
    $pass=ConvertTo-SecureString -String 'YourPassword' -AsPlainText -Force
    $creds=New-Object System.Management.Automation.pscredential -ArgumentList $domain, $pass

    (Get-Content C:\path\servers.txt| `
    Foreach{Invoke-Command -ComputerName $_ -Verbose -ScriptBlock{get-windowsfeature | `
    Where-Object{$_.installed -eq $true} |   
    select name, installed -ExcludeProperty subfeatures} -Credential $creds}) | `
    Format-Table -Property Name, Installed, @{name='Server Name';expression={$_.pscomputername}} -AutoSize
} else {
    Write-Host "Error! El módulo ServerManager no está instalado. Por favor, ejecuta el siguiente cmdlet para importarlo:`n";Write-Host -f Yellow "import-module servermanager`n"
}[/ps]

 

Si deseas exportar los resultados a un archivo CSV, simplemente debemos cambiar el último cmdlet por Export-CSV.

 

Nota: Si al ejecutar el script obtenemos el error El término 'get-windowsfeature' no se reconoce como nombre de un cmdlet, función, archivo de script o programa ejecutable. es debido a que no tenemos instalado el módulo ServerManager. Para solucionarlo, simplemente debemos ejecutar:

[ps]import-module servermanager[/ps]

Sobre el autor:

Daniel Alonso, Microsoft MVP de Windows and Devices for IT

Cloud Solutions Principal Advisor @ENCAMINA