Jak wygenerować raport systemowy w PowerShellu?

Raport Systemowy PowerShell
1. KONFIGURACJA
   ├── Parametry wejściowe
   └── Zmienne konfiguracyjne

2. FUNKCJE POMOCNICZE
   ├── Get-ComputerData (dane komputera)
   ├── Get-ProcessorData (informacje o CPU)
   ├── Get-MemoryData (dane pamięci RAM)
   ├── Get-BIOSData (informacje BIOS)
   ├── Get-DiskData (dane dysków)
   ├── Get-NetworkData (konfiguracja sieci)
   └── Get-LocalUsersData (lokalni użytkownicy)

3. GŁÓWNA LOGIKA
   ├── Inicjalizacja modułu
   ├── Zbieranie danych
   └── Generowanie raportu HTML
[CmdletBinding()]
param(
    [Parameter()]
    [string]$OutputPath = "$Home\SystemReport.html"
)

#Requires -Version 5.1
$Config = @{
    HeaderColor = '#00364b'
}
function Initialize-PSWriteHTML {
     if (-not (Get-Module -ListAvailable -Name PSWriteHTML)) {
        Write-Warning "Moduł PSWriteHTML nie jest zainstalowany."
        Write-Host "Instalowanie modułu PSWriteHTML..." -ForegroundColor Yellow
        
        try {
            Install-Module -Name PSWriteHTML -Scope CurrentUser -Force -ErrorAction Stop
            Write-Host "Moduł PSWriteHTML został pomyślnie zainstalowany." -ForegroundColor Green
        }
        catch {
            Write-Error "Nie udało się zainstalować modułu PSWriteHTML: $_"
            exit 1
        }
    }
    
    Import-Module PSWriteHTML -ErrorAction Stop
}
function Get-ComputerData {
    try {
        $ComputerInfo = Get-CimInstance -ClassName Win32_ComputerSystem -ErrorAction Stop
        $OSInfo = Get-CimInstance -ClassName Win32_OperatingSystem -ErrorAction Stop
        
        [ordered]@{
            'Typ urządzenia' = $ComputerInfo.ChassisSKUNumber
            'Nazwa komputera' = $ComputerInfo.Name
            'Producent' = $ComputerInfo.Manufacturer
            'Model' = $ComputerInfo.Model
            'Domena/Grupa robocza' = if ($ComputerInfo.PartOfDomain) { $ComputerInfo.Domain } else { $ComputerInfo.Workgroup }
            'System operacyjny' = $OSInfo.Caption
            'Wersja OS' = $OSInfo.Version
            'Architektura' = $OSInfo.OSArchitecture
            'Data instalacji' = $OSInfo.InstallDate
            'Ostatni rozruch' = $OSInfo.LastBootUpTime
            'Bieżący użytkownik' = $ComputerInfo.UserName
        }
    }
    catch {
        Write-Error "Błąd podczas pobierania informacji o komputerze: $_"
        return @{}
    }
}
PS C:\Users\Admin> Get-ComputerData

