cheat sheet

systeminfo

Display detailed OS, hardware, and network configuration for the local or a remote Windows machine. Covers output formats, remote querying, filtering, and parsing in scripts.

systeminfo — System Information

What it is

systeminfo is a built-in Windows command that queries and displays detailed configuration information about the local or a remote machine: OS version, build number, install date, hardware (CPU, RAM, BIOS), hotfixes, network adapters, and more. It ships with all Windows versions since XP as part of C:\Windows\System32\systeminfo.exe. For programmatic consumption, the /FO CSV or /FO LIST output formats are cleaner than the default table; for richer scripting, PowerShell's Get-ComputerInfo or WMI are more flexible alternatives.

Availability

systeminfo ships with Windows XP and later as C:\Windows\System32\systeminfo.exe. Remote querying requires the Remote Registry service and appropriate firewall rules on the target machine.

cmd
systeminfo /?

Output:

perl
This tool displays operating system configuration information for
a local or remote machine, including service pack levels.

SYSTEMINFO [/S system [/U username [/P [password]]]] [/FO format] [/NH]

Syntax

Without arguments systeminfo queries the local machine. Remote targets are specified with /S; credentials with /U and /P.

cmd
systeminfo [/S host] [/U domain\user] [/P password] [/FO TABLE|LIST|CSV] [/NH]

Output: (multi-line system report)

Essential options

SwitchMeaning
/S hostnameQuery a remote machine
/U domain\userRun with alternate credentials
/P passwordPassword for /U (prompt if omitted)
/FO TABLEDefault tabular output
/FO LISTOne property per line (Name: Value pairs)
/FO CSVComma-separated values — best for scripting
/NHNo header — suppress column headers (use with /FO TABLE or /FO CSV)

Basic output

Running without arguments shows the full local system report.

cmd
systeminfo

Output:

yaml
Host Name:                 MYHOST
OS Name:                   Microsoft Windows 11 Pro
OS Version:                10.0.26100 N/A Build 26100
OS Manufacturer:           Microsoft Corporation
OS Configuration:          Standalone Workstation
OS Build Type:             Multiprocessor Free
Registered Owner:          alicedev
Registered Organization:
Product ID:                00000-00000-00000-AA000
Original Install Date:     01/01/2026, 09:00:00
System Boot Time:          28/04/2026, 06:30:00
System Manufacturer:       ACME Corp
System Model:              WorkStation 1000
System Type:               x64-based PC
Processor(s):              1 Processor(s) Installed.
                           [01]: Intel64 Family 6 Model 186 Stepping 2 GenuineIntel ~3400 Mhz
BIOS Version:              ACME Corp 1.2.3, 01/01/2025
Windows Directory:         C:\Windows
System Directory:          C:\Windows\system32
Boot Device:               \Device\HarddiskVolume2
System Locale:             en-us;English (United States)
Input Locale:              en-us;English (United States)
Time Zone:                 (UTC+00:00) Dublin, Edinburgh, Lisbon, London
Total Physical Memory:     16,384 MB
Available Physical Memory: 8,192 MB
Virtual Memory: Max Size:  32,768 MB
Virtual Memory: Available: 18,432 MB
Virtual Memory: In Use:    14,336 MB
Page File Location(s):     C:\pagefile.sys
Domain:                    WORKGROUP
Logon Server:              \\MYHOST
Hotfix(s):                 5 Hotfix(s) Installed.
                           [01]: KB1234567
                           ...
Network Card(s):           1 NIC(s) Installed.
                           [01]: Intel(R) Ethernet Controller
                                 DHCP Enabled:    Yes
                                 DHCP Server:     192.168.1.1
                                 IP address(es):  192.168.1.100

List format

/FO LIST outputs one Name: Value pair per line — easier to parse with findstr than the default table.

cmd
systeminfo /FO LIST

Output:

yaml
Host Name:                 MYHOST
OS Name:                   Microsoft Windows 11 Pro
OS Version:                10.0.26100 N/A Build 26100
Total Physical Memory:     16,384 MB
Available Physical Memory: 8,192 MB
...

CSV format for scripting

/FO CSV outputs a header row followed by one data row — ideal for parsing with for /f in batch scripts or importing into Excel.

cmd
systeminfo /FO CSV

Output:

arduino
"Host Name","OS Name","OS Version","OS Manufacturer","OS Configuration","OS Build Type","Registered Owner","...
"MYHOST","Microsoft Windows 11 Pro","10.0.26100 N/A Build 26100","Microsoft Corporation","Standalone Workstation","...
cmd
rem CSV without header (for appending to an existing report)
systeminfo /FO CSV /NH

Output:

arduino
"MYHOST","Microsoft Windows 11 Pro","10.0.26100 N/A Build 26100",...

Filtering with findstr

Pipe systeminfo output into findstr to extract a specific property without parsing the full output.

cmd
rem OS build number
systeminfo | findstr /B /C:"OS Version"

Output:

less
OS Version:                10.0.26100 N/A Build 26100
cmd
rem Total and available RAM
systeminfo | findstr /C:"Total Physical Memory" /C:"Available Physical Memory"

Output:

yaml
Total Physical Memory:     16,384 MB
Available Physical Memory: 8,192 MB
cmd
rem All installed hotfixes
systeminfo | findstr /C:"Hotfix"

Output:

scss
Hotfix(s):                 5 Hotfix(s) Installed.
cmd
rem Boot time
systeminfo | findstr /B /C:"System Boot Time"

Output:

sql
System Boot Time:          28/04/2026, 06:30:00

Querying a remote machine

/S targets a remote host by name or IP. /U provides alternate credentials; if /P is omitted, systeminfo prompts for the password interactively.

cmd
systeminfo /S myhost /U DOMAIN\alicedev

Output:

yaml
Password: (prompted)

Host Name:                 MYHOST
OS Name:                   Microsoft Windows Server 2022 Datacenter
...
cmd
rem With password in command (avoid in interactive sessions — use /P alone for prompt)
systeminfo /S myhost /U DOMAIN\alicedev /P s3cr3t /FO LIST

Output:

yaml
Host Name:                 MYHOST
OS Name:                   Microsoft Windows Server 2022 Datacenter
...

Saving output to a file

Redirect output to a text or CSV file for inventory or audit purposes.

cmd
systeminfo /FO CSV > C:\Audit\%COMPUTERNAME%_info.csv

Output: (no screen output — written to file)

cmd
systeminfo > C:\Audit\sysinfo.txt
type C:\Audit\sysinfo.txt | findstr "OS Version"

Output:

less
OS Version:                10.0.26100 N/A Build 26100

Common pitfalls

  1. Slow on first runsysteminfo queries WMI and can take 15–30 seconds; don't use it in tight loops.
  2. Remote queries need Remote Registry service — ensure the service is running on the target and that WMI/RPC ports (135, 445, 49152+) are open through any firewall.
  3. CSV has a single data rowsysteminfo /FO CSV produces one header row and one data row (for the queried machine); it does not produce one row per remote host when scripting multiple machines. Loop with for and redirect to a single accumulating CSV.
  4. Credentials in plaintext on the command line — avoid /P password in scripts visible to other users; use runas or PowerShell's Get-Credential instead.
  5. Output encoding — the default output uses the system OEM code page; redirect to a file with > file.txt and open with the matching encoding in your editor.

Real-world recipes

Inventory OS build across a list of machines

cmd
@echo off
echo "Host","OS Version","Total RAM" > inventory.csv
for /f "delims=" %%h in (hostlist.txt) do (
    for /f "tokens=1,3,10 delims=," %%a in (
        'systeminfo /S %%h /FO CSV /NH 2^>NUL'
    ) do echo %%a,%%c,%%j >> inventory.csv
)

Output: (inventory.csv written with one row per host)

Check whether a specific hotfix is installed

cmd
systeminfo | findstr "KB5034441"

Output:

csharp
                           [03]: KB5034441

Get uptime from boot time

cmd
systeminfo | findstr /B /C:"System Boot Time"

Output:

sql
System Boot Time:          28/04/2026, 06:30:00

Export full system report for a support ticket

cmd
systeminfo > %TEMP%\sysinfo_%COMPUTERNAME%_%DATE:~-4,4%%DATE:~-10,2%%DATE:~-7,2%.txt
echo Report saved to %TEMP%

Output:

css
Report saved to C:\Users\alicedev\AppData\Local\Temp

Output field reference

Every field in systeminfo answers a specific operational question. Use this table to map the line you care about to the right findstr pattern.

FieldUse caseNotes
Host NameIdentitySame as %COMPUTERNAME% and hostname
OS NameProduct SKU"Windows 11 Pro" vs "Windows Server 2022 Datacenter"
OS VersionBuild identificationFormat 10.0.<build> N/A Build <build>
OS ManufacturerAlways "Microsoft Corporation"rarely useful
OS ConfigurationDomain role"Standalone Workstation", "Member Workstation", "Primary Domain Controller"
OS Build TypeFree vs Checked"Multiprocessor Free" = retail; "Checked" = debug
Registered Owner / Registered OrganizationOOBE valuesfrom Windows setup
Product IDActivation lookup5-group format
Original Install DateImaging auditresets when OS is reinstalled
System Boot TimeUptime calculationuse for "uptime since last boot"
System Manufacturer / System ModelHardwarefrom SMBIOS
System TypeArchitecture"x64-based PC", "ARM64-based PC"
Processor(s)CPU enumerationOne sub-line per socket
BIOS VersionFirmwareformat <vendor> <version>, <date>
Windows DirectoryInstall locationusually C:\Windows
System Directorysystem32 path
Boot DeviceBoot volume\Device\HarddiskVolumeN
System Locale / Input LocaleLocalizationaffects locale-sensitive output
Time ZoneTZ displaymatches tzutil /g
Total Physical MemoryRAM totalreported in MB, with thousands separator
Available Physical MemoryFree RAMlive value at query time
Virtual Memory: Max Size / Available / In UsePage filehelps diagnose commit pressure
Page File Location(s)pagefile pathsusually C:\pagefile.sys
DomainAD domainWORKGROUP if not joined
Logon ServerDC used at logon\\<dc-name>
Hotfix(s)Patchesfirst line is the count; subsequent lines are KB IDs
Network Card(s)NICseach NIC sub-block: name, DHCP, IPs
Hyper-V RequirementsVirtualizationshows VM Monitor Mode Extensions, virtualization in firmware, SLAT, DEP

Hyper-V requirements field

systeminfo's last few lines report Hyper-V hardware-virtualization requirements — useful when troubleshooting "Hyper-V can't start" or "WSL2 won't install".

cmd
systeminfo | findstr /C:"Hyper-V"

Output:

yaml
Hyper-V Requirements:      VM Monitor Mode Extensions: Yes
                           Virtualization Enabled In Firmware: Yes
                           Second Level Address Translation: Yes
                           Data Execution Prevention Available: Yes

If you see A hypervisor has been detected. Features required for Hyper-V will not be displayed. — Hyper-V is already running, the requirement-detection layer can't query the hardware directly.

Uptime calculation from boot time

systeminfo reports the absolute boot time. Combine with a date math one-liner to get uptime in days/hours.

cmd
rem Boot time as a raw string
for /f "tokens=2,* delims=:" %%a in ('systeminfo ^| findstr /B /C:"System Boot Time"') do (
    echo Boot:%%a%%b
)

Output:

text
Boot: 5/20/2026, 9:14:22 AM
cmd
rem PowerShell — better at date arithmetic
powershell -NoProfile -Command "(Get-Date) - (Get-CimInstance Win32_OperatingSystem).LastBootUpTime"

Output:

yaml
Days              : 5
Hours             : 14
Minutes           : 22
Seconds           : 11
Milliseconds      : 0
cmd
rem PowerShell — pretty-printed uptime
powershell -NoProfile -Command "$u=(Get-Date)-(gcim Win32_OperatingSystem).LastBootUpTime; '{0}d {1}h {2}m' -f $u.Days,$u.Hours,$u.Minutes"

Output: 5d 14h 22m

Get-ComputerInfo — PowerShell equivalent

Get-ComputerInfo is the modern PowerShell cmdlet that returns ~180 properties as an object — every field systeminfo shows plus many more (BIOS firmware type, secure boot state, device guard, WMI namespace versions). Use it when you need structured data instead of parseable text.

powershell
# Everything (slow — multi-second WMI walk)
Get-ComputerInfo
powershell
# A focused subset
Get-ComputerInfo -Property OsName, OsVersion, OsHardwareAbstractionLayer,
                           BiosManufacturer, BiosVersion,
                           CsManufacturer, CsModel, CsTotalPhysicalMemory,
                           CsProcessors, CsNumberOfLogicalProcessors,
                           OsLastBootUpTime, OsUptime,
                           HyperVRequirementVirtualizationFirmwareEnabled,
                           DeviceGuardSmartStatus

Output:

yaml
OsName                                       : Microsoft Windows 11 Pro
OsVersion                                    : 10.0.26100
OsHardwareAbstractionLayer                   : 10.0.26100.1
BiosManufacturer                             : ACME Corp
BiosVersion                                  : {ACME Corp 1.2.3}
CsManufacturer                               : ACME Corp
CsModel                                      : WorkStation 1000
CsTotalPhysicalMemory                        : 17179869184
CsProcessors                                 : {Intel64 Family 6 Model 186}
CsNumberOfLogicalProcessors                  : 16
OsLastBootUpTime                             : 5/20/2026 6:30:00 AM
OsUptime                                     : 5.14:22:11.0000000
HyperVRequirementVirtualizationFirmwareEnabled : True
DeviceGuardSmartStatus                       : Running
powershell
# Convert OsLocalDateTime/OsLastBootUpTime to friendly format
Get-ComputerInfo |
    Select-Object @{N='HostName'; E={$_.CsName}},
                  @{N='OS';       E={$_.OsName}},
                  @{N='Build';    E={$_.OsVersion}},
                  @{N='RAM_GB';   E={[math]::Round($_.CsTotalPhysicalMemory/1GB,2)}},
                  @{N='Uptime';   E={(Get-Date) - $_.OsLastBootUpTime}}

Output:

yaml
HostName : MYHOST
OS       : Microsoft Windows 11 Pro
Build    : 10.0.26100
RAM_GB   : 16
Uptime   : 5.14:22:11

CIM / WMI alternatives

Get-ComputerInfo is convenient but slow. For one specific field, query CIM directly — 10-100× faster.

powershell
# OS build
(Get-CimInstance Win32_OperatingSystem).BuildNumber

Output: 26100

powershell
# Boot time / uptime in one shot
$os = Get-CimInstance Win32_OperatingSystem
[PSCustomObject]@{
    Boot   = $os.LastBootUpTime
    Uptime = (Get-Date) - $os.LastBootUpTime
}
powershell
# Total RAM in GB
[math]::Round(
    (Get-CimInstance Win32_ComputerSystem).TotalPhysicalMemory / 1GB, 2)

Output: 16

powershell
# Installed hotfixes (faster than parsing systeminfo)
Get-HotFix | Sort-Object InstalledOn -Descending |
    Select-Object -First 10 HotFixID, Description, InstalledOn

Output:

sql
HotFixID    Description     InstalledOn
--------    -----------     -----------
KB5034441   Security Update 5/15/2026 12:00:00 AM
KB5031356   Update          4/30/2026 12:00:00 AM
KB5028951   Security Update 4/15/2026 12:00:00 AM
...
powershell
# All NICs with IP addresses (richer than systeminfo's Network Card(s) block)
Get-NetIPConfiguration |
    Select-Object InterfaceAlias, InterfaceDescription,
                  @{N='IPv4'; E={$_.IPv4Address.IPAddress -join ','}},
                  @{N='Gateway'; E={$_.IPv4DefaultGateway.NextHop}}

Hotfix queries

systeminfo lists every installed hotfix but truncates the list in CSV form. For hotfix-only audits, wmic qfe (legacy) or Get-HotFix (modern) are cleaner.

cmd
rem Confirm a specific KB is installed (exit code)
systeminfo | findstr "KB5034441" >NUL && echo Installed || echo NOT installed

Output: Installed

cmd
rem wmic — legacy but still installed in current Windows
wmic qfe get HotFixID,InstalledOn,Description /format:csv

Output:

sql
Node,Description,HotFixID,InstalledOn
MYHOST,Security Update,KB5034441,5/15/2026
MYHOST,Update,KB5031356,4/30/2026
MYHOST,Security Update,KB5028951,4/15/2026
powershell
# Modern — Get-HotFix
Get-HotFix | Where-Object Description -eq 'Security Update' |
    Sort-Object InstalledOn -Descending |
    Format-Table HotFixID, InstalledOn, InstalledBy

Output:

