Всем привет! Это мой первый пост и в нём я хотел бы поделиться скриптом на PowerShell, который написал для получения информации о Windows серверах, а именно: имени сервера, количества ядер в нём, объёме дисков и свободного пространства на них, ОЗУ и модели сервера. Бывает что данная информация нужна для тех или иных целей и данный скрипт поможет получить её быстро и легко.

Скрипт протестировал в обычной оболочке PowerShell на Windows Server 2016 и Windows Server 2019, выдаёт ровную таблицу, которую легко можно скопировать в Excel и разбить по столбцам для удобной фильтрации по нужным параметрам. Единственное нужно убрать из скрипта добавление фразы "Гб", так как иначе Excel не сможет фильтровать по числам. В приведённом здесь варианте убирать не стал, так красивее выглядит вывод в оболочке PowerShell :) Так же хотелось бы добавить что в PowerShell ISE имеются смещения, видимо чистая оболочка PowerShell и оболочка PowerShell ISE по разному считают после какого количества символов нужно вставлять горизонтальную табуляцию.

Так же данный скпипт можно запускать на любом компьютере в домене в оболочке PowerShell от имени администратора домена, при этом нужно чтобы на серверах была включена служба WinRM, иначе "достучаться" до данных серверов не получится и скпирт пропустит такие сервера, не выведя о них информацию.

Так выглядит вывод скрипта (имена серверов скрыл)
Так выглядит вывод скрипта (имена серверов скрыл)

Собственно сам скрипт:

$servers = @(Get-ADComputer -Filter 'operatingsystem -like "*Windows server*" -and enabled -eq "true"' -Properties Name | select -ExpandProperty Name)
"Name server:" + "`t" + "Count cores:" + "`t" + "Drive letter:" + "`t" + "HDD:" + "`t" + "`t" + "Free HDD:" + "`t" + "RAM:" + "`t" + "Model:"
foreach ($server in $servers) {
    $NumberOfCores = Invoke-Command -ScriptBlock { (Get-CimInstance -ClassName Win32_Processor).NumberOfCores } -computername $server -ErrorAction Ignore
    $DeviceID = Invoke-Command -ScriptBlock { (Get-CimInstance -ClassName Win32_LogicalDisk).DeviceID } -computername $server -ErrorAction Ignore
    $FreeSpace = Invoke-Command -ScriptBlock { (Get-CimInstance -ClassName Win32_LogicalDisk).FreeSpace } -computername $server -ErrorAction Ignore
    $Size = Invoke-Command -ScriptBlock { (Get-CimInstance -ClassName Win32_LogicalDisk).Size } -computername $server -ErrorAction Ignore
    $PhysicalMemory = Invoke-Command -ScriptBlock { (Get-CimInstance -ClassName Win32_PhysicalMemory).Capacity } -computername $server -ErrorAction Ignor
    $Model = Invoke-Command -ScriptBlock { (Get-CimInstance -ClassName Win32_computersystem).Model } -computername $server -ErrorAction Ignor     
    $Cores = 0   
    foreach ($Core in $NumberOfCores) {
            $Cores = $Cores + $Core
        }
    $Count = 0
    if ($DeviceID -ne $null) {
        if ($DeviceID[1] -ne ":") {
            $memorys = 0
            foreach ($memory in $PhysicalMemory) {
                $memorys = $memorys + $memory
            }
            while ($Count -ne $DeviceID.Length) {
                if ($FreeSpace[$Count] -ne $null) {
                    if ($server.Length -le 7) {
                        [string]$NSize = [math]::Round(($Size[$Count]/1024/1024/1024), 0)
                        [string]$NFreeSpace = [math]::Round(($FreeSpace[$Count]/1024/1024/1024), 0)
                        [string]$Nmemorys = [math]::Round(($memorys/1024/1024/1024), 0)
                        if ($NSize.Length -le 4) {
                            if ($NFreeSpace.Length -le 4) {
                                $server + "`t" + "`t" + $Cores + "`t" + "`t" + $DeviceID[$Count] + "`t" + "`t" + $NSize + " Гб" + "`t" + "`t" + $NFreeSpace + " Гб" + "`t" + "`t" + $Nmemorys + " Гб" + "`t" + $Model
                            } else {
                                $server + "`t" + "`t" + $Cores + "`t" + "`t" + $DeviceID[$Count] + "`t" + "`t" + $NSize + " Гб" + "`t" + "`t" + $NFreeSpace + " Гб" + "`t" + $Nmemorys + " Гб" + "`t" + $Model
                            }
                        } else {
                            if ($NFreeSpace.Length -le 4) {
                                $server + "`t" + "`t" + $Cores + "`t" + "`t" + $DeviceID[$Count] + "`t" + "`t" + $NSize + " Гб" + "`t" + $NFreeSpace + " Гб" + "`t" + "`t" + $Nmemorys + " Гб" + "`t" + $Model
                            } else {
                                $server + "`t" + "`t" + $Cores + "`t" + "`t" + $DeviceID[$Count] + "`t" + "`t" + $NSize + " Гб" + "`t" + $NFreeSpace + " Гб" + "`t" + $Nmemorys + " Гб" + "`t" + $Model
                            }
                        }
                    } else {
                        [string]$NSize = [math]::Round(($Size[$Count]/1024/1024/1024), 0)
                        [string]$NFreeSpace = [math]::Round(($FreeSpace[$Count]/1024/1024/1024), 0)
                        [string]$Nmemorys = [math]::Round(($memorys/1024/1024/1024), 0)
                        if ($NSize.Length -le 4) {
                            if ($NFreeSpace.Length -le 4) {
                                $server + "`t" + $Cores + "`t" + "`t" + $DeviceID[$Count] + "`t" + "`t" + $NSize + " Гб" + "`t" + "`t" + $NFreeSpace + " Гб" + "`t" + "`t" + $Nmemorys + " Гб" + "`t" + $Model
                            } else {
                                $server + "`t" + $Cores + "`t" + "`t" + $DeviceID[$Count] + "`t" + "`t" + $NSize + " Гб" + "`t" + "`t" + $NFreeSpace + " Гб" + "`t" + $Nmemorys + " Гб" + "`t" + $Model
                            }
                        } else {
                            if ($NFreeSpace.Length -le 4) {
                                $server + "`t" + $Cores + "`t" + "`t" + $DeviceID[$Count] + "`t" + "`t" + $NSize + " Гб" + "`t" + $NFreeSpace + " Гб" + "`t" + "`t" + $Nmemorys + " Гб" + "`t" + $Model
                            } else {
                                $server + "`t" + $Cores + "`t" + "`t" + $DeviceID[$Count] + "`t" + "`t" + $NSize + " Гб" + "`t" + $NFreeSpace + " Гб" + "`t" + $Nmemorys + " Гб" + "`t" + $Model
                            }
                        }
                    }
                }
                $Count++
            }
        } else {
            $memorys = 0
            foreach ($memory in $PhysicalMemory) {
                $memorys = $memorys + $memory
            }
            while ($Count -ne $DeviceID.Length-1) {
                if ($server.Length -le 7) {
                    [string]$NSize = [math]::Round(($Size[$Count]/1024/1024/1024), 0)
                    [string]$NFreeSpace = [math]::Round(($FreeSpace[$Count]/1024/1024/1024), 0)
                    [string]$Nmemorys = [math]::Round(($memorys/1024/1024/1024), 0)
                    if ($NSize.Length -le 4) {
                        if ($NFreeSpace.Length -le 4) {
                            $server + "`t" + "`t" + $Cores + "`t" + "`t" + $DeviceID[$Count] + "`t" + "`t" + $NSize + " Гб" + "`t" + "`t" + $NFreeSpace + " Гб" + "`t" + "`t" + $Nmemorys + " Гб" + "`t" + $Model
                        } else {
                            $server + "`t" + "`t" + $Cores + "`t" + "`t" + $DeviceID[$Count] + "`t" + "`t" + $NSize + " Гб" + "`t" + "`t" + $NFreeSpace + " Гб" + "`t" + $Nmemorys + " Гб" + "`t" + $Model
                        }
                    } else {
                        if ($NFreeSpace.Length -le 4) {
                            $server + "`t" + "`t" + $Cores + "`t" + "`t" + $DeviceID[$Count] + "`t" + "`t" + $NSize + " Гб" + "`t" + $NFreeSpace + " Гб" + "`t" + "`t" + $Nmemorys + " Гб" + "`t" + $Model
                        } else {
                            $server + "`t" + "`t" + $Cores + "`t" + "`t" + $DeviceID[$Count] + "`t" + "`t" + $NSize + " Гб" + "`t" + $NFreeSpace + " Гб" + "`t" + $Nmemorys + " Гб" + "`t" + $Model
                        }
                    }
                } else {
                    [string]$NSize = [math]::Round(($Size[$Count]/1024/1024/1024), 0)
                    [string]$NFreeSpace = [math]::Round(($FreeSpace[$Count]/1024/1024/1024), 0)
                    [string]$Nmemorys = [math]::Round(($memorys/1024/1024/1024), 0)
                    if ($NSize.Length -le 4) {
                        if ($NFreeSpace.Length -le 4) {
                            $server + "`t" + $Cores + "`t" + "`t" + $DeviceID[$Count] + "`t" + "`t" + $NSize + " Гб" + "`t" + "`t" + $NFreeSpace + " Гб" + "`t" + "`t" + $Nmemorys + " Гб" + "`t" + $Model
                        } else {
                            $server + "`t" + $Cores + "`t" + "`t" + $DeviceID[$Count] + "`t" + "`t" + $NSize + " Гб" + "`t" + "`t" + $NFreeSpace + " Гб" + "`t" + $Nmemorys + " Гб" + "`t" + $Model
                        }
                    } else {
                        if ($NFreeSpace.Length -le 4) {
                            $server + "`t" + $Cores + "`t" + "`t" + $DeviceID[$Count] + "`t" + "`t" + $NSize + " Гб" + "`t" + $NFreeSpace + " Гб" + "`t" + "`t" + $Nmemorys + " Гб" + "`t" + $Model
                        } else {
                            $server + "`t" + $Cores + "`t" + "`t" + $DeviceID[$Count] + "`t" + "`t" + $NSize + " Гб" + "`t" + $NFreeSpace + " Гб" + "`t" + $Nmemorys + " Гб" + "`t" + $Model
                        }
                    }
                }
                $Count++
            }
        }
    }
}