Name                           Value                                                                                                                                            
----                           -----                                                                                                                                            
Typ urządzenia                 Notebook                                                                                                                                         
Nazwa komputera                DELL                                                                                                                                             
Producent                      Dell Inc.                                                                                                                                        
Model                          Latitude 7490                                                                                                                                    
Domena/Grupa robocza           WORKGROUP                                                                                                                                        
System operacyjny              Microsoft Windows 11 Pro                                                                                                                         
Wersja OS                      10.0.26200                                                                                                                                       
Architektura                   64-bit                                                                                                                                           
Data instalacji                12/01/2025 17:02:15                                                                                                                              
Ostatni rozruch                19/01/2026 16:13:19                                                                                                                              
Bieżący użytkownik             Dell\Admin   
function Get-ProcessorData {
    try {
        $ProcessorInfo = Get-CimInstance -ClassName Win32_Processor -ErrorAction Stop
        
        [ordered]@{
            'Procesor' = $ProcessorInfo.Name
            'Rdzenie' = $ProcessorInfo.NumberOfCores
            'Procesory logiczne' = $ProcessorInfo.NumberOfLogicalProcessors
            'Maksymalna częstotliwość' = "$($ProcessorInfo.MaxClockSpeed) MHz"
        }
    }
    catch {
        Write-Error "Błąd podczas pobierania informacji o procesorze: $_"
        return @{}
    }
}
function Get-MemoryData {
    try {
        $ComputerInfo = Get-CimInstance -ClassName Win32_ComputerSystem -ErrorAction Stop
        $OSInfo = Get-CimInstance -ClassName Win32_OperatingSystem -ErrorAction Stop
        
        $TotalRAM = [math]::Round($ComputerInfo.TotalPhysicalMemory / 1GB, 2)
        $FreeRAM = [math]::Round($OSInfo.FreePhysicalMemory / 1MB, 2)
        $UsedRAM = [math]::Round($TotalRAM - $FreeRAM, 2)
        
        [PSCustomObject]@{
            'Całkowita RAM (GB)' = $TotalRAM
            'Wolna RAM (GB)' = $FreeRAM
            'Używana RAM (GB)' = $UsedRAM
            'Wykorzystanie (%)' = [math]::Round(($UsedRAM / $TotalRAM) * 100, 2)
        }
    }
    catch {
        Write-Error "Błąd podczas pobierania informacji o pamięci: $_"
        return $null
    }
}
function Get-BIOSData {
    try {
        $BIOSInfo = Get-CimInstance -ClassName Win32_BIOS -ErrorAction Stop
        
        [ordered]@{
            'Producent' = $BIOSInfo.Manufacturer
            'Wersja' = $BIOSInfo.SMBIOSBIOSVersion
            'Data wydania' = $BIOSInfo.ReleaseDate
            'Numer seryjny' = $BIOSInfo.SerialNumber
        }
    }
    catch {
        Write-Error "Błąd podczas pobierania informacji o BIOS: $_"
        return @{}
    }
}
function Get-DiskData {
    try {
        Get-CimInstance -ClassName Win32_LogicalDisk -Filter "DriveType=3" -ErrorAction Stop |
            ForEach-Object {
                [PSCustomObject]@{
                    'Dysk' = $_.DeviceID
                    'System plików' = $_.FileSystem
                    'Pojemność (GB)' = [math]::Round($_.Size / 1GB, 2)
                    'Wolne miejsce (GB)' = [math]::Round($_.FreeSpace / 1GB, 2)
                    'Wykorzystane (%)' = [math]::Round((($_.Size - $_.FreeSpace) / $_.Size) * 100, 2)
                }
            }
    }
    catch {
        Write-Error "Błąd podczas pobierania informacji o dyskach: $_"
        return @()
    }
}
function Get-NetworkData {
    try {
        Get-CimInstance -ClassName Win32_NetworkAdapterConfiguration -Filter "IPEnabled=True" -ErrorAction Stop |
            ForEach-Object {
                [PSCustomObject]@{
                    'Adapter' = $_.Description
                    'Adres IP' = ($_.IPAddress -join ', ')
                    'Maska podsieci' = ($_.IPSubnet -join ', ')
                    'Brama domyślna' = if ($_.DefaultIPGateway) { ($_.DefaultIPGateway -join ', ') } else { "Brak" }
                    'Serwery DNS' = ($_.DNSServerSearchOrder -join ', ')
                    'DHCP włączone' = $_.DHCPEnabled
                }
            }
    }
    catch {
        Write-Error "Błąd podczas pobierania informacji o sieci: $_"
        return @()
    }
}
function Get-LocalUsersData {
    try {
        Get-LocalUser -ErrorAction Stop |
            ForEach-Object {
                [PSCustomObject]@{
                    'Nazwa użytkownika' = $_.Name
                    'Włączone' = $_.Enabled
                    'Ostatnie logowanie' = if ($_.LastLogon) { $_.LastLogon } else { "Nigdy" }
                    'Wymagane hasło' = $_.PasswordRequired
                }
            }
    }
    catch {
        Write-Error "Błąd podczas pobierania informacji o użytkownikach: $_"
        return @()
    }
}
try {
    Write-Host "Inicjalizacja modułu PSWriteHTML..." -ForegroundColor Cyan
    Initialize-PSWriteHTML
    
    Write-Host "Zbieranie informacji systemowych..." -ForegroundColor Cyan
    
    $ComputerData = Get-ComputerData
    $ProcessorData = Get-ProcessorData
    $RamData = Get-MemoryData
    $BIOSData = Get-BIOSData
    $DiskData = Get-DiskData
    $NetworkData = Get-NetworkData
    $LocalUsersData = Get-LocalUsersData
HTMLSection (główna)
  └─ HTMLPanel (niewidoczny kontener)
      └─ HTMLSection (urządzenie)
  └─ HTMLPanel (niewidoczny kontener)
      ├─ HTMLSection (procesor)
      └─ HTMLSection (BIOS)
  └─ HTMLPanel (niewidoczny kontener)
      ├─ HTMLSection (sieć)
      ├─ HTMLSection (dyski)
      └─ HTMLSection (RAM)
  └─ HTMLPanel (niewidoczny kontener)
      └─ HTMLSection (użytkownicy)
New-HTML -TitleText "Raport systemowy - $env:COMPUTERNAME" -Online -FilePath $OutputPath {
New-HTMLSection -HeaderText "Informacje o komputerze - $env:COMPUTERNAME" -HeaderBackGroundColor $Config.HeaderColor {
New-Panel -Invisible {
    New-HTMLSection -HeaderText "Urządzenie" -HeaderBackGroundColor $Config.HeaderColor {
        New-HTMLTable -DataTable $ComputerData -HideFooter -HideButtons -DisableInfo -DisablePaging -DisableSearch -DisableOrdering
    }
}
New-HTMLPanel -Invisible {
    New-HTMLSection -HeaderText "Procesor" -HeaderBackGroundColor $Config.HeaderColor {
        New-HTMLTable -DataTable $ProcessorData -HideFooter -HideButtons -DisableInfo -DisablePaging -DisableSearch -DisableOrdering
    }
    
    New-HTMLSection -HeaderText "BIOS" -HeaderBackGroundColor $Config.HeaderColor {
        New-HTMLTable -DataTable $BIOSData -HideFooter -HideButtons -DisableInfo -DisablePaging -DisableSearch -DisableOrdering
    }
}
New-HTMLPanel -Invisible {
    New-HTMLSection -HeaderText "Ustawienia sieciowe" -HeaderBackGroundColor $Config.HeaderColor {
         New-HTMLTable -DataTable $NetworkData -HideFooter -HideButtons -DisableInfo -DisablePaging -DisableSearch -DisableOrdering
                }
                
     New-HTMLSection -HeaderText "Dyski" -HeaderBackGroundColor $Config.HeaderColor {
          New-HTMLTable -DataTable $DiskData -HideFooter -HideButtons -DisableInfo -DisablePaging -DisableSearch -DisableOrdering {
               New-TableCondition -Name 'Wykorzystane (%)' -ComparisonType number -Operator gt -Value 90 -BackgroundColor Red -Color White
               New-TableCondition -Name 'Wykorzystane (%)' -ComparisonType number -Operator gt -Value 75 -BackgroundColor Orange -Color White
               New-TableCondition -Name 'Wykorzystane (%)' -ComparisonType number -Operator le -Value 75 -BackgroundColor LightGreen
                    }
                }
                
     New-HTMLSection -HeaderText "Pamięć (RAM)" -HeaderBackGroundColor $Config.HeaderColor {
          New-HTMLTable -DataTable $RamData -HideFooter -HideButtons -DisableInfo -DisablePaging -DisableSearch -DisableOrdering {
               New-HTMLTableCondition -Name 'Wykorzystanie (%)' -ComparisonType number -Operator gt -Value 90 -BackgroundColor Red -Color White
               New-HTMLTableCondition -Name 'Wykorzystanie (%)' -ComparisonType number -Operator gt -Value 75 -BackgroundColor Orange -Color White
                    }
                }
            }
New-HTMLPanel -Invisible {
    New-HTMLSection -HeaderText "Lokalni użytkownicy" -HeaderBackGroundColor $Config.HeaderColor {
        New-HTMLTable -DataTable $LocalUsersData -HideFooter -HideButtons -DisableInfo -DisablePaging -DisableSearch -DisableOrdering
                }
            }
New-HTMLFooter {
    New-HTMLText -Text "Raport wygenerowany: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') | Komputer: $env:COMPUTERNAME | Użytkownik: $env:USERNAME" -Alignment center
}
} -ShowHTML

Write-Host "`nRaport został pomyślnie wygenerowany: $OutputPath" -ForegroundColor Green
}
catch {
    Write-Error "Wystąpił błąd podczas generowania raportu: $_"
    exit 1
}

Link do repozytorium Git-Hub

# Uruchom skrypt z domyślnymi parametrami
.\Get-SystemReport.ps1

# Uruchom skrypt z własną ścieżką do zapisu raportu
.\Get-SystemReport.ps1 -OutputPath "C:\Reports\$(Get-Date -Format 'yyyyMMdd')_$env:COMPUTERNAME.html"
Raport PowerShell
$Action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-File C:\Scripts\Get-SystemReport.ps1 -OutputPath C:\Reports\Daily_$(Get-Date -Format 'yyyyMMdd').html"
$Trigger = New-ScheduledTaskTrigger -Daily -At 9AM
Register-ScheduledTask -TaskName "Daily System Report" -Action $Action -Trigger $Trigger

Podsumowanie

PowerShell w połączeniu z modułem PSWriteHTML pozwala stworzyć rozwiązanie, które jest jednocześnie elastyczne, czytelne i łatwe w dalszym rozwoju. Taki raport może pełnić rolę szybkiej diagnostyki w trakcie incydentu, materiału referencyjnego dla zespołu, a także elementu cyklicznego monitoringu stanu infrastruktury.


To wszystko na dziś!

Jeśli masz ciekawe spostrzeżenia lub doświadczenia w tym temacie – koniecznie podziel się nimi w komentarzach.
A jeśli moje materiały są dla Ciebie pomocne, możesz postawić mi wirtualną kawę.

Dzięki za wsparcie!

Postaw mi kawę na buycoffee.to

Adam Pietrzak

Administrator | Trener i autor szkoleń | Entuzjasta PowerShella

Administrator systemów i sieci wsparcia działań wojskowych z ponad 10-letnim doświadczeniem. Praktyk w dziedzinie zarządzania Active Directory, bezpieczeństwa systemu Windows oraz automatyzacji zadań (PowerShell). Trener i twórca materiałów edukacyjnych (szkolenia, warsztaty, artykuły, podręczniki). Pasjonat dzielenia się wiedzą i wspierania początkujących administratorów IT. Prywatnie – amator aktywnego wypoczynku i rodzinnych podróży.


PowerShell - 10 sposobów na optymalizację codziennej pracy
Podziel się

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *