Skip to content

Instantly share code, notes, and snippets.

@SMSAgentSoftware
Last active January 30, 2023 10:56
Embed
What would you like to do?
Silently updates an HP BIOS using HP Image Assistant
#####################
## HP BIOS UPDATER ##
#####################
# Params
$HPIAWebUrl = "https://ftp.hp.com/pub/caps-softpaq/cmit/HPIA.html" # Static web page of the HP Image Assistant
$BIOSPassword = "MyPassword"
$script:ContainerURL = "https://mystorageaccount.blob.core.windows.net/mycontainer" # URL of your Azure blob storage container
$script:FolderPath = "HP_BIOS_Updates" # the subfolder to put logs into in the storage container
$script:SASToken = "mysastoken" # the SAS token string for the container (with write permission)
$ProgressPreference = 'SilentlyContinue' # to speed up web requests
################################
## Create Directory Structure ##
################################
$RootFolder = $env:ProgramData
$ParentFolderName = "Contoso"
$ChildFolderName = "HP_BIOS_Update"
$ChildFolderName2 = Get-Date -Format "yyyy-MMM-dd_HH.mm.ss"
$script:WorkingDirectory = "$RootFolder\$ParentFolderName\$ChildFolderName\$ChildFolderName2"
try
{
[void][System.IO.Directory]::CreateDirectory($WorkingDirectory)
}
catch
{
throw
}
# Function write to a log file in ccmtrace format
Function script:Write-Log {
param (
[Parameter(Mandatory = $true)]
[string]$Message,
[Parameter()]
[ValidateSet(1, 2, 3)] # 1-Info, 2-Warning, 3-Error
[int]$LogLevel = 1,
[Parameter(Mandatory = $true)]
[string]$Component,
[Parameter(Mandatory = $false)]
[object]$Exception
)
$LogFile = "$WorkingDirectory\HP_BIOS_Update.log"
If ($Exception)
{
[String]$Message = "$Message" + "$Exception"
}
$TimeGenerated = "$(Get-Date -Format HH:mm:ss).$((Get-Date).Millisecond)+000"
$Line = '<![LOG[{0}]LOG]!><time="{1}" date="{2}" component="{3}" context="" type="{4}" thread="" file="">'
$LineFormat = $Message, $TimeGenerated, (Get-Date -Format MM-dd-yyyy), $Component, $LogLevel
$Line = $Line -f $LineFormat
# Write to log
Add-Content -Value $Line -Path $LogFile -ErrorAction SilentlyContinue
}
# Function to upload log file to Azure Blob storage
Function Upload-LogFilesToAzure {
$Date = Get-date -Format "yyyy-MM-dd_HH.mm.ss"
$HpFirmwareUpdRecLog = Get-ChildItem -Path $WorkingDirectory -Include HpFirmwareUpdRec.log -Recurse -ErrorAction SilentlyContinue
$HPBIOSUPDRECLog = Get-ChildItem -Path $WorkingDirectory -Include HPBIOSUPDREC64.log -Recurse -ErrorAction SilentlyContinue
If ($HpFirmwareUpdRecLog)
{
$File = $HpFirmwareUpdRecLog
}
ElseIf ($HPBIOSUPDRECLog)
{
$File = $HPBIOSUPDRECLog
}
Else{}
If ($File)
{
$Body = Get-Content $($File.FullName) -Raw -ErrorAction SilentlyContinue
If ($Body)
{
$URI = "$ContainerURL/$FolderPath/$($Env:COMPUTERNAME)`_$Date`_$($File.Name)$SASToken"
$Headers = @{
'x-ms-content-length' = $($File.Length)
'x-ms-blob-type' = 'BlockBlob'
}
Invoke-WebRequest -Uri $URI -Method PUT -Headers $Headers -Body $Body -ErrorAction SilentlyContinue
}
}
$File2 = Get-Item $WorkingDirectory\HP_BIOS_Update.log -ErrorAction SilentlyContinue
$Body2 = Get-Content $($File2.FullName) -Raw -ErrorAction SilentlyContinue
If ($Body2)
{
$URI2 = "$ContainerURL/$FolderPath/$($Env:COMPUTERNAME)`_$Date`_$($File2.Name)$SASToken"
$Headers2 = @{
'x-ms-content-length' = $($File2.Length)
'x-ms-blob-type' = 'BlockBlob'
}
Invoke-WebRequest -Uri $URI2 -Method PUT -Headers $Headers2 -Body $Body2 -ErrorAction SilentlyContinue
}
}
Write-Log -Message "#######################" -Component "Preparation"
Write-Log -Message "## Starting BIOS update run ##" -Component "Preparation"
Write-Log -Message "#######################" -Component "Preparation"
#################################
## Disable IE First Run Wizard ##
#################################
# This prevents an error running Invoke-WebRequest when IE has not yet been run in the current context
Write-Log -Message "Disabling IE first run wizard" -Component "Preparation"
$null = New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft" -Name "Internet Explorer" -Force
$null = New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Internet Explorer" -Name "Main" -Force
$null = New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Internet Explorer\Main" -Name "DisableFirstRunCustomize" -PropertyType DWORD -Value 1 -Force
##########################
## Get latest HPIA Info ##
##########################
Write-Log -Message "Finding info for latest version of HP Image Assistant (HPIA)" -Component "DownloadHPIA"
try
{
$HTML = Invoke-WebRequest -Uri $HPIAWebUrl -ErrorAction Stop
}
catch
{
Write-Log -Message "Failed to download the HPIA web page. $($_.Exception.Message)" -Component "DownloadHPIA" -LogLevel 3
Upload-LogFilesToAzure
throw
}
$HPIASoftPaqNumber = ($HTML.Links | Where {$_.href -match "hp-hpia-"}).outerText
$HPIADownloadURL = ($HTML.Links | Where {$_.href -match "hp-hpia-"}).href
$HPIAFileName = $HPIADownloadURL.Split('/')[-1]
Write-Log -Message "SoftPaq number is $HPIASoftPaqNumber" -Component "DownloadHPIA"
Write-Log -Message "Download URL is $HPIADownloadURL" -Component "DownloadHPIA"
###################
## Download HPIA ##
###################
Write-Log -Message "Downloading the HPIA" -Component "DownloadHPIA"
try
{
$ExistingBitsJob = Get-BitsTransfer -Name "$HPIAFileName" -AllUsers -ErrorAction SilentlyContinue
If ($ExistingBitsJob)
{
Write-Log -Message "An existing BITS tranfer was found. Cleaning it up." -Component "DownloadHPIA" -LogLevel 2
Remove-BitsTransfer -BitsJob $ExistingBitsJob
}
$BitsJob = Start-BitsTransfer -Source $HPIADownloadURL -Destination $WorkingDirectory\$HPIAFileName -Asynchronous -DisplayName "$HPIAFileName" -Description "HPIA download" -RetryInterval 60 -ErrorAction Stop
do {
Start-Sleep -Seconds 5
$Progress = [Math]::Round((100 * ($BitsJob.BytesTransferred / $BitsJob.BytesTotal)),2)
Write-Log -Message "Downloaded $Progress`%" -Component "DownloadHPIA"
} until ($BitsJob.JobState -in ("Transferred","Error"))
If ($BitsJob.JobState -eq "Error")
{
Write-Log -Message "BITS tranfer failed: $($BitsJob.ErrorDescription)" -Component "DownloadHPIA" -LogLevel 3
Upload-LogFilesToAzure
throw
}
Write-Log -Message "Download is finished" -Component "DownloadHPIA"
Complete-BitsTransfer -BitsJob $BitsJob
Write-Log -Message "BITS transfer is complete" -Component "DownloadHPIA"
}
catch
{
Write-Log -Message "Failed to start a BITS transfer for the HPIA: $($_.Exception.Message)" -Component "DownloadHPIA" -LogLevel 3
Upload-LogFilesToAzure
throw
}
##################
## Extract HPIA ##
##################
Write-Log -Message "Extracting the HPIA" -Component "Analyze"
try
{
$Process = Start-Process -FilePath $WorkingDirectory\$HPIAFileName -WorkingDirectory $WorkingDirectory -ArgumentList "/s /f .\HPIA\ /e" -NoNewWindow -PassThru -Wait -ErrorAction Stop
Start-Sleep -Seconds 5
If (Test-Path $WorkingDirectory\HPIA\HPImageAssistant.exe)
{
Write-Log -Message "Extraction complete" -Component "Analyze"
}
Else
{
Write-Log -Message "HPImageAssistant not found!" -Component "Analyze" -LogLevel 3
Upload-LogFilesToAzure
throw
}
}
catch
{
Write-Log -Message "Failed to extract the HPIA: $($_.Exception.Message)" -Component "Analyze" -LogLevel 3
Upload-LogFilesToAzure
throw
}
##############################################
## Analyze available BIOS updates with HPIA ##
##############################################
Write-Log -Message "Analyzing system for available BIOS updates" -Component "Analyze"
try
{
$Process = Start-Process -FilePath $WorkingDirectory\HPIA\HPImageAssistant.exe -WorkingDirectory $WorkingDirectory -ArgumentList "/Operation:Analyze /Category:BIOS /Selection:All /Action:List /Silent /ReportFolder:$WorkingDirectory\Report" -NoNewWindow -PassThru -Wait -ErrorAction Stop
If ($Process.ExitCode -eq 0)
{
Write-Log -Message "Analysis complete" -Component "Analyze"
}
elseif ($Process.ExitCode -eq 256)
{
Write-Log -Message "The analysis returned no recommendation. No BIOS update is available at this time" -Component "Analyze" -LogLevel 2
Upload-LogFilesToAzure
Exit 0
}
elseif ($Process.ExitCode -eq 4096)
{
Write-Log -Message "This platform is not supported!" -Component "Analyze" -LogLevel 2
Upload-LogFilesToAzure
throw
}
Else
{
Write-Log -Message "Process exited with code $($Process.ExitCode). Expecting 0." -Component "Analyze" -LogLevel 3
Upload-LogFilesToAzure
throw
}
}
catch
{
Write-Log -Message "Failed to start the HPImageAssistant.exe: $($_.Exception.Message)" -Component "Analyze" -LogLevel 3
Upload-LogFilesToAzure
throw
}
# Read the XML report
Write-Log -Message "Reading xml report" -Component "Analyze"
try
{
$XMLFile = Get-ChildItem -Path "$WorkingDirectory\Report" -Recurse -Include *.xml -ErrorAction Stop
If ($XMLFile)
{
Write-Log -Message "Report located at $($XMLFile.FullName)" -Component "Analyze"
try
{
[xml]$XML = Get-Content -Path $XMLFile.FullName -ErrorAction Stop
$Recommendation = $xml.HPIA.Recommendations.BIOS.Recommendation
If ($Recommendation)
{
$CurrentBIOSVersion = $Recommendation.TargetVersion
$ReferenceBIOSVersion = $Recommendation.ReferenceVersion
$DownloadURL = "https://" + $Recommendation.Solution.Softpaq.Url
$SoftpaqFileName = $DownloadURL.Split('/')[-1]
Write-Log -Message "Current BIOS version is $CurrentBIOSVersion" -Component "Analyze"
Write-Log -Message "Recommended BIOS version is $ReferenceBIOSVersion" -Component "Analyze"
Write-Log -Message "Softpaq download URL is $DownloadURL" -Component "Analyze"
}
Else
{
Write-Log -Message "Failed to find a BIOS recommendation in the XML report" -Component "Analyze" -LogLevel 3
Upload-LogFilesToAzure
throw
}
}
catch
{
Write-Log -Message "Failed to parse the XML file: $($_.Exception.Message)" -Component "Analyze" -LogLevel 3
Upload-LogFilesToAzure
throw
}
}
Else
{
Write-Log -Message "Failed to find an XML report." -Component "Analyze" -LogLevel 3
Upload-LogFilesToAzure
throw
}
}
catch
{
Write-Log -Message "Failed to find an XML report: $($_.Exception.Message)" -Component "Analyze" -LogLevel 3
Upload-LogFilesToAzure
throw
}
###############################
## Download the BIOS softpaq ##
###############################
Write-Log -Message "Downloading the Softpaq" -Component "DownloadBIOSUpdate"
try
{
$ExistingBitsJob = Get-BitsTransfer -Name "$SoftpaqFileName" -AllUsers -ErrorAction SilentlyContinue
If ($ExistingBitsJob)
{
Write-Log -Message "An existing BITS tranfer was found. Cleaning it up." -Component "DownloadBIOSUpdate" -LogLevel 2
Remove-BitsTransfer -BitsJob $ExistingBitsJob
}
$BitsJob = Start-BitsTransfer -Source $DownloadURL -Destination $WorkingDirectory\$SoftpaqFileName -Asynchronous -DisplayName "$SoftpaqFileName" -Description "BIOS update download" -RetryInterval 60 -ErrorAction Stop
do {
Start-Sleep -Seconds 5
$Progress = [Math]::Round((100 * ($BitsJob.BytesTransferred / $BitsJob.BytesTotal)),2)
Write-Log -Message "Downloaded $Progress`%" -Component "DownloadBIOSUpdate"
} until ($BitsJob.JobState -in ("Transferred","Error"))
If ($BitsJob.JobState -eq "Error")
{
Write-Log -Message "BITS tranfer failed: $($BitsJob.ErrorDescription)" -Component "DownloadBIOSUpdate" -LogLevel 3
Upload-LogFilesToAzure
throw
}
Write-Log -Message "Download is finished" -Component "DownloadBIOSUpdate"
Complete-BitsTransfer -BitsJob $BitsJob
Write-Log -Message "BITS transfer is complete" -Component "DownloadBIOSUpdate"
}
catch
{
Write-Log -Message "Failed to start a BITS transfer for the BIOS update: $($_.Exception.Message)" -Component "DownloadBIOSUpdate" -LogLevel 3
Upload-LogFilesToAzure
throw
}
#########################
## Extract BIOS Update ##
#########################
Write-Log -Message "Extracting the BIOS Update" -Component "ExtractBIOSUpdate"
$BIOSUpdateDirectoryName = $SoftpaqFileName.Split('.')[0]
try
{
$Process = Start-Process -FilePath $WorkingDirectory\$SoftpaqFileName -WorkingDirectory $WorkingDirectory -ArgumentList "/s /f .\$BIOSUpdateDirectoryName\ /e" -NoNewWindow -PassThru -Wait -ErrorAction Stop
Start-Sleep -Seconds 5
$HpFirmwareUpdRec = Get-ChildItem -Path $WorkingDirectory -Include HpFirmwareUpdRec.exe -Recurse -ErrorAction SilentlyContinue
$HPBIOSUPDREC = Get-ChildItem -Path $WorkingDirectory -Include HPBIOSUPDREC.exe -Recurse -ErrorAction SilentlyContinue
If ($HpFirmwareUpdRec)
{
$BIOSExecutable = $HpFirmwareUpdRec
}
ElseIf ($HPBIOSUPDREC)
{
$BIOSExecutable = $HPBIOSUPDREC
}
Else
{
Write-Log -Message "BIOS update executable not found!" -Component "ExtractBIOSUpdate" -LogLevel 3
Upload-LogFilesToAzure
throw
}
Write-Log -Message "Extraction complete" -Component "ExtractBIOSUpdate"
}
catch
{
Write-Log -Message "Failed to extract the softpaq: $($_.Exception.Message)" -Component "ExtractBIOSUpdate" -LogLevel 3
Upload-LogFilesToAzure
throw
}
#############################
## Check for BIOS password ##
#############################
try
{
$SetupPwd = (Get-CimInstance -Namespace ROOT\HP\InstrumentedBIOS -ClassName HP_BIOSPassword -Filter "Name='Setup Password'" -ErrorAction Stop).IsSet
If ($SetupPwd -eq 1)
{
Write-Log -Message "The BIOS has a password set" -Component "BIOSPassword"
$BIOSPasswordSet = $true
}
Else
{
Write-Log -Message "No password has been set on the BIOS" -Component "BIOSPassword"
}
}
catch
{
Write-Log -Message "Unable to determine if a BIOS password has been set: $($_.Exception.Message)" -Component "BIOSPassword" -LogLevel 3
Upload-LogFilesToAzure
throw
}
##########################
## Create password file ##
##########################
If ($BIOSPasswordSet)
{
Write-Log -Message "Creating an encrypted password file" -Component "BIOSPassword"
$HpqPswd = Get-ChildItem -Path $WorkingDirectory -Include HpqPswd.exe -Recurse -ErrorAction SilentlyContinue
If ($HpqPswd)
{
try
{
$Process = Start-Process -FilePath $HpqPswd.FullName -WorkingDirectory $WorkingDirectory -ArgumentList "-p""$BIOSPassword"" -f.\password.bin -s" -NoNewWindow -PassThru -Wait -ErrorAction Stop
Start-Sleep -Seconds 5
If (Test-Path $WorkingDirectory\password.bin)
{
Write-Log -Message "File successfully created" -Component "BIOSPassword"
}
Else
{
Write-Log -Message "Encrypted password file could not be found!" -Component "BIOSPassword" -LogLevel 3
Upload-LogFilesToAzure
throw
}
}
catch
{
Write-Log -Message "Failed to create an encrypted password file: $($_.Exception.Message)" -Component "BIOSPassword" -LogLevel 3
Upload-LogFilesToAzure
throw
}
}
else
{
Write-Log -Message "Failed to locate HP password encryption utility!" -Component "BIOSPassword" -LogLevel 3
Upload-LogFilesToAzure
throw
}
}
###########################
## Stage the BIOS update ##
###########################
Write-Log -Message "Staging BIOS firmware update" -Component "BIOSFlash"
try
{
If ($BIOSPasswordSet)
{
$Process = Start-Process -FilePath "$($BIOSExecutable.FullName)" -WorkingDirectory $WorkingDirectory -ArgumentList "-s -p.\password.bin -f.\$BIOSUpdateDirectoryName -r -b" -NoNewWindow -PassThru -Wait -ErrorAction Stop
}
Else
{
$Process = Start-Process -FilePath "$($BIOSExecutable.FullName)" -WorkingDirectory $WorkingDirectory -ArgumentList "-s -f.\$BIOSUpdateDirectoryName -r -b" -NoNewWindow -PassThru -Wait -ErrorAction Stop
}
If ($Process.ExitCode -eq 3010)
{
Write-Log -Message "The update has been staged. The BIOS will be updated on restart" -Component "BIOSFlash"
}
Else
{
Write-Log -Message "An unexpected exit code was returned: $($Process.ExitCode)" -Component "BIOSFlash" -LogLevel 3
Upload-LogFilesToAzure
throw
}
}
catch
{
Write-Log -Message "Failed to stage BIOS update: $($_.Exception.Message)" -Component "BIOSFlash" -LogLevel 3
Upload-LogFilesToAzure
throw
}
Write-Log -Message "This BIOS update run is complete. Have a nice day!" -Component "Completion"
Upload-LogFilesToAzure
@christophergithub2021
Copy link

Thank you, sir. Am I be able to use this script even without creating a bios password?

@christophergithub2021
Copy link

<![LOG[Disabling IE first run wizard]LOG]!><time="19:47:58.115+000" date="10-19-2021" component="Preparation" context="" type="1" thread="" file="">
<![LOG[Finding info for latest version of HP Image Assistant (HPIA)]LOG]!><time="19:47:58.145+000" date="10-19-2021" component="DownloadHPIA" context="" type="1" thread="" file="">
<![LOG[SoftPaq number is sp135640]LOG]!><time="19:47:59.969+000" date="10-19-2021" component="DownloadHPIA" context="" type="1" thread="" file="">
<![LOG[Download URL is https://hpia.hpcloud.hp.com/downloads/hpia/hp-hpia-5.1.3.exe]LOG]!><time="19:47:59.969+000" date="10-19-2021" component="DownloadHPIA" context="" type="1" thread="" file="">
<![LOG[Downloading the HPIA]LOG]!><time="19:47:59.969+000" date="10-19-2021" component="DownloadHPIA" context="" type="1" thread="" file="">
<![LOG[Downloaded 100%]LOG]!><time="19:48:09.405+000" date="10-19-2021" component="DownloadHPIA" context="" type="1" thread="" file="">
<![LOG[Download is finished]LOG]!><time="19:48:09.415+000" date="10-19-2021" component="DownloadHPIA" context="" type="1" thread="" file="">
<![LOG[BITS transfer is complete]LOG]!><time="19:48:09.425+000" date="10-19-2021" component="DownloadHPIA" context="" type="1" thread="" file="">
<![LOG[Extracting the HPIA]LOG]!><time="19:48:09.425+000" date="10-19-2021" component="Analyze" context="" type="1" thread="" file="">
<![LOG[Extraction complete]LOG]!><time="19:48:21.595+000" date="10-19-2021" component="Analyze" context="" type="1" thread="" file="">
<![LOG[Analyzing system for available BIOS updates]LOG]!><time="19:48:21.600+000" date="10-19-2021" component="Analyze" context="" type="1" thread="" file="">
<![LOG[Analysis complete]LOG]!><time="19:49:50.620+000" date="10-19-2021" component="Analyze" context="" type="1" thread="" file="">
<![LOG[Reading xml report]LOG]!><time="19:49:50.620+000" date="10-19-2021" component="Analyze" context="" type="1" thread="" file="">
<![LOG[Report located at C:\ProgramData\Contoso\HP_BIOS_Update\2021-Oct-19_19.47.58\Report\HP ProDesk 400 G6 Desktop Mini PC.xml]LOG]!><time="19:49:50.625+000" date="10-19-2021" component="Analyze" context="" type="1" thread="" file="">
<![LOG[Current BIOS version is 02.06.02]LOG]!><time="19:49:50.635+000" date="10-19-2021" component="Analyze" context="" type="1" thread="" file="">
<![LOG[Recommended BIOS version is 02.08.01]LOG]!><time="19:49:50.635+000" date="10-19-2021" component="Analyze" context="" type="1" thread="" file="">
<![LOG[Softpaq download URL is https://ftp.hp.com/pub/softpaq/sp133001-133500/sp133197.exe]LOG]!><time="19:49:50.635+000" date="10-19-2021" component="Analyze" context="" type="1" thread="" file="">
<![LOG[Downloading the Softpaq]LOG]!><time="19:49:50.635+000" date="10-19-2021" component="DownloadBIOSUpdate" context="" type="1" thread="" file="">
<![LOG[Downloaded 100%]LOG]!><time="19:49:55.667+000" date="10-19-2021" component="DownloadBIOSUpdate" context="" type="1" thread="" file="">
<![LOG[Download is finished]LOG]!><time="19:49:55.667+000" date="10-19-2021" component="DownloadBIOSUpdate" context="" type="1" thread="" file="">
<![LOG[BITS transfer is complete]LOG]!><time="19:49:55.687+000" date="10-19-2021" component="DownloadBIOSUpdate" context="" type="1" thread="" file="">
<![LOG[Extracting the BIOS Update]LOG]!><time="19:49:55.687+000" date="10-19-2021" component="ExtractBIOSUpdate" context="" type="1" thread="" file="">
<![LOG[Extraction complete]LOG]!><time="19:50:03.475+000" date="10-19-2021" component="ExtractBIOSUpdate" context="" type="1" thread="" file="">
<![LOG[No password has been set on the BIOS]LOG]!><time="19:50:03.565+000" date="10-19-2021" component="BIOSPassword" context="" type="1" thread="" file="">
<![LOG[Staging BIOS firmware update]LOG]!><time="19:50:03.565+000" date="10-19-2021" component="BIOSFlash" context="" type="1" thread="" file="">
<![LOG[Failed to stage BIOS update: This command cannot be run due to the error: The system cannot find the file specified.]LOG]!><time="19:50:03.575+000" date="10-19-2021" component="BIOSFlash" context="" type="3" thread="" file="">

@SMSAgentSoftware
Copy link
Author

Looks like it cannot find the BIOS executable. Check the path "$WorkingDirectory$BIOSUpdateDirectoryName$BIOSExecutable" for either HpFirmwareUpdRec.exe or HPBIOSUPDREC.exe.

@christophergithub2021
Copy link

christophergithub2021 commented Oct 20, 2021

Thanks Sir Trevor.

HpFirwareUpdRec.exe does exist on "$WorkingDirectory$BIOSUpdateDirectoryName$BIOSExecutable or (C:\ProgramData\Contoso\HP_BIOS_Update\2021-Oct-20_12.49.20\sp133197)

@christophergithub2021
Copy link

May I know what is this means? $BIOSUpdateDirectoryName = $SoftpaqFileName.Split('.')[0]

#########################

Extract BIOS Update

#########################
Write-Log -Message "Extracting the BIOS Update" -Component "ExtractBIOSUpdate"
$BIOSUpdateDirectoryName = $SoftpaqFileName.Split('.')[0]

@SMSAgentSoftware
Copy link
Author

This comes ultimately from the download URL, in your case https://ftp.hp.com/pub/softpaq/sp133001-133500/sp133197.exe, which would result in $BIOSUpdateDirectoryName = sp133197.
Curious why it's not working as the file path at least seems correct. Perhaps it can't find the actual *.bin file, the payload for the update? Is AV at play here?

@JrothSKV
Copy link

JrothSKV commented Jan 5, 2022

I have a similar issue. The softpaq subfolder is created, and the bin/inf file are there.

<![LOG[#######################]LOG]!><time="12:39:55.583+000" date="01-05-2022" component="Preparation" context="" type="1" thread="" file="">
<![LOG[## Starting BIOS update run ##]LOG]!><time="12:39:55.643+000" date="01-05-2022" component="Preparation" context="" type="1" thread="" file="">
<![LOG[#######################]LOG]!><time="12:39:55.643+000" date="01-05-2022" component="Preparation" context="" type="1" thread="" file="">
<![LOG[Disabling IE first run wizard]LOG]!><time="12:39:55.643+000" date="01-05-2022" component="Preparation" context="" type="1" thread="" file="">
<![LOG[Finding info for latest version of HP Image Assistant (HPIA)]LOG]!><time="12:39:55.661+000" date="01-05-2022" component="DownloadHPIA" context="" type="1" thread="" file="">
<![LOG[SoftPaq number is sp136558]LOG]!><time="12:39:56.226+000" date="01-05-2022" component="DownloadHPIA" context="" type="1" thread="" file="">
<![LOG[Download URL is https://hpia.hpcloud.hp.com/downloads/hpia/hp-hpia-5.1.4.exe]LOG]!><time="12:39:56.234+000" date="01-05-2022" component="DownloadHPIA" context="" type="1" thread="" file="">
<![LOG[Downloading the HPIA]LOG]!><time="12:39:56.236+000" date="01-05-2022" component="DownloadHPIA" context="" type="1" thread="" file="">
<![LOG[Downloaded 100%]LOG]!><time="12:40:01.867+000" date="01-05-2022" component="DownloadHPIA" context="" type="1" thread="" file="">
<![LOG[Download is finished]LOG]!><time="12:40:01.877+000" date="01-05-2022" component="DownloadHPIA" context="" type="1" thread="" file="">
<![LOG[BITS transfer is complete]LOG]!><time="12:40:01.887+000" date="01-05-2022" component="DownloadHPIA" context="" type="1" thread="" file="">
<![LOG[Extracting the HPIA]LOG]!><time="12:40:01.897+000" date="01-05-2022" component="Analyze" context="" type="1" thread="" file="">
<![LOG[Extraction complete]LOG]!><time="12:40:08.99+000" date="01-05-2022" component="Analyze" context="" type="1" thread="" file="">
<![LOG[Analyzing system for available BIOS updates]LOG]!><time="12:40:08.99+000" date="01-05-2022" component="Analyze" context="" type="1" thread="" file="">
<![LOG[Analysis complete]LOG]!><time="12:41:44.100+000" date="01-05-2022" component="Analyze" context="" type="1" thread="" file="">
<![LOG[Reading xml report]LOG]!><time="12:41:44.100+000" date="01-05-2022" component="Analyze" context="" type="1" thread="" file="">
<![LOG[Report located at C:\ProgramData\contoso\HP_BIOS_Update\2022-Jan-05_12.39.55\Report\HP EliteBook 845 G7 Notebook PC.xml]LOG]!><time="12:41:44.120+000" date="01-05-2022" component="Analyze" context="" type="1" thread="" file="">
<![LOG[Current BIOS version is 01.03.01]LOG]!><time="12:41:44.140+000" date="01-05-2022" component="Analyze" context="" type="1" thread="" file="">
<![LOG[Recommended BIOS version is 01.07.00]LOG]!><time="12:41:44.140+000" date="01-05-2022" component="Analyze" context="" type="1" thread="" file="">
<![LOG[Softpaq download URL is https://ftp.hp.com/pub/softpaq/sp136001-136500/sp136424.exe]LOG]!><time="12:41:44.148+000" date="01-05-2022" component="Analyze" context="" type="1" thread="" file="">
<![LOG[Downloading the Softpaq]LOG]!><time="12:41:44.148+000" date="01-05-2022" component="DownloadBIOSUpdate" context="" type="1" thread="" file="">
<![LOG[Downloaded 100%]LOG]!><time="12:41:49.197+000" date="01-05-2022" component="DownloadBIOSUpdate" context="" type="1" thread="" file="">
<![LOG[Download is finished]LOG]!><time="12:41:49.205+000" date="01-05-2022" component="DownloadBIOSUpdate" context="" type="1" thread="" file="">
<![LOG[BITS transfer is complete]LOG]!><time="12:41:49.207+000" date="01-05-2022" component="DownloadBIOSUpdate" context="" type="1" thread="" file="">
<![LOG[Extracting the BIOS Update]LOG]!><time="12:41:49.215+000" date="01-05-2022" component="ExtractBIOSUpdate" context="" type="1" thread="" file="">
<![LOG[Extraction complete]LOG]!><time="12:41:55.538+000" date="01-05-2022" component="ExtractBIOSUpdate" context="" type="1" thread="" file="">
<![LOG[No password has been set on the BIOS]LOG]!><time="12:41:55.880+000" date="01-05-2022" component="BIOSPassword" context="" type="1" thread="" file="">
<![LOG[Staging BIOS firmware update]LOG]!><time="12:41:55.888+000" date="01-05-2022" component="BIOSFlash" context="" type="1" thread="" file="">
<![LOG[Failed to stage BIOS update: This command cannot be run due to the error: The system cannot find the file specified.]LOG]!><time="12:41:55.900+000" date="01-05-2022" component="BIOSFlash" context="" type="3" thread="" file="">
<![LOG[This BIOS update run is complete. Have a nice day!]LOG]!><time="12:41:56.260+000" date="01-05-2022" component="Completion" context="" type="1" thread="" file="">

@dimitrov6
Copy link

Hello,
I have the same problem than JrothSKV.
The problem seems to come from the directory of the line
{
$Process = Start-Process -FilePath "$WorkingDirectory$BIOSUpdateDirectoryName$BIOSExecutable" -WorkingDirectory $WorkingDirectory -ArgumentList "-s -p.\password.bin -f.$BIOSUpdateDirectoryName -r -b" -NoNewWindow -PassThru -Wait -ErrorAction Stop
}

If i start a cmd and lanch manually the bios exe with the password.bin with manual links pointing where the program and files swhere downloaded byt the script : it works///
So how could we solve the problem?

@dimitrov6
Copy link

Ok, i find the problem. You must modify this line

{
$Process = Start-Process -FilePath "$WorkingDirectory$BIOSUpdateDirectoryName$BIOSExecutable" -WorkingDirectory $WorkingDirectory -ArgumentList "-s -p.\password.bin -f.$BIOSUpdateDirectoryName -r -b" -NoNewWindow -PassThru -Wait -ErrorAction Stop
}

With

{
    $Process = Start-Process -FilePath "$BIOSExecutable" -WorkingDirectory $WorkingDirectory -ArgumentList "-s -p.\password.bin -f.\$BIOSUpdateDirectoryName -r -b" -NoNewWindow -PassThru -Wait -ErrorAction Stop
}

And it works!

@SMSAgentSoftware
Copy link
Author

Thanks for the find @dimitrov6! I have verified it and updated the code in the gist. I think originally I was extracting just the filename in the $BIOSExecutable variable - don't know how I missed that off.
@christophergithub2021 @JrothSKV

@zataraine
Copy link

This is absolutely brilliant. In initial testing this has worked a treat with one exception; the password.bin file is being created in the correct folder but looks to be 0kb in size. I amended the Line 7 $BIOSPassword = "MyPassword" to the actual BIOS password.
I can't see any errors in the logs:
<![LOG[The BIOS has a password set]LOG]!><time="09:42:25.773+000" date="11-24-2022" component="BIOSPassword" context="" type="1" thread="" file="">
<![LOG[Creating an encrypted password file]LOG]!><time="09:42:25.778+000" date="11-24-2022" component="BIOSPassword" context="" type="1" thread="" file="">
<![LOG[File successfully created]LOG]!><time="09:42:31.877+000" date="11-24-2022" component="BIOSPassword" context="" type="1" thread="" file="">
<![LOG[Staging BIOS firmware update]LOG]!><time="09:42:31.877+000" date="11-24-2022" component="BIOSFlash" context="" type="1" thread="" file="">

Upon reboot, the device then prompts for a BIOS password to complete the update - what the heck am I doing wrong? :(

@SMSAgentSoftware
Copy link
Author

SMSAgentSoftware commented Nov 24, 2022 via email

@joshuabiddle
Copy link

This is an excellent script. My org doesn't use Azure blob so I removed that and changed the logging. I've tested now on a few workstations with good success. Nice one!

@SMSAgentSoftware
Copy link
Author

👍

@zataraine
Copy link

Yes I have verified I am entered the correct password, thanks. I have tested script on about 10 laptops, all of which have the same BIOS password. It is creating a 0kb password.bin file, which is a blank password.

My work around at present is to manually pop in a copy of a good password.bin file to each computer and script changed to look for the file locally instead of first creating it. This is fine, but wouldn't mind it being created automatically where possible. 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment