А АTuesday, 1 August 2023

Собираем статистику в один клик, v3.

Всем привет.

По некоторым причинам я решил отойти от сбора статистики по серверам в 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

А что вы думаете по этому поводу?

Версия на печать

Популярное