Сбор характеристик серверов Windows через PowerShell

22.11.2011

Недавно понадобилось собрать информацию о характеристиках серверов в удаленных сайтах, а так как серверов несколько десятков, то потребовалась некоторая автоматизация процесса сбора данных. Для сбора данных с группы серверов я использовал скрипт PowerShell, который представлен ниже.

# Функция сбора параметров с сервера
Function GetComputerInfo ($ComputerName)
{
   $ComputerProperties = New-Object System.Object
   $ComputerProperties | add-member -membertype noteproperty -name Name -Value $ComputerName
   
   $P = Get-WmiObject -class "Win32_ComputerSystem" -computername $ComputerName | `
     Select Model, @{Label="TotalPhysicalMemory";Expression={[Math]::Round($_.TotalPhysicalMemory `
     / 1024 / 1024 / 1024)}}
   $ComputerProperties | Add-Member -MemberType NoteProperty -Name Model -Value $Null
   $ComputerProperties.Model = $P.Model
   $ComputerProperties | Add-Member -MemberType NoteProperty -Name RAMSize -Value $Null
   $ComputerProperties.RAMSize = $P.TotalPhysicalMemory
   
   $P = Get-WmiObject -class "Win32_SystemEnclosure" -computername $ComputerName | select SerialNumber
   $ComputerProperties | Add-Member -MemberType NoteProperty -Name SerialNumber -Value $Null
   $ComputerProperties.SerialNumber = $P.SerialNumber    
   
   $P = Test-Connection -ComputerName $ComputerName -Count 1 | select IPV4Address
   $ComputerProperties | Add-Member -MemberType NoteProperty -Name IPV4Address -Value $Null
   $ComputerProperties.IPV4Address = $P.IPV4Address  

   $P = Get-WmiObject -class "Win32_Processor" -computername $ComputerName | `
     Select Name, CurrentClockSpeed
   $ComputerProperties | Add-Member -MemberType NoteProperty -Name CPUName -Value $Null
   $ComputerProperties.CPUName = $P[0].Name
   $ComputerProperties | Add-Member -MemberType NoteProperty -Name CPUCores -Value $Null
   $ComputerProperties.CPUCores = ($P | Measure-Object).Count
   $ComputerProperties | Add-Member -MemberType NoteProperty -Name CPUClockSpeed -Value $Null
   $ComputerProperties.CPUClockSpeed = $P[0].CurrentClockSpeed

   $P = Get-WmiObject -class "Win32_DiskDrive" -computername $ComputerName | `
     Select @{Label="HDDModel";Expression={$_.Model}}, `
     @{Label="HDDInterfaceType";Expression={$_.InterfaceType}}, `
     @{Label="HDDSize";Expression={[Math]::Round($_.Size / 1024 / 1024 / 1024)}}, `
     @{Label="HDDPartitions";Expression={$_.Partitions}}
   $ComputerProperties | Add-Member -MemberType NoteProperty -Name HDD -Value $Null
   $ComputerProperties.HDD = $P

   $ComputerProperties
}

# Тело скрипта
$ErrorActionPreference = "Continue"
$Servers = Import-Csv Servers.csv
$Servers | Sort name | Where-Object {Test-Connection -Count 2 -ComputerName $_.Name `
 -ErrorAction SilentlyContinue} | ForEach-Object { GetComputerInfo $_.name }

Этот скрипт использует в качестве входных данных файл CSV, в котором перечислены имена серверов, с которых требуется собрать данные.

Листинг файла Servers.csv:

Name
Server1
Server2
Server3
Server4

На выходе скрипта получается список табличек по каждому серверу, в которых указаны следующие параметры: имя сервера, модель сервера, размер ОЗУ в ГБ, серийный номер сервера, IP адрес сервера, тип процессора, количество ядер процессора, такторая частота процессора, информация по жестким дискам.

Например:

Name          : Server1
Model         : ProLiant ML370 G4
RAMSize       : 2
SerialNumber  : GB850964TF      
IPV4Address   : 172.31.17.1
CPUName       : Intel(R) Xeon(TM) CPU 3.60GHz
CPUCores      : 2
CPUClockSpeed : 3600
HDD           : {@{HDDModel=HP LOGICAL VOLUME SCSI Disk Device; HDDInterfaceType=SCSI;
                HDDSize=34; HDDPartitions=4}, @{HDDModel=HP LOGICAL VOLUME SCSI Disk
                Device; HDDInterfaceType=SCSI; HDDSize=203; HDDPartitions=1}}