Get-SystemInfo: Listado de la configuración del sistema de todas las computadoras (systeminfo)
En una de mis publicaciones de blog anteriores PowerShell: Documentar su entorno ejecutando systeminfo en todas las computadoras del dominio, describí cómo enumerar información importante del sistema de todas las computadoras del dominio ejecutando systeminfo. Ahora quiero pegarlo en una función. El nombre de esta función será Get-SystemInfo. Qué sorpresa. Soy realmente una persona creativa. ? Y aquí está.
La meta
El enfoque consiste en recopilar toda la información relevante del sistema operativo de todas las computadoras del dominio y/o servidores de dominio o de una o más computadoras. Debe tener un aspecto como este:
Como mencioné, ya preparé algunas cosas en una publicación de blog anterior. Ahora quiero dar un gran paso más.
Obtener información del sistema
Los parametros
Get-SystemInfo le permite definir un alcance o nombre de computadora. Al presionar CTRL+Espacio se enumeran todas las opciones. Dos de ellos son particularmente interesantes.
Una mirada más cercana a los parámetros...
Ok, debo admitir que no soy un desarrollador profesional que se preocupe mucho por los errores y las condiciones de error. Pero trato de brindar algo de ayuda. Preste atención a la descripción del parámetro de alcance.
O simplemente escriba Get-SytemInfo -Scope y luego presione CTRL+Espacio.
Lo que me lleva a la siguiente parte: Jugar con Get-SystemInfo. Recuerde los valores de los parámetros. Ahora entran en juego… y acción…
Get-SystemInfo en acción: definición de un alcance
Consultar todos los servidores
Consultar todos los controladores de dominio
Consultar todas las computadoras cliente (WinRM debe estar habilitado, está deshabilitado de manera predeterminada en todos los sistemas operativos del cliente)
Para habilitar WinRM con políticas de grupo, consulte:
Políticas de grupo: habilitación de WinRM para sistemas operativos de cliente Windows (Windows 10, Windows 8, Windows 7)
Consultar todas las computadoras
¿Te gusta? Sigamos que no es el final...
Get-SystemInfo en acción: definición de un nombre de computadora
Ejecutándose en una sola computadora
Ejecutándose en varias computadoras (sepárelas por coma)
Lo que me lleva a la última parte de esta publicación de blog. En realidad, lo más importante. La función en sí.
La función
Asegúrese de ejecutar el código en un controlador de dominio o en una computadora con RSAT instalado.
function Get-SystemInfo {
param
(
[parameter(HelpMessage='Enter the following values: LocalHost, ServerOnly, DCOnly, ClientOnly or AllComputer')]
[ValidateSet('LocalHost', 'ServerOnly', 'DCOnly', 'ClientOnly', 'AllComputer')]
$Scope, $ComputerName
)
$header='Host Name','OS','Version','Manufacturer','Configuration','Build Type','Registered Owner','Registered Organization','Product ID','Install Date','Boot Time','System Manufacturer','Model','Type','Processor','Bios','Windows Directory','System Directory','Boot Device','Language','Keyboard','Time Zone','Total Physical Memory','Available Physical Memory','Virtual Memory','Virtual Memory Available','Virtual Memory in Use','Page File','Domain','Logon Server','Hotfix','Network Card','Hyper-V'
If ($Scope -eq 'ServerOnly') {
Invoke-Command -ComputerName (Get-ADComputer -Filter {operatingsystem -like '*server*'}).Name {systeminfo /FO CSV | Select-Object -Skip 1} -ErrorAction SilentlyContinue | ConvertFrom-Csv -Header $header | Out-GridView
}
elseif ($Scope -eq 'DCOnly') {
Invoke-Command -ComputerName (Get-ADDomainController -Filter *).Name {systeminfo /FO CSV | Select-Object -Skip 1} -ErrorAction SilentlyContinue | ConvertFrom-Csv -Header $header | Out-GridView
}
elseif ($Scope -eq 'LocalHost')
{systeminfo /FO CSV | Select-Object -Skip 1 | ConvertFrom-Csv -Header $header | Out-GridView
}
elseif ($Scope -eq 'ClientOnly') {
Invoke-Command -ComputerName (Get-ADComputer -Filter {operatingsystem -notlike '*server*'}).Name {systeminfo /FO CSV | Select-Object -Skip 1} -ErrorAction SilentlyContinue | ConvertFrom-Csv -Header $header | Out-GridView
}
elseif ($Scope -eq 'AllComputer') {
Invoke-Command -ComputerName (Get-ADComputer -Filter *).Name {systeminfo /FO CSV | Select-Object -Skip 1} -ErrorAction SilentlyContinue | ConvertFrom-Csv -Header $header | Out-GridView
}
elseif ($ComputerName) {
Invoke-Command -ComputerName $ComputerName {systeminfo /FO CSV | Select-Object -Skip 1} -ErrorAction SilentlyContinue | ConvertFrom-Csv -Header $header | Out-GridView
}
}
El guión ha ido creciendo con el tiempo. Uno de mis seguidores me señaló que sería mejor trabajar con switch en lugar de muchos If y elseif. Gracias por el consejo. Aquí está la función con interruptor. Así podemos ahorrar algunas líneas.
function Get-SystemInfo {
param
(
[parameter(HelpMessage='Enter the following values: LocalHost, ServerOnly, DCOnly, ClientOnly or AllComputer')]
[ValidateSet('LocalHost', 'ServerOnly', 'DCOnly', 'ClientOnly', 'AllComputer')]
$Scope, $ComputerName
)
$header='Host Name','OS','Version','Manufacturer','Configuration','Build Type','Registered Owner','Registered Organization','Product ID','Install Date','Boot Time','System Manufacturer','Model','Type','Processor','Bios','Windows Directory','System Directory','Boot Device','Language','Keyboard','Time Zone','Total Physical Memory','Available Physical Memory','Virtual Memory','Virtual Memory Available','Virtual Memory in Use','Page File','Domain','Logon Server','Hotfix','Network Card','Hyper-V'
switch ($Scope)
{
'ServerOnly' {Invoke-Command -ComputerName (Get-ADComputer -Filter {operatingsystem -like '*server*'}).Name {systeminfo /FO CSV | Select-Object -Skip 1} -ErrorAction SilentlyContinue | ConvertFrom-Csv -Header $header | Out-GridView}
'DCOnly' {Invoke-Command -ComputerName (Get-ADDomainController -Filter *).Name {systeminfo /FO CSV | Select-Object -Skip 1} -ErrorAction SilentlyContinue | ConvertFrom-Csv -Header $header | Out-GridView}
'LocalHost' {systeminfo /FO CSV | Select-Object -Skip 1 | ConvertFrom-Csv -Header $header | Out-GridView}
'ClientOnly' {Invoke-Command -ComputerName (Get-ADComputer -Filter {operatingsystem -notlike '*server*'}).Name {systeminfo /FO CSV | Select-Object -Skip 1} -ErrorAction SilentlyContinue | ConvertFrom-Csv -Header $header | Out-GridView}
'AllComputer' {Invoke-Command -ComputerName (Get-ADComputer -Filter *).Name {systeminfo /FO CSV | Select-Object -Skip 1} -ErrorAction SilentlyContinue | ConvertFrom-Csv -Header $header | Out-GridView}
}
If ($ComputerName) {
Invoke-Command -ComputerName $ComputerName {systeminfo /FO CSV | Select-Object -Skip 1} -ErrorAction SilentlyContinue | ConvertFrom-Csv -Header $header | Out-GridView
}
}
Hazlo permanente
Si le gusta mi enfoque, abra PowerShell ISE. Copie la función a su sesión ISE. Cree una carpeta en C:\Program Files\Windows PowerShell\Modules y guarde el código como archivo psm1. Asegúrese de que el nombre de su archivo y el nombre de la carpeta coincidan.
Cierre PowerShell. Abra PowerShell nuevamente. El comando ahora está disponible para todos los usuarios. ¡Diviértete con Get-SystemInfo!











