По некоторым причинам я решил отойти от сбора статистики по серверам в AIDA64 и ограничиться сбором информации сугубо через Powershell.
Если вы помните ранее я делал подобное с серверами HyperV. На сегодня эта задача упростилась до сбора следующих параметров:
- Hostname
- Serial number
- Product number (SKU)
- Model host
- OS Type
- OS Locale
- OS Bits (32/64)
- CPU Type
- RAM Size (GB)
- Disk Size (GB)
- IP Address of active physical adapters.
Исходя из этого я создал функцию Get-CMDBInfo которая в качестве параметра принимает только путь куда положить файл отчета в формате CSV. Далее процедура простая: либо вы экспортируете отчет в Excel вручную либо делаете это через:
Import-csv -Path 'c:\tmp\_SERVER01.csv' | Export-Excel -Path 'c:\tmp\database.xlsx' -AutoSize -WorksheetName Sheet1 -Append -Show
Во втором случае первая строка в database.xlsx должна соответствовать заранее структуре (шапке) отчета, т.е. быть такой: "a0Date_info","a0Hostname","a0Model","a0Product_number","a0Serial_number","a1CPU_Type","a1Disk_Size","a1RAM_Size","b0IP_Address","b1OS_Type","OS_Bits","OS_Locale","OS_release"
Да бы она не портила вам общий вид эту строку можно скрыть.
А теперь сам код:
Function Get-CMDBInfo {
<#
.SYNOPSIS
This function get information about Windows host.
.DESCRIPTION
Function get data about Windows host and export it to CSV file as filename like _hostname:
Hostname
Serial number
Product number (SKU)
Model host
OS Type
OS Locale
OS Bits (32/64)
CPU Type
RAM Size (GB)
Disk Size (GB)
IP Address of active physical adapters
.EXAMPLE: Call from current file
Get-CMDBInfo -Path2File 'd:\'
.EXAMPLE: Call from external file
. d:\CMDB.ps1
-OR-
. .\!!!\CMDB.ps1
Get-CMDBInfo -Path2File 'd:\reports\'
.PARAMETER Path2File
Mandatory. Path to the Log file.
#>
[cmdletbinding()]
param(
[Parameter(Mandatory,ValueFromPipeline)]
[string]$Path2File
)
# Retrieve system information
$systemInfo = @{
a0Date_info = Get-Date
a0Hostname = $env:COMPUTERNAME
a0Serial_number = (gcim Win32_bios).SerialNumber
a0Product_number = (gcim Win32_computersystem).SystemSKUNumber
a0Model = (Get-WmiObject -Class:Win32_ComputerSystem).Model
b1OS_Type = (Get-CimInstance Win32_OperatingSystem).Caption
OS_Locale = (Get-CimInstance Win32_OperatingSystem).Locale
OS_Bits = (Get-CimInstance Win32_OperatingSystem).OSArchitecture
a1CPU_Type = (Get-CimInstance Win32_Processor).Name -join ', '
a1RAM_Size = '{0:N1} GB' -f (((Get-CimInstance Win32_ComputerSystem).TotalPhysicalMemory -as [double]) / 1GB)
a1Disk_Size = '{0:N1} GB' -f ((Get-PhysicalDisk | Measure-Object Size -Sum).Sum / 1GB)
b0IP_Address = (Get-NetIPAddress -AddressFamily IPv4 -InterfaceAlias (Get-NetAdapter -Physical | Where-Object Status -eq 'Up').InterfaceAlias).IPAddress -join ', '
}
# Convert LCID to language name
$languages = @{
"0409" = "English";
"0422" = "Ukrainian";
"0419" = "Russian";
# Add more LCID and language mappings here...
}
$lcid = $systemInfo['OS_Locale']
$languageName = $languages[$lcid]
$systemInfo['OS_Locale'] = $languageName
# OS release
$regPath = "HKLM:\SYSTEM\CurrentControlSet\Control\ProductOptions"
$productType = Get-ItemPropertyValue -Path $regPath -Name "ProductType"
if ($productType -eq "WinNT") {
$systemInfo['OS_release'] = (Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name DisplayVersion).DisplayVersion
# Write-Host "Workstation"
} elseif ($productType -eq "ServerNT") {
# Write-Host "Server"
$systemInfo['OS_release'] = (Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name ReleaseID).ReleaseID
}
$sortedSystemInfo = [Ordered]@{}
$systemInfo.GetEnumerator() | Sort-Object -Property Name | foreach {
$sortedSystemInfo[$_.Name] = $_.Value
}
# Visual control for output the sorted hashtable
$sortedSystemInfo
# Convert hashtable to custom object
$systemObject = New-Object -TypeName PSObject -Property $sortedSystemInfo
# Export system information to CSV file
$systemObject | Export-Csv -Path $Path2File'_'$env:COMPUTERNAME'.txt' -Encoding UTF8 -NoTypeInformation -Force
}
Успехов.
No comments:
Post a Comment
А что вы думаете по этому поводу?