BIOS Configuration

Athena shows the BIOS / UEFI settings of your Windows machines. You do not need to install a vendor tool or go to each machine. The Windows agent reads every attribute from the vendor's built-in firmware provider on HP, Dell (2018 and newer) and Lenovo business hardware. It records the current value, the legal values and the vendor's flags, plus which BIOS passwords are set. The server combines these reports into a model catalog that lists the settings each hardware model offers. You can then define BIOS baselines: the values you want for chosen settings on a vendor and model. Athena shows which machines have drifted from them, and an Admin can remediate a drifted machine: send it the baseline's values, which take effect at its next restart. An Admin can also set, change or remove the BIOS administrator password on one machine or many. Athena records which stored credential holds each machine's current password. Everything runs between your Athena server and its agents, so it works on an air-gapped network.

Scope
  • Nothing is written by itself. A baseline only sets the values to compare against. Saving one re-checks drift on the server and sends nothing to any machine. BIOS settings change only when a user clicks Remediate on one drifted machine (or calls the matching REST route). The BIOS administrator password changes only when an Admin sends a Set BIOS password request. Athena installs nothing on the machine to read or write the settings.
  • Windows agents only. Linux and macOS agents are not read. The REST API and PowerShell report them as NotSupported with the reason "BIOS settings are collected on Windows agents only."
  • Vendor hardware only. The read needs the vendor's firmware provider: HP, Dell 2018 and newer, or Lenovo. Virtual machines, whitebox PCs, consumer models and older Dell hardware show Not supported. That is expected, not an error.
  • A licensed module. Your licence must include the BIOS module (module.bios). Without it, the BIOS page, the agent section and the BIOS REST endpoints go away, and Athena sends no read requests to agents. See Separately licensed modules.
  • Up-to-date Windows agent. Only agent builds that include BIOS collection can answer. Keep your agents current with agent updates.

Where it appears#

Permissions

PermissionAllowsBuilt-in roles
View BIOS settings (bios.view)See each agent's BIOS settings, the model catalog, the baselines and their drift, and ask an agent to read its settings again.Helpdesk, Operator, Admin
Manage BIOS baselines (bios.baselines.manage)Create, edit, turn on or off, and delete baselines. Saving only re-checks drift. Nothing is written to any machine.Operator, Admin
Remediate BIOS settings (bios.remediate)Write a baseline's drifted attributes to a machine through the vendor's firmware interface (Remediate). Changes take effect at the next restart. Using a stored BIOS password also needs Use stored credentials (credentials.use).Admin
Set BIOS administrator password (bios.password)Set, change or remove a machine's BIOS administrator password through the vendor's firmware interface, and see which credential is escrowed as its current password (BIOS administrator password). Also needs Use stored credentials (credentials.use).Admin

Without bios.view, the Policies entry, the landing card and the agent section are hidden, and the REST endpoints return 403. With bios.view but without bios.baselines.manage, the Baselines table and editor are read only. The editor shows "Read only: managing baselines needs the Manage BIOS baselines permission." Both permissions need the BIOS module licence. Without bios.remediate, the Remediate button is not shown. See Permission Model and the remediation permissions.

When settings are read#

The server asks a Windows agent for a new read in three cases:

TriggerWhat happens
Agent check-inWhen an agent connects, the server asks for a read unless the last report is less than 1 hour old. After a server restart, when all agents reconnect at once, only agents with older data are asked again.
Daily refreshEvery 60 minutes a sweep asks each connected agent whose report is missing or at least 24 hours old. The oldest reports go first. Each sweep asks at most 500 agents, and the next sweep continues where it stopped.
Collect nowA user clicks Collect now on the agent's BIOS section or on a drifted agent in BIOS compliance, or calls the refresh endpoint.

The agent allows 120 seconds for a read. If it takes longer, the agent reports "The BIOS read timed out." Offline agents are not asked. They are read on their next check-in. A normal read does not write an audit log entry, because a machine can have a couple of hundred settings every day.

You can change the daily sweep in appsettings.json (or with the matching environment variables):

KeyDefaultMeaning
Modules:Bios:Refresh:SweepMinutes60How often the sweep runs (minimum 1).
Modules:Bios:Refresh:MaxAgeHours24When a report is old enough to read again (minimum 1).
Modules:Bios:Refresh:MaxPerSweep500The most agents asked in one sweep (minimum 1).

For example, the environment variable Modules__Bios__Refresh__MaxAgeHours=12 keeps reports at most about half a day old. See Configuration. The 1-hour check-in limit is fixed.

Agent details → BIOS#

The BIOS section of a Windows agent is in one of four states:

StateWhat you see
Not reported yet"This agent has not reported its BIOS settings yet. They are read when the agent checks in and once a day; use Collect now to ask now."
ReportingThe Firmware card with the machine facts, the Applied baseline card when a baseline applies, and the Attributes card with the full settings table (below).
Not supportedThe machine has no vendor BIOS provider. The section says this is expected for VMs, whiteboxes, consumer or pre-2018 hardware. It is not an error.
Read failedA vendor provider exists, but the read failed: "The agent could not read its BIOS settings: …" with the reason. The settings from earlier reads are not kept.

