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

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.