How to Get HP BIOS Settings Using PowerShell

Rebooting into F10 setup to check one BIOS option gets old fast. HP business PCs expose those options to Windows, so we can read them from a PowerShell window instead.

Quick answer: to get HP BIOS settings using PowerShell, run Get-CimInstance against the HP_BIOSEnumeration class in the root\HP\InstrumentedBIOS namespace from an elevated session. Each setting comes back with its name, current value and allowed values:

Get-CimInstance -Namespace root\HP\InstrumentedBIOS -ClassName HP_BIOSEnumeration |
    Select-Object -Property Name, CurrentValue

To keep a real machine’s firmware details private, our runnable steps use a sample export shaped exactly like HP_BIOSEnumeration output, tested in PowerShell 7.6 and Windows PowerShell 5.1.

What You Need Before You Start

You need an HP PC whose BIOS publishes the HP WMI provider (most HP business desktops, laptops and workstations do) and PowerShell opened with Run as administrator. A standard session gets Access denied. If you only need the firmware release, getting the BIOS version with Win32_BIOS works on any brand without elevation.

Step 1: Query the HP BIOS WMI Classes

HP_BIOSSetting is the base class, and Get-CimInstance returns its child classes too (HP_BIOSString, HP_BIOSInteger, HP_BIOSOrderedList, HP_BIOSPassword) unless you add -Shallow. Most audits only need HP_BIOSEnumeration, which adds CurrentValue and PossibleValues. Save it to JSON once and work offline:

Get-CimInstance -Namespace root\HP\InstrumentedBIOS -ClassName HP_BIOSEnumeration |
    Select-Object -Property Name, CurrentValue, PossibleValues, IsReadOnly, RequiresPhysicalPresence |
    ConvertTo-Json | Set-Content -Path .\HP\bios-settings.json

IsReadOnly and RequiresPhysicalPresence come back as 0 or 1. A 1 in RequiresPhysicalPresence means someone must confirm the change at the keyboard on the next boot. For general hardware details, see getting computer information with PowerShell.

Step 2: List All HP BIOS Settings

Load the export with ConvertFrom-Json and show the name and current value of each setting:

$settings = Get-Content -Path .\HP\bios-settings.json -Raw | ConvertFrom-Json
"Settings found: $($settings.Count)"
$settings | Format-Table -Property Name, CurrentValue

Output:

Settings found: 6

Name                            CurrentValue
----                            ------------
Fast Boot                       Disable
Secure Boot                     Enable
TPM State                       Enable
USB Storage Boot                Enable
Virtualization Technology (VTx) Enable
Wake On LAN                     Boot to Network
PowerShell list HP BIOS settings and current values from a JSON export
Six HP BIOS settings and their current values from the sample export (PowerShell 7)

A real HP PC returns far more settings. More on loading JSON in reading a JSON file into an array.

Step 3: Find One Setting and Its Allowed Values

Where-Object with -like is case-insensitive, so ‘*boot*’ matches every boot-related option. Joining PossibleValues shows what each setting accepts:

$settings = Get-Content -Path .\HP\bios-settings.json -Raw | ConvertFrom-Json
$settings | Where-Object Name -like '*boot*' |
    ForEach-Object { '{0} = {1} (options: {2})' -f $_.Name, $_.CurrentValue, ($_.PossibleValues -join ', ') }

Output:

Fast Boot = Disable (options: Disable, Enable)
Secure Boot = Enable (options: Disable, Enable)
USB Storage Boot = Enable (options: Disable, Enable)

Check PossibleValues before scripting a change, since HP spells values its own way. The Where-Object filtering guide covers more operators.

Step 4: Export HP BIOS Settings to CSV