Firmware card

Applied baseline card

When an enabled baseline applies to the machine, the Applied baseline card names it (a link to the baseline) and says which read it was evaluated against. Chips count the managed attributes: N drifted, N compliant and N not applicable. Fleet compliance → opens the fleet view. When the machine has drifted and you hold bios.remediate, a Remediate button sits beside the chips (see Remediating drift). After a remediation, a Last remediation card shows the result per attribute. When no baseline applies, the Attributes card says "No enabled baseline matches this vendor and model, so nothing is evaluated." with a Baselines → link.

The settings table

ColumnContent
AttributeThe vendor's exact attribute name. If the vendor gives a menu path, it is shown underneath.
CurrentThe value the firmware reports now. (empty) means the firmware returned no value. Withheld by the agent means the value was not sent (see below).
DesiredOnly when a baseline applies: the value the baseline asks for. Empty for attributes the baseline does not manage.
Legal valuesFor a list setting, its choices. For a number, its range (for example 0 – 100). For a text setting, its length (for example text, 0-32 characters). For an ordered list, its items. Empty if the firmware does not say.
Flagsread-only and physical presence, as the vendor reports them.
StateOnly when a baseline applies: Compliant, Drifted, Not applicable or Not in baseline. See How drift is decided.

When a baseline applies, drifted rows come first, then not-applicable, compliant and unmanaged rows. If the baseline manages an attribute this firmware does not have, the table still shows it as a Not applicable row with the note "Not in this firmware's attributes (<model>, BIOS <version>): not applicable, never drift."

Use Search attributes or values to filter by attribute name, menu path or current value. The Group list filters by the first part of the vendor's menu path. When a baseline applies, a State list filters by row state. The counter shows how many rows match and how many attributes the agent reported. The Collect now button sends a read request. The section updates by itself when the answer arrives, usually within seconds. If the agent cannot be asked, a message tells you why:

MessageMeaning
Asked the agent to read its BIOS settings. The table refreshes when the answer arrives.The request was sent.
The agent is not connected.The agent is offline. It is read on its next check-in.
BIOS settings are collected on Windows agents only.A Linux or macOS agent.
BIOS configuration is not licensed on this server.Your licence does not include module.bios.
Reading the values correctly

Current is what the firmware reports right now. On HP, a successful BIOS change appears here only after the machine's next restart. The Read-only and Physical presence flags come from the vendor and are for information only. On HP, for example, Secure Boot was enabled remotely without a prompt, even though its setting carries the physical-presence flag.

Values the agent withholds

Some firmware, HP in particular, shows secrets as plain text settings: upload-server passwords, access and signing keys, and the OEM product key. The agent never sends the value of a text or ordered-list setting whose name contains password, passphrase, secret, key/keys, digital marker or username. These rows show Withheld by the agent. List and number settings are never withheld, because their values come from the vendor's published choices and ranges. The agent's own log records only the vendor and the number of settings, never a value.

Policies → BIOS: the model catalog#

The BIOS Configuration page starts with a status bar: Drift evaluation on, the number of baselines, the number of models catalogued, Last evaluated with a time, and Fleet compliance →. Below it, a switch selects Model catalog or Baselines. The page updates by itself when an agent reports or a baseline changes.

The Model catalog is built from the reports. Each vendor and model that reports gets its own list of settings, with the vendor's exact attribute names and legal values. Use it to see which settings each model offers before you plan a change. The model table shows:

ColumnContent
Vendor / ModelFor example HP / HP ProBook x360 435 G7. A supported machine that does not report its model is listed as (unknown).
AttributesHow many settings the model exposes.
AgentsHow many agents report this model.
BIOS versionsEvery BIOS version seen on this model across the fleet.
First seen / Last seenWhen the model first and most recently reported. A model that has not reported for 30 days shows a Stale — N days chip.

Click the model name or the view button (Show this model's attributes) to open a model. No model opens by itself. The detail has a model picker and lists each Attribute (with its menu path), its Type (Enumeration, String, Integer, OrderedList), Legal values, Flags and Last seen. You can search by attribute name, legal value or path.

A setting that has been missing from the model's newest report for 30 days is marked stale, because a BIOS update can rename or remove a setting. Stale settings are shown, not hidden. Machines without a vendor provider never appear in the catalog. They count as Not supported.

Baselines#

A baseline lists the values you want for chosen BIOS settings on one vendor's hardware. It uses the firmware's own attribute names and values, taken from the model catalog. Athena does not translate settings between vendors: the same feature has a different name on HP, Dell and Lenovo, so each baseline is for one vendor and a model match.

A baseline is desired state only. Saving, turning on or off, or deleting it re-checks drift on the server from the values agents already reported. Nothing is sent to any machine, and no BIOS setting is changed.

The Baselines table

Open Policies → BIOS and choose Baselines. Each row shows:

ColumnContent
BaselineThe name (a link to the editor), the description and the number of attributes it manages.
Vendor / Model matchWhich machines it is for.
EnabledA check box. Turning it on or off takes effect at once. The toast says "Baseline enabled - drift is evaluated." or "Baseline disabled - it is skipped during evaluation."
AgentsHow many agents this baseline governs now.
ComplianceA bar and the label N ok · N drifted · N unknown, linking to BIOS compliance. A disabled baseline shows Disabled - not evaluated. A baseline that governs no agent shows a Matches 0 agents warning with Not "all compliant" - nothing is evaluated.

With bios.baselines.manage, the table has a New baseline button and, on each row, Edit baseline and Delete baseline. Delete asks for confirmation: "Delete this baseline and its desired values? Its agents stop being evaluated against it. Nothing is written to any machine." Without the permission, each row has a View baseline button.

Creating or editing a baseline

  1. In the Baselines view, click New baseline. The editor opens at /policies/bios/baselines/new. An existing baseline opens at /policies/bios/baselines/<id>.
  2. In the Baseline card, enter a Name, choose a Vendor (HP, Dell, Lenovo, or another vendor your fleet has reported), and enter the Model match (see below). Add a Description if you want, and leave Baseline enabled on. "Disabled baselines are not evaluated."
  3. Check the hint under the model match. It shows how many reporting agents and which catalogued models the match covers. If it covers none, it warns "Matches 0 agents - this looks exactly like full compliance." and may suggest a match, for example "The fleet reports HP ProBook x360 435 G7; did you mean HP ProBook*?"
  4. Click Edit attributes to open Advanced - raw attributes. This lists every attribute of one catalogued model of the vendor (pick the model at the top). Tick an attribute to manage it, then choose its desired value. List settings offer only their legal values. Numbers are limited to the reported range, and text to the reported length. A ticked attribute starts with the value most of that model's agents report, if that value is legal. Use the search box and Managed only to find attributes, then click Done.
  5. Back in the editor, the Managed attributes table shows each attribute's Desired value, Legal values and Fleet value: the most common value that model's agents report now, how many agents report it, and how many other values exist.
  6. Save. The toast says "Baseline saved. Drift re-evaluated; nothing was written to any machine."

Changing the vendor clears the attributes you picked, because one vendor's attribute names mean nothing on another vendor's hardware. If the vendor has no catalog yet, the editor says so: the catalog fills itself the first time an agent of that vendor reports.

Model match

What a baseline may contain

The editor, the REST API and every other client use the same rules. A save is refused with a message when:

RuleMessage
A name is required, up to 200 characters. Names are unique, ignoring case."A baseline needs a name." / "Another baseline already has this name."
The description is at most 500 characters."The description is too long."
A model match is required, up to 200 characters, with at most one *, at the end."The model match may contain one * and only at the end."
At least one attribute is managed."Pick at least one attribute to manage (Edit attributes)."
At least one catalogued model of the vendor matches, so the names can be checked."No catalogued model of this vendor matches the model match, so its attributes cannot be checked."
Each attribute exists on a catalogued model the match covers."'<name>' is not an attribute of any catalogued model this baseline matches."
Read-only attributes, ordered lists (such as boot order) and attributes the agents withhold cannot be managed. So a baseline never stores a secret."'<name>' cannot be managed: it is read-only, an ordered list, or a value the agents withhold."
Each desired value is legal on every covered model that has the attribute: one of the listed values, inside the number range, or inside the text length."The desired value of '<name>' is not one the firmware accepts."

The rules use the current catalog. If a BIOS update changes a model's legal values, a saved baseline can fail its own rules the next time it is saved, and that includes turning it on or off. The message names the attribute to fix.

How drift is decided#

Drift is worked out on the server each time a page, the API or a monitor reads it. Athena compares the values each agent last reported with the current baselines. No result is stored, so a saved baseline applies the moment anyone looks, and an old result can never be shown. Agents need no update for baselines.

Each managed attribute gets one state:

StateWhen
CompliantThe reported value equals the desired value. Values are compared exactly (case matters), ignoring leading and trailing spaces. Two whole numbers are compared as numbers, so 05 equals 5.
DriftedThe reported value is different.
Not applicableThe machine's latest read does not have the attribute (for example, a BIOS update removed it) or withheld its value. Never counted as drift.
Not in baselineReported by the machine but not managed by its baseline (agent tab only).

Each agent gets one compliance state:

StateWhen
CompliantA baseline applies, nothing drifted, and at least one attribute could be compared.
DriftedAt least one managed attribute drifted.
UnknownA baseline applies, but nothing could be compared: the last read failed, or every managed attribute is not applicable. Never counted as non-compliant.
No baselineThe machine reports, but no enabled baseline matches its vendor and model.
Not supportedA Linux or macOS agent, or a Windows machine with no vendor BIOS provider. Neutral, never drift.
Not reportedA Windows agent that has never sent a BIOS read.

BIOS compliance (fleet view)#

Fleet compliance → opens BIOS compliance. It covers every agent that has sent a BIOS read. Windows agents that never reported, and Linux and macOS agents, are not listed. The page updates by itself when an agent reports or a baseline changes. Edit baselines returns to the Baselines table.

Remediating drift#

Remediate sends one drifted machine the desired values of its governing baseline. The Windows agent writes them through the vendor's firmware interface: HP's BIOS setting interface, Dell's BIOS attribute interface, or Lenovo's set-and-save BIOS settings interface. The firmware queues the new values, and they take effect at the machine's next restart. Athena does not restart the machine for you. Plan the restart yourself, for example with an agent restart or the user's next reboot.

Remediating a machine

  1. Open the machine's Agent details → BIOS section and find the Remediate button beside the drift chips on the Applied baseline card. Or open BIOS compliance, select a model and use the Remediate button on a drifted agent's row. Its tooltip reads "Remediate: write this machine's drifted attributes".
  2. The Remediate BIOS settings dialog lists what will be written, for example "Writes 2 drifted attributes of baseline 'ProBook fleet - Secure Boot' to PC-5CG1013QPH:", with each attribute as current → desired.
  3. Under BIOS password, choose the stored credential that holds the machine's BIOS setup password, or No BIOS password set for a machine without one (see BIOS passwords). If Athena holds a confirmed escrowed administrator password for the machine, that credential is selected for you. Otherwise No BIOS password set is selected. The Firmware card shows whether the machine has a BIOS password set.
  4. Click Remediate. On success the toast reads "Sent 2 attributes to PC-5CG1013QPH. They take effect at the next restart."
  5. Restart the machine. The agent reads its BIOS again when it checks in after the restart, and the Last remediation card and the drift update.

If nothing was sent, the toast says why:

MessageMeaning
"Nothing to remediate: no attribute is drifted."The machine is compliant, has no baseline, has not reported, or is Unknown. There is nothing to send.
"The agent is not connected. Nothing was sent."The agent is offline.
"This machine has no vendor BIOS provider."The machine is Not supported (not Windows, or no HP, Dell or Lenovo provider).
"The BIOS password credential was not found."The chosen credential no longer exists, is inactive, is not a Secret credential, or could not be decrypted.
"Using a stored credential requires the 'Use stored credentials' permission."You chose a credential but your role lacks credentials.use.
"BIOS configuration is not licensed on this server."The licence does not include module.bios.

Safety rules on the machine

Before it writes anything, the agent reads the BIOS again and checks each attribute:

BIOS passwords

If the machine has a BIOS setup password, the firmware rejects writes without it. Athena takes the password from the encrypted credential store at the moment of the send. It goes only to that one agent, over its encrypted connection. It is never stored in a baseline, a log or the audit trail. The audit trail records only the credential's name.

Permissions for remediation

To…You need
See the Remediate button and remediate a machine with no BIOS passwordbios.view and bios.remediate
Use a stored BIOS passwordAlso credentials.use. Without it the dialog says "Without the 'Use stored credentials' permission, only a machine with no BIOS password can be remediated."
Upload an HP password file from the dialogAlso credentials.use and credentials.manage

The built-in Admin role has all of these. Operator and Helpdesk cannot remediate. To let another group remediate, give a custom role these permissions. Every permission is checked again when you click Remediate.

The Last remediation card

The agent's BIOS section keeps the latest remediation of that machine. A new one replaces it. The card's subtitle reads "Baseline '<name>' · sent by <user> at <time>", and the table lists each attribute with its Desired value, its Result and a Detail (the agent's message and the vendor's return code).

ResultMeaning
SentSent to the agent. No answer yet.
Pending restartThe firmware accepted the value ("Accepted by the firmware; takes effect at the next restart."). This is not proof, so it is never shown green.
AppliedA read right after the write already shows the new value, or the value was already set. Shown green.
VerifiedA BIOS read after the restart shows the desired value. Shown green.
FailedThe firmware or the agent refused the attribute. The detail gives the reason and the vendor code.
SkippedNot attempted: the attribute is read-only, or the value would disable Secure Boot.

While any attribute is Pending restart, the server asks the agent for a new BIOS read on every check-in, not only once an hour. A restart shows up as a reconnect, so the read after it turns Pending restart into Verified and updates drift. When an attribute is Applied at once, the server asks for a new read straight away.

Common firmware answers in the Detail column:

VendorCodeDetail
HP1 / 2 / 3 / 4 / 5 / 6Not supported by this firmware / Unspecified firmware error / The firmware timed out / The firmware refused the setting / Invalid parameter - the value is not one this firmware accepts / Access denied - the BIOS password is wrong or missing.
HP (password file)BCU <exit code>"HP BCU refused the setting (exit code …)." BCU 0 means accepted.
Dell1 / 2 / 3 / 4The firmware refused the setting / Invalid parameter - the value is not one this firmware accepts / Access denied - the BIOS password is wrong or missing / Not supported by this firmware.
LenovoThe text the firmware returnsAccess Denied gives "Access denied - the BIOS password is wrong or missing." Any other answer gives "The firmware refused the setting (…)."

BIOS administrator password#

An Admin can set, change or remove the BIOS administrator password of a Windows machine from Athena. The agent uses the vendor's built-in firmware interface, so nothing is installed on the machine. The new and current passwords are Secret credentials in the credential store. Athena reads them when it sends the request and passes them only to that agent, over its encrypted connection. They are never written to a log or the audit trail. For each machine, Athena also escrows which credential holds the current administrator password. Later password changes and remediations use that credential by default.

Keep the credential

If the current password you give is wrong, nothing changes. If the new password is lost, every later BIOS change on that machine is locked until someone types the password at the machine. Do not delete or change a Secret credential that is escrowed as a machine's password.

Setting or changing the password

  1. Create the new password as a Secret credential: Credentials → New Credential, Type Secret, a name, and the password (see BIOS passwords).
  2. Open the dialog:
    • One machine: in Agent details → BIOS, the BIOS administrator password card has a key button with the tooltip "Set, change or remove the BIOS administrator password".
    • Many machines: in BIOS compliance, select one of the Compliant, Drifted or Unknown figures to list those agents. Tick the agents (or the header box for all), then click Set BIOS password. The Not supported list has no selection.
  3. In the BIOS administrator password dialog, choose an Action: Set or change, or Remove.
  4. For Set or change, pick the New password credential.
  5. Choose the Current password:
    • Escrowed: <name> (the default) uses the machine's confirmed escrowed credential. When nothing is escrowed it reads "Escrowed (nothing escrowed: none set)", and Athena treats the machine as having no password. For many machines it reads "Each agent's escrowed password (none escrowed: none set)": each machine uses its own escrow.
    • None set: the machine has no administrator password now.
    • A Secret credential: the password the machine has now, if it is not the escrowed one.
  6. Read the warning and click Set password or Remove password. The toast reads "Sent to <host>. The escrow moves when the agent confirms." For many machines it reads "Sent to N agents. Each answers with its own verified result.", or "Sent to N of M agents. Not sent: …" with a count for each reason.

The change does not need a restart. When the agent answers, the server asks it for a new BIOS read, so the Firmware card's BIOS password line updates straight away. Without credentials.use, the dialog shows "Changing a BIOS password needs the 'Use stored credentials' permission." and cannot send.

If nothing was sent, the toast (or the REST outcome) says why:

OutcomeMessage
NotConnected"The agent is not connected. Nothing was sent."
NotSupported"No supported BIOS read (not Windows, never reported, or no vendor provider)."
InProgress"A password change is still waiting for its answer." A request with no answer blocks the next one on that machine for 10 minutes.
InvalidRequest"Pick the new password credential." Set needs a new-password credential. Remove takes none.
CredentialNotFound"The password credential was not found." The credential is missing, inactive or not a Secret.
CredentialNotAllowed"Using a stored credential requires the 'Use stored credentials' permission."
PasswordFileNotAllowed"An HP password file cannot be used here; pick a plain password credential."
NotLicensed"BIOS configuration is not licensed on this server."
NotFound"Agent not found."

What the agent checks

ResultMeaningVendor answers
SucceededThe firmware took the change and the flag confirms it.HP and Dell 0; Lenovo Success
WrongPassword"Access denied - the current BIOS password is wrong."HP 6, Dell 3, Lenovo Access Denied
Rejected"The firmware refused the new password (password policy, length or characters)."HP 4 / 5, Dell 1 / 2, Lenovo Invalid Parameter, or a Lenovo password with a character it cannot carry
NotSupportedThe firmware cannot do this through its interface, or it is a first Lenovo supervisor password.HP 1, Dell 4, Lenovo Not Supported
UnverifiedThe firmware said OK but the flag did not move (see above).—
FailedAny other error. HP 2 is an unspecified firmware error and 3 a timeout. Lenovo System Busy reads "The firmware is busy with pending changes; restart the machine and try again."Other codes

The escrow card

The BIOS administrator password card on Agent details → BIOS shows "Which credential Athena holds as this machine's current administrator password." It holds the credential's name, never the password.

StateMeaning
PendingSent, no answer yet. The escrowed credential is unchanged.
ConfirmedThe agent reported Succeeded. The escrow now names the new credential, or none after a removal. The only state shown green.
FailedThe firmware or the agent refused, or the agent was offline. The escrowed credential is unchanged.
UnverifiedThe firmware said OK but did not confirm it. The escrowed credential is unchanged. Restart and read the BIOS again, and check which password works before you rely on either.

Only the answer to the latest request moves the escrow. A late or repeated answer to an older request is ignored.

Alerting on BIOS drift#

BIOS compliance adds four module fields that you can use in monitors, dynamic collections, tagging rules and reports. They use the same evaluation as the pages, so a machine never reads one way on its tab and another way in a monitor.

Field pathDisplay nameTypeValue
Module.bios.ComplianceStateBIOS compliance stateEnumCompliant, Drifted, Unknown, NoBaseline, NotSupported or NotReported.
Module.bios.CompliantBIOS compliantBooleantrue only for Compliant.
Module.bios.DriftCountBIOS drifted attributesNumberHow many managed attributes drifted.
Module.bios.BaselineNameBIOS baselineStringThe baseline that governs the machine. Empty when none does.

For example, a monitor on Module.bios.ComplianceState · Equals · Drifted alerts on exactly the machines whose BIOS differs from their baseline. Every field except BaselineName always has a value, including on Linux and macOS agents (NotSupported).

Audit log#

Every baseline create, update and delete writes a bios.baseline-changed event (shown as BIOS baseline changed) at Information severity. The action is Create, Update or Delete. The description names the baseline, vendor, model match, attribute count and whether it is enabled, and ends with "Nothing was written to any machine." The event details list every managed attribute with its desired value. Turning a baseline on or off is recorded as an Update. Normal BIOS reads are not audited. See Audit Event Types.

Remediation and the administrator password write four more events:

Event typeShown asWhen
bios.remediation-requestedBIOS remediation sentA user sent a remediation. Severity Warning, action Remediate, recorded under the user who sent it. The description names the attribute count, the baseline, the machine and the BIOS password credential (or says "with no BIOS password"). The details list every attribute with its current and desired value. The password is never recorded.
bios.remediation-resultBIOS remediation resultThe agent answered. User system, action RemediateResult. Information when nothing failed. Warning, recorded as failed, when any attribute failed or the agent reported an error. The description counts the outcomes and notes "BitLocker suspended for one restart" when it was. The details list each attribute's outcome, return code and message.
bios.password-requestedBIOS password change sentA user sent a password change. Severity Warning, action SetBiosPassword or RemoveBiosPassword, recorded under the user who sent it. The description names the machine, the new credential and the current one (marked (escrowed) when the escrow supplied it), or says "current password: none set." Not written when nothing was sent.
bios.password-resultBIOS password change resultThe agent answered. User system, action BiosPasswordResult. Information on Succeeded. Warning, recorded as failed, for any other result. The description gives the result, the vendor code and where the escrow now points, for example "Escrow: 'BIOS 2026'." or "Escrow unchanged: …".
Baselines stay on their server

BIOS baselines are not copied by Settings Sync. If you run more than one Athena server, create the baselines on each one.

PowerShell#

The Athena PowerShell module has two read cmdlets. Run Connect-Athena first. Both need bios.view and the BIOS module licence. There are no cmdlets for baselines, compliance or remediation yet. Use the REST API for those.

CmdletParametersReturns
Get-AthenaBiosSetting-AgentId (alias -Id, mandatory, accepts pipeline input by property name), -Name (attribute filter, wildcards), -SummaryOne object per attribute (current value, type, legal values, flags, with the agent's id and hostname). With -Summary: the agent view (status, vendor, model, BIOS version, passwords) instead. A non-Windows or unsupported agent has status NotSupported and no attributes.
Get-AthenaBiosCatalognone, or -Vendor, -Model (the exact model string as listed), -Name (wildcards)With no parameters: every model the fleet has reported. With -Vendor and/or -Model: that model's catalog rows. -Name needs -Vendor or -Model.
# The Secure Boot related attributes of one machine
Get-AthenaAgent -Hostname PC-5CG1013QPH | Get-AthenaBiosSetting -Name '*Secure Boot*'

# Status, model and BIOS password state of one machine
Get-AthenaAgent -Hostname PC-5CG1013QPH | Get-AthenaBiosSetting -Summary

# Every model the fleet has reported, then the 2023 CA switches of one HP model
Get-AthenaBiosCatalog
Get-AthenaBiosCatalog -Vendor HP -Model 'HP ProBook x360 435 G7' -Name '*CA 2023*'

REST API#

Every route needs a bearer token (see API Reference) with bios.view, and returns 403 when the licence does not include module.bios. Responses use the standard success / data / message envelope. JSON is camelCase. Status, state and type values are sent as numbers, counted from 0 in the order listed on this page. For example, agent status is 0 NeverReported, 1 Supported, 2 NotSupported, 3 Error. The refresh outcome is 0 Sent, 1 NotLicensed, 2 NotSupported, 3 NotConnected, 4 NotFound. The setting type is 0 Enumeration, 1 String, 2 Integer, 3 OrderedList, 4 Unknown.

Method & routePurpose
GET /api/agents/{agentId}/bios-settingsThe agent view: agentId, hostname, status (NeverReported, Supported, NotSupported, Error), reason, and state. state is null until the agent has reported. It holds vendor, model, BIOS version, passwords (name, isSet), collectedAt and settings. 404 "Agent not found." for an unknown id.
POST /api/agents/{agentId}/bios-settings/refreshAsks the agent to read now. data is the outcome even when it fails: Sent (success), or NotConnected, NotSupported, NotLicensed with success: false and the matching message. 404 for an unknown agent. The new report arrives a few seconds later. Read it with the GET above.
GET /api/bios/catalog/modelsEvery model: vendor, model, settingCount, agentCount, biosVersions, firstSeen, lastSeen.
GET /api/bios/catalog?vendor=&model=Catalog rows, optionally limited to one vendor and/or model (exact match, case-insensitive): name, type, possible values, flags, path, length or range limits, last BIOS version, first and last seen.
GET /api/bios/fleetFleet coverage: supported, notSupported, error agent counts. Agents that never reported are not counted.
curl -k -X POST -H "Authorization: Bearer <token>" \
  https://athena.example.local:8443/api/agents/<agent-id>/bios-settings/refresh

Baselines and compliance

Reads need bios.view. Create, replace and delete also need bios.baselines.manage. None of these routes sends anything to an agent.

Method & routePurpose
GET /api/bios/baselinesEvery baseline with the agents it governs now: baseline, agents, compliant, drifted, unknown. A baseline that governs no agent has agents: 0.
GET /api/bios/baselines/{id}One baseline: id, name, description, vendor, modelMatch, enabled, settings (attribute name → desired value), and who created and last updated it, and when. 404 "Baseline not found."
POST /api/bios/baselinesCreates a baseline. Body: name, description, vendor, modelMatch, enabled, settings. 400 when a rule is broken: message explains it and errors[0] holds the rule code (for example IllegalValue). 409 "Another baseline already has this name."
PUT /api/bios/baselines/{id}Replaces the baseline. The body is the whole desired set, not a patch: attributes you leave out are removed. Same 400 / 409 answers, and 404 for an unknown id.
DELETE /api/bios/baselines/{id}Deletes the baseline and its desired values. message: "Baseline deleted. Nothing was written to any machine." 404 for an unknown id.
GET /api/agents/{agentId}/bios-complianceOne agent: state, vendor, model, BIOS version, reason, collectedAt, the governing baseline (id, name, modelMatch, or null), settings (each managed attribute's name, current, desired, state), and compliantCount, driftedCount, notApplicableCount. 404 "Agent not found."
GET /api/bios/complianceThe fleet view: evaluatedAt, baselineCount, modelCount, the totals compliant, drifted, unknown, notSupported, noBaseline, compliancePercent (null when nothing was evaluated), and models, each with its baseline and agents.

Agent compliance state: 0 Compliant, 1 Drifted, 2 Unknown, 3 NoBaseline, 4 NotSupported, 5 NotReported. Attribute state: 0 Compliant, 1 Drifted, 2 NotApplicable. A successful save returns the stored baseline with the message "Baseline saved. Drift re-evaluated; nothing was written to any machine."

curl -k -X POST -H "Authorization: Bearer <token>" -H "Content-Type: application/json" \
  https://athena.example.local:8443/api/bios/baselines \
  -d '{
        "name": "ProBook fleet - Secure Boot",
        "vendor": "HP",
        "modelMatch": "HP ProBook*",
        "enabled": true,
        "settings": {
          "Configure Legacy Support and Secure Boot": "Legacy Support Disable and Secure Boot Enable"
        }
      }'

Attribute names and values must be spelled exactly as the firmware reports them. Copy them from the model catalog (GET /api/bios/catalog?vendor=HP&model=…) rather than typing them.

Remediation

All routes need bios.view. Remediating and the password routes also need bios.remediate. Unlike the routes above, outcomes here are sent as strings (for example "Sent", "PendingReboot").

Method & routePurpose
POST /api/agents/{agentId}/bios-remediateSends the agent its drifted attributes now. Body: { "credentialId": "<guid>" } for a Secret credential holding the BIOS password. {} uses the machine's confirmed escrowed administrator password, or no password when none is escrowed. { "noPassword": true } sends no password, whatever is escrowed. data is { outcome, settings }, where settings is how many attributes were sent. Sent returns 200 with "Sent N drifted attribute(s). They take effect at the machine's next restart." NotConnected, NothingDrifted, NotSupported, CredentialNotFound and NotLicensed return 200 with success: false and the matching message. NotFound returns 404. CredentialNotAllowed (no credentials.use) returns 403.
GET /api/agents/{agentId}/bios-remediationThe agent's latest remediation, one item per attribute: name, desired, outcome (Sent, Applied, PendingReboot, Failed, Skipped, Verified), returnCode, message, baselineName, requestedBy, requestedAt, reportedAt. An empty list when the machine was never remediated.
GET /api/bios/password-credentialsThe Secret credentials a remediation can use: id, name, description. Never the secret.
POST /api/bios/password-filesStores an HP password file as a Secret credential. Also needs credentials.manage. Multipart form: name (required), file, optional description. 400 "A credential name is required.", "The password file is empty." or "An HP password file is at most 16 KB." 409 "A credential with this name already exists." Returns the new credential's id, name and description.
curl -k -X POST -H "Authorization: Bearer <token>" -H "Content-Type: application/json" \
  https://athena.example.local:8443/api/agents/<agent-id>/bios-remediate \
  -d '{ "credentialId": "<secret-credential-id>" }'

curl -k -H "Authorization: Bearer <token>" \
  https://athena.example.local:8443/api/agents/<agent-id>/bios-remediation

Administrator password

All routes need bios.view. The two POST routes also need bios.password, and credentials.use to read the passwords. Outcomes are sent as strings. A POST only sends the request. Read the agent's verified answer with the GET.

Method & routePurpose
POST /api/agents/{agentId}/bios-passwordSets, changes or removes one machine's administrator password. Body: mode ("Set" or "Remove"), newCredentialId (Set only), and optionally currentCredentialId or currentIsNone: true. Leave both out to use the machine's escrowed credential. data is { agentId, hostname, outcome }. Sent returns 200. NotFound returns 404, CredentialNotAllowed 403, InvalidRequest and PasswordFileNotAllowed 400. Every other outcome returns 200 with success: false.
POST /api/bios/passwordThe same change for many machines. Body: agentIds (1 to 500) plus the fields above. Each machine uses its own escrow when no current password is given. data is one result per agent. success is true only when every agent was sent ("Sent to N agent(s)."), otherwise "Sent to N of M agent(s); see each outcome." 400 "Pass between 1 and 500 agent ids."
GET /api/agents/{agentId}/bios-passwordThe machine's escrow: credentialId and credentialName (the confirmed current password, never its value), confirmedAt, state (Pending, Confirmed, Failed, Unverified), the latest request (pendingMode, pendingCredentialName, outcome, returnCode, message, requestedBy, requestedAt, reportedAt) and confirmedNone. data is null when the machine has no record.
curl -k -X POST -H "Authorization: Bearer <token>" -H "Content-Type: application/json" \
  https://athena.example.local:8443/api/agents/<agent-id>/bios-password \
  -d '{ "mode": "Set", "newCredentialId": "<new-secret-id>", "currentIsNone": true }'

curl -k -H "Authorization: Bearer <token>" \
  https://athena.example.local:8443/api/agents/<agent-id>/bios-password

Troubleshooting#

SymptomCause and fix
The agent shows Not supportedNo HP, Dell (2018 and newer) or Lenovo BIOS provider was found: a VM, a whitebox, a consumer model or older Dell hardware. This is normal and does not count as drift. Athena looks for the provider in the vendor's WMI namespace, not by the manufacturer name. On HP that is root\HP\InstrumentedBIOS, on Dell root\dcim\sysman\biosattributes, and on Lenovo the Lenovo_BiosSetting class in root\wmi.
Read failed with "<Vendor> BIOS WMI read failed: …"The provider exists but the query failed. Check the vendor's WMI provider on the machine (for example with Get-CimInstance against the namespace above), then click Collect now.
Read failed with "The BIOS read timed out."The read took more than 120 seconds. Lenovo reads each setting separately, so a slow machine can reach the limit. Try Collect now when the machine is less busy.
The section stays at "has not reported its BIOS settings yet"The agent is offline, or its build predates BIOS collection. Bring it online and update the agent, then click Collect now.
The BIOS menu, card and section are missingYour role lacks bios.view, or the licence does not include module.bios.
No New baseline button, or the editor is read onlyYour role lacks bios.baselines.manage (Operator and Admin have it).
A value you changed does not appearOn HP the firmware reports the new value only after a restart. The next check-in or daily read picks it up, or click Collect now after the restart. Drift for that machine updates as soon as the new read arrives.
A baseline shows Matches 0 agentsNo reporting machine matches its vendor and model match, or a more specific enabled baseline governs those machines instead. Check the model match against the model names in the catalog (the editor suggests one when it finds a near match). Zero agents is not "all compliant": nothing is evaluated.
A machine is UnknownIts last BIOS read failed, or none of the baseline's attributes exist on its firmware. Fix the read (see above) or check the baseline's attributes on that model. Unknown never counts against the compliance percentage.
Save is refused with "… cannot be managed …"The attribute is read-only, an ordered list, or a value the agents withhold. These cannot be part of a baseline.
No Remediate buttonThe machine is not Drifted, or your role lacks bios.remediate (only Admin has it built in).
Remediation fails with "Access denied - the BIOS password is wrong or missing."The machine has a BIOS password and you chose none, or the stored one is wrong. Check the Firmware card's BIOS password line, fix the Secret credential, and remediate again. On Lenovo, Athena uses the classic password form, so a model that accepts the password only through Lenovo's newer opcode interface also answers Access Denied.
Every attribute fails with "BitLocker could not be suspended …"A boot or security attribute was in the remediation and the agent could not suspend BitLocker on the OS volume. Nothing was written. Check BitLocker on the machine (see BitLocker), then remediate again.
HP password file fails with "An HP password file needs HP BIOS Configuration Utility …"Install HP BIOS Configuration Utility in its default folder on the machine, or use a typed Secret password instead.
An attribute stays Pending restartThe machine has not restarted, or has not checked in since. Restart it. The first BIOS read after it reconnects turns the attribute Verified, or shows it still drifted if the firmware did not take the value.
An attribute stays SentThe agent never answered: it went offline, or its build is older than 1.2.121. Update the agent and remediate again.
No key button on the BIOS administrator password card, or no Set BIOS password on BIOS complianceYour role lacks bios.password (only Admin has it built in). On BIOS compliance, first select the Compliant, Drifted or Unknown figure to list agents.
A password change ends WrongPassword with "An administrator password is set and no current password was given"The machine has a password but Athena had none escrowed, and you left the current password on the escrow default or chose None set. Pick the credential that holds the machine's current password and send again.
A Lenovo machine answers NotSupported for SetIt has no supervisor password yet, and Lenovo's interface cannot create the first one. Set it once in BIOS setup, store it as a Secret credential, then change it from Athena with that credential as the current password.
The escrow stays PendingThe agent has not answered: it went offline, or its build is older than 1.2.144. After 10 minutes you can send again. Update the agent first.
The escrow shows UnverifiedThe firmware accepted the change but still reports the old state. Restart the machine, click Collect now, and check the Firmware card's BIOS password line. The escrow still names the previous credential. Confirm which password works at the machine before you send another change.
Turning a baseline on or off fails with "The desired value of … is not one the firmware accepts."A BIOS update changed the attribute's legal values. Open the baseline, pick a legal value for that attribute, and save.