sql
HotFixID  InstalledOn         InstalledBy
--------  -----------         -----------
KB5034441 5/15/2026 12:00 AM  NT AUTHORITY\SYSTEM
KB5028951 4/15/2026 12:00 AM  NT AUTHORITY\SYSTEM
powershell
# Cross-fleet hotfix check
$hosts = 'srv01','srv02','srv03'
foreach ($h in $hosts) {
    $hf = Invoke-Command -ComputerName $h `
        -ScriptBlock { Get-HotFix -Id KB5034441 -ErrorAction SilentlyContinue }
    [PSCustomObject]@{
        Host      = $h
        Installed = if ($hf) { $hf.InstalledOn } else { 'MISSING' }
    }
} | Format-Table -AutoSize

Output:

swift
Host  Installed
----  ---------
srv01 5/15/2026 12:00:00 AM
srv02 5/15/2026 12:00:00 AM
srv03 MISSING

Pairing with adjacent tools

systeminfo answers "what is this box?". The deepest answers come from combining it with the surrounding toolset:

NeedPair withWhy
Timezone confirmationtzutil /gsysteminfo only shows display name; tzutil shows the registry ID
Clock-sync statew32tm /query /statusBoot time means nothing if the clock is drifting
Driver inventorydriverqueryHardware list + driver versions
Live performancelogman / htop for Linux comparisonCounter samples vs snapshot
Event correlationwevtutilFind errors at or after boot time
Power statepowercfg /aAvailable sleep states the BIOS reports
Linux equivalenthtop, uname -a, uptimeFor mixed-fleet inventories
cmd
rem Combo snapshot for a support bundle
@echo off
set OUT=%TEMP%\snap_%COMPUTERNAME%.txt
echo === systeminfo === > %OUT%
systeminfo >> %OUT%
echo. >> %OUT%
echo === tzutil /g === >> %OUT%
tzutil /g >> %OUT%
echo. >> %OUT%
echo === w32tm /query /status === >> %OUT%
w32tm /query /status >> %OUT%
echo. >> %OUT%
echo === powercfg /a === >> %OUT%
powercfg /a >> %OUT%
echo. >> %OUT%
echo === Recent System errors === >> %OUT%
wevtutil qe System /q:"*[System[(Level=1 or Level=2) and TimeCreated[timediff(@SystemTime) <= 86400000]]]" /c:10 /rd:true /f:text >> %OUT%
echo Snapshot: %OUT%

Output:

text
Snapshot: C:\Users\Alice\AppData\Local\Temp\snap_MYHOST.txt

Common pitfalls

  1. Slow on first runsysteminfo queries WMI and can take 15–30 seconds; don't use it in tight loops.
  2. Remote queries need Remote Registry service — ensure the service is running on the target and that WMI/RPC ports (135, 445, 49152+) are open through any firewall.
  3. CSV has a single data rowsysteminfo /FO CSV produces one header row and one data row (for the queried machine); it does not produce one row per remote host when scripting multiple machines. Loop with for and redirect to a single accumulating CSV.
  4. Credentials in plaintext on the command line — avoid /P password in scripts visible to other users; use runas or PowerShell's Get-Credential instead.
  5. Output encoding — the default output uses the system OEM code page; redirect to a file with > file.txt and open with the matching encoding in your editor.
  6. Hotfix list is locale-formatted — install dates appear as mm/dd/yyyy on US English systems and dd/mm/yyyy elsewhere. Always sort by Get-HotFix InstalledOn (DateTime) for cross-locale scripts.
  7. Hyper-V Requirements disappears when Hyper-V is enabled — once the hypervisor runs, the field changes to a single warning line. Don't write parsers that assume the four sub-fields are always present.
  8. Available Physical Memory is a snapshot — the value is the moment of the WMI call; for trending use logman or Get-Counter \Memory\Available MBytes.
  9. Network adapter info omits disabled NICssysteminfo only lists NICs in Up or Disabled but bound state; use Get-NetAdapter for a complete list.
  10. CSV row countingsysteminfo /FO CSV always has exactly two lines (header + data). Tools like Power BI's "first row contains header" toggle work correctly out of the box.

Real-world recipes

Inventory OS build across a list of machines

cmd
@echo off
echo "Host","OS Version","Total RAM" > inventory.csv
for /f "delims=" %%h in (hostlist.txt) do (
    for /f "tokens=1,3,10 delims=," %%a in (
        'systeminfo /S %%h /FO CSV /NH 2^>NUL'
    ) do echo %%a,%%c,%%j >> inventory.csv
)

Output: (inventory.csv written with one row per host)

Check whether a specific hotfix is installed

cmd
systeminfo | findstr "KB5034441"

Output:

csharp
                           [03]: KB5034441

Get uptime from boot time

cmd
systeminfo | findstr /B /C:"System Boot Time"

Output:

sql
System Boot Time:          28/04/2026, 06:30:00

Export full system report for a support ticket

cmd
systeminfo > %TEMP%\sysinfo_%COMPUTERNAME%_%DATE:~-4,4%%DATE:~-10,2%%DATE:~-7,2%.txt
echo Report saved to %TEMP%

Output:

css
Report saved to C:\Users\alicedev\AppData\Local\Temp

Full PowerShell fleet inventory

A one-liner fleet inventory using Get-ComputerInfo over Invoke-Command — the modern way.

powershell
$hosts = Get-Content C:\Audit\hostlist.txt
$report = foreach ($h in $hosts) {
    try {
        $info = Invoke-Command -ComputerName $h -ScriptBlock {
            Get-ComputerInfo -Property CsName, OsName, OsVersion,
                CsTotalPhysicalMemory, CsNumberOfLogicalProcessors,
                OsLastBootUpTime
        } -ErrorAction Stop
        [PSCustomObject]@{
            Host      = $info.CsName
            OS        = $info.OsName
            Build     = $info.OsVersion
            RAM_GB    = [math]::Round($info.CsTotalPhysicalMemory/1GB,1)
            Cores     = $info.CsNumberOfLogicalProcessors
            Uptime    = (Get-Date) - $info.OsLastBootUpTime
            Reachable = $true
        }
    } catch {
        [PSCustomObject]@{
            Host      = $h
            OS        = ''
            Reachable = $false
        }
    }
}
$report | Export-Csv -NoTypeInformation C:\Audit\fleet.csv

Output: (CSV with one row per host)

Build-number drift detection

A common audit question: are all machines on the latest patch tuesday build?

powershell
$expected = '10.0.26100'
Get-Content hostlist.txt | ForEach-Object {
    $os = (Get-CimInstance -ComputerName $_ Win32_OperatingSystem).Version
    [PSCustomObject]@{
        Host    = $_
        Build   = $os
        Current = ($os -eq $expected)
    }
} | Where-Object { -not $_.Current }

Output:

sql
Host  Build      Current
----  -----      -------
srv03 10.0.22621 False

Daily inventory CSV with retention

powershell
$dir  = 'D:\Inventory\daily'
$file = Join-Path $dir "inv_$(Get-Date -Format yyyy-MM-dd).csv"
New-Item -ItemType Directory -Force -Path $dir | Out-Null

systeminfo /FO CSV > $file
Get-ChildItem $dir -Filter 'inv_*.csv' |
    Where-Object LastWriteTime -lt (Get-Date).AddDays(-30) |
    Remove-Item

Decode "OS Configuration" to a friendly role

The default text values are awkward; map to a one-word label for dashboards.

powershell
$role = switch -Wildcard ((Get-ComputerInfo).CsDomainRole) {
    'StandaloneWorkstation' { 'Workstation' }
    'MemberWorkstation'     { 'Workstation' }
    'StandaloneServer'      { 'Server' }
    'MemberServer'          { 'Server' }
    'BackupDomainController'{ 'DC' }
    'PrimaryDomainController' { 'DC' }
    default                 { 'Unknown' }
}
"$($env:COMPUTERNAME): $role"

Output: MYHOST: Workstation

Smoke test after a Windows Update

After Patch Tuesday, run a quick "did boot succeed?" check.

cmd
@echo off
systeminfo | findstr /B /C:"System Boot Time"
wevtutil qe System /q:"*[System[(EventID=6005 or EventID=6009) and TimeCreated[timediff(@SystemTime) <= 3600000]]]" /c:5 /rd:true /f:text

Output:

yaml
System Boot Time:          5/25/2026, 06:30:00
Event[0]:
  Event ID: 6005
  Description: The Event log service was started.

Sources