Update 3/17 – Update a couple sections to fix Bug in Script with assistance from the Dell BIOS Dev team. Uploaded the TS Export of this section.
Download HERE: 3/24 – Removed all of the Bios Files and Update Utility to comply with Dell’s EULA.
Task Sequence Export HERE – You can import this into your system and it will have all the steps., Then copy the steps into your working TS. No Content is included in this export. Create your own Package with the “Full Folder Structure Download” and link to that in your TS
Original Post:
Ok, So for a long time, You couldn’t upgrade Dell’s Bios in WinPE x64 because they didn’t have native x64 bios installer, this has recently changed. – Download HERE
Mike wrote up a nice intro to the new utility HERE
I do all of our bios updates using the “Application Model” after the OS is laid down, so it has the 32bit subsystem, it works fine. But I know many people like to do it during PE. So I thought I’d play with it this morning and write up a script.
PreReqs for my script: Enabled PowerShell. Here are the things we’ve enabled: (Win10 1607 Boot Media)
Benefits of doing it how I’ve setup.
- One Script works for all models, you just have to setup your folder structure to match the Computer Model in WMI.
- Grabs Bios Password from File, you only have to update one File if you change your Bios Password
- Creates TS Variables to avoid Rebooting if already on same bios version.
- Creates Log file based on the Bios Update in the %temp%\SMSTSLog Folder (X:\windows\temp\SMSTSLog\BiosFileName.log)
- New Bios version release? No Problem, delete the old one, add the new one, update Package, done, no script change required.
- It’s Fun
Package Folder Structure. Make sure the subfolders exactly match the WMI Model Name
Get-WmiObject -Class Win32_computersystem | Select-Object -ExpandProperty Model
Once you’ve created your Folder Structure, populate it with the latest Bios files for each model. (Just download and place in the folder, no renaming required)
Also, create a txt file in the package root called Bios.txt and put your Dell Bios password in that file.
Now, the PowerShell script will query WMI for the Model, look for the bios file inside of the corresponding folder and apply it to the system using the Flash64w.exe utility. (It will pull the password from the bios.txt file in the root of your package)
Updated Script from 3/17 Shown HERE:
Based on the Exit Code of the Bios Update, it will create a TS Variable you can use to reboot, retry if low battery or continue on with your TS. – More info about Dell Exit Codes here… I noticed it didn’t have them all though: http://en.community.dell.com/techcenter/enterprise-client/w/wiki/3462.dup-bios-updates. I trigger events based on Exit Code 2 (Successful but requires Reboot) and Exit Code 10 (Battery too Low). You can easily add additional Exit Codes and create custom variables to have your TS do other thing based on those Exit codes.
Now in your TS:
Create Dell Upgrade Bios Group, and set to only run if a Dell Computer:
select * from Win32_ComputerSystem where Manufacturer like “%Dell%”
Create Run Command Line Step:
powershell.exe -NoProfile -ExecutionPolicy ByPass -file .\DellBiosUpgradePackage-2.0.ps1
Create another Group, This will run if the battery was too low to update the Bios. It will wait 10 minutes and try again. If the Battery is still too low after that Point, it will continue on without updating Bios. – You can easily put a step here that will popup a message box about how the Bios Didn’t update, etc.
SMSTS_BiosUpdateBatteryCharge = True
Command Line Step: powershell.exe -NoProfile -ExecutionPolicy ByPass -Command “Start-Sleep -s 600”
It will then wait 10 minutes and try again, if successful, it will set variable SMSTS_BiosUpdateRebootRequired = true and continue onto the next group to reboot. If it fails due to battery again, it will set SMSTS_BiosUpdateBatteryCharge = True and show a Message that it probably has faulty battery. At this Point, you can click “OK” and let it continue, or turn it off and replace battery.
Create another Group which will reboot the computer and any other steps needed to get back to where you were before the reboot. (TS Variable = SMSTS_BiosUpdateRebootRequired equals true)
I added a “Format” step, just to ensure there was a place for the Boot Image to download too, this might not be needed in your environment depending on placement of the Bios Upgrade.
Ok, that should be it.
Note, I was running into some issues with the flashw64.exe utility from Dell, getting this error:
Once I added another line into the script to launch the software once with minimal arguments, it worked fine. I’ve contacted Dell Support to see if they have any ideas on that.
This is the line I added to fix that error:
start-process “$PSScriptRoot\Flash64W.exe” /”p=$BiosPassword /s”
However, changing the Argument Line & Update Bios lines fixed the issue, and I haven’t needed that. I’ve heard from commenters that people are still getting that message, so hopefully this will help. If you do get that message, Open a support issue with Dell, they will help address it. FYI, I’m also using WinPE 1607, not sure if the Build has anything to do with that error.
Update: 2/27/17 – Response from Dell:
Hello, Gary: I heard back from the BIOS engineering group. They said that they have not tested the utility using Powershell scripts. They do not support Powershell scripts. They only support use of the utility within a command prompt in Windows… It is also supported within WinPE (in a command prompt).
Update 2/28/17 – Call From Dell, they are escalating the issue to the BIOS engineering group and will be looking into the problem to see if they can resolve the issue when using it in PowerShell.
Update 3/17/17 – After working will BIOS Dev team, was able to rework the script to resolve the error I was seeing. Updated Script in Download and in this Blog Post.
If you run into any problems, let me know and I’ll test that model if I have it.
Tested on so Far:
- Laptops
- Latitude E5550
- Latitude E5470
- Latitude E6540
- Latitude E6530
- Latitude E6430
- Latitude E7250
- Latitude E7240
- Precision 7510
- Desktops
- OptiPlex 7010
Many thanks for alerting me to this post and new tool Gary! 🙂
We’ve recently swiched over to all Dell clients from HP and so far it’s been a ‘two-step’ process for me build OOB machines. I built a “tools winpe” that includes the cctk that updates the BIOS and updates all the settings fine – but then have to boot into MDT to do the all rest. If I tried to do the same within the task sequence (WinPE section or after OS install) the bios update broke the task sequence due to it auto rebooting to install. Hopefully this new tool will stop me having to do this 🙂
Best wishes
Sean
thx for sharing,
Is it possible to compare version installed if find older then execute this? other wise it will always run…or maybe i have read wrong…
thx again for sharing.
There might be, but I haven’t taken time to figure that out. Currently, this step will always run, however if the Bios is already on the current version, it will skip and not run (I think it’s Exit Code 3). Since I’ve got it set to do the reboot only on exit code 2, it doesn’t waste time if it didn’t update the bios. You could create additional rules on the TS Group that only run if Model Bios < specific bios version. But then you'd have to remember to update that every time you updated your Bios. - https://social.technet.microsoft.com/Forums/en-US/c5684592-adaf-4fcd-8adb-335c7633ca71/query-bios-version-before-running-command-or-installing-application?forum=mdt
Using the App Model, I have the Current Bios Level as a detection Method, so it would skip trying to update based on that, however you can’t use AppModel in PE.
Thanks for the Post.
I get an error when I try to import the Task Sequence
Failed to load class properties and qualifiers for class BDD_UsePackage in task sequence
Do you have MDT integrated? This is an MDT Integrated TS export.
No my Company has not Integrated MDT
What if there is not any BIOS password set for the machine.
I tried the same approach in my lab and I received the error 0x80070002. The system cannot find the file specified. I have made sure to create the exact folder structure and distributed the package over DP. The only difference is I don’t have any BIOS password so kept the BIOS.txt as blank.
Any suggestion or should removing the BIOS password parameter from the script is the only solution?
No Bios Password?? Just update the script for your test lab to remove the /p parameter so it doesn’t look for a password.
Or, add a command line CCTK.exe step to create password before you run the step, and then a step remove the password after you run it. 🙂
Set Password syntax: cctk –setuppwd=BIOSPASSWORD
Remove Password syntax: cctk –setuppwd= –valsetuppwd=BIOSPASSWORD
https://miketerrill.net/2015/08/24/how-to-create-a-dell-command-configure-package-in-configmgr/
Really great job!
I have done some quick friday modification to it so it checks if the folder exists before it continues the script and also to compare the versions before it runs, but it requires that you rename the .exe file so it just contains the version number. Now it only updates if the current bios version is less than the “filename”.
Check below:
# Create Model Variable
$ComputerModel = Get-WmiObject -Class Win32_computersystem | Select-Object -ExpandProperty Model
# Test path
$PathExist = Test-Path .\$ComputerModel
if ($PathExist -eq “True”){
# Create Bios Variables
$BiosCurrentVersion = Get-WmiObject -Class Win32_bios | Select-Object -ExpandProperty SMBIOSBIOSVersion
$BiosUpgradeVersion = Get-ChildItem $ComputerModel\*.exe -Verbose | Select -ExpandProperty BaseName
if ($BiosCurrentVersion -lt $BiosUpgradeVersion){
# Copy Bios Installer to the root of the package – the Flash64W didn’t like when I left it in the Computer Model folder, because it has spaces. (Yes, I tried qoutes and stuff)
Copy-Item $ComputerModel\*.exe -Destination $PSScriptRoot
# Set Command Arguments for Bios Upgrade
$cmds = “/b=$BiosUpgradeVersion.exe /f /s /p=$BiosPassword /l=$LogPath\$BiosUpgradeVersion.log”
# Upgrade Bios
$Process = start-process $PSScriptRoot\Flash64W.exe -ArgumentList $cmds -PassThru -wait
}
}
Another winner. Thanks. I’m running mine with the Run PowerShell Script action instead of Run Command Line because I was getting an unknown error.
Is there a way to get a Version number out of the Dell Bios files (like A20 or 1.3.3) so I can compare it with the current System Bios version?
You can probably pull that info from the file name itself, but I haven’t had time to look into that. I just run it even if it is updated, as it won’t update if it’s already current.
I can’t seem to get this to work, I keep getting the memory could not be read error.
Can you specify what you did to get it to work? I haven’t even been able to get flashw.exe to run on its own using cmd.
Any help would be appreciated. Thanks!
I updated the Post to include info I used to resolve that error the first time. The updated Script I was using resolved it for me, but if you’re having the problem, then hopefully adding that one line will solve it for you. Please also then contact Dell Support to see if you can get it resolved without that workaround. If there is a problem with the Dell 64 flash tool, then it’s good to get them in the loop.
Hi Gary, thanks for this.
Question: What if the computer to be updated, needs more than 1 BIOS upgrade? You said “Once you’ve created your Folder Structure, populate it with the latest Bios files for each model.” But, in my testing, I saw computer needed 2 different updates (as they dont seem to be “cumulative”)
Thank you.
If you had models that required multiple steps, you could do this a couple ways. You can get the pre-req updates installed manually ahead of time, or you can create additional steps for those models. Basically create an identical package to the one I’ve listed, then create another step using the Pre-Req Package, which has all of the models that require a pre-req update, and have several variables on the Step, so it only runs if it is Latitude E6510 or E6410, and is A17 or lower, etc. (I have not tested this, as everything I have is already past that point that I need pre-req updates)
Here is more info: http://www.kraftkennedy.com/deploying-bios-updates-during-sccm-task-sequence-or-advertised-program/
Thank you!
How many versions can we jump up on our machines at one time? We have machines that were deployed with versions from 1.2.2 to 1.11.3. Can we go straight to the current BIOS or do we still need to increase the version by no more than 3 updates till we get back to current?
Thank you
George, you can go straight to the latest version. Dell Bios have checks built in, if it does require a pre-req bios, it will let you know. Don’t make extra work for yourself, always go straight to the latest, if you ever find something that didn’t work right, open support case with Dell, they want to know, because it should be easy to update.
What in case if the upgrade process requires a two level. For example – If my current BIOS version is 1.2.4 and I need to upgrade to 1.6.3. I cannot directly upgrade from 1.2.4 to 1.6.3 rather I have to first upgrade from 1.2.4 to 1.4.2 and then from 1.4.2 to 1.6.3 which is a two way upgrade process. So How could I approach this method with the flash64w.exe utility.
You can have another package, one with the pre-req bios, and have it run that step first with the pre-req package, and add some logic to the conditions, then, run again with the current release bios package after to get fully updated. See earlier comment from June 9th: https://garytown.com/dell-bios-upgrade-in-osd-winpe-x64#comment-6791
PreReqs for my script: Enabled PowerShell. Here are the things we’ve enabled: (Win10 1607 Boot Media)
Is there anything that requires to enable in the Boot Image properties for Windows 10 1703. I cannot find these options in the properties of 1703 boot media.
I got it.
Thanks Gary, this script rocks!!! Nice work! I did run into one issue that I wanted to share for anyone else who may encounter it. If your task sequence deployment is set to ‘Access content directly from the distribution point’ the script will run but not update the BIOS. The log will show an error ‘Unable to locate a BIOS Update Payload’. The problem is with the step to copy the BIOS installer to the root of the package (line 19). Since the content location is on the DP and our network access account does not have write access, the BIOS exe does not copy over. We modified our task sequence deployment to ‘Download Content locally when needed by the running task sequence’ and the BIOS update is successfully.
This has worked wonderfully on past Dells, but the newest Latitudes are giving me an issue. The 5289 and 7389, to be exact. After the update runs, it reboots and actually does the upgrade. When it reboots again, it says “no bootable device found”. I checked all of the settings in the BIOS, and when I boot again from my USB drive, I can see the hard drive has all of the files there. And it is definitely formatted as UEFI. But no matter what I do, the image on the drive is no longer bootable.
I have to go ahead and restart the task sequence completely. It works, of course, because the BIOS is already updated, so it skips that step. Hmm.
JP, having the same issues with my 5289’s as well as the 7050 desktops. I just started to look at this again to figure out why.
Hey JP, found the issue after finding the time to do some testing. From a cohort, he mentioned that it could be the UEFI formatting causing the issue. With this info, I tried the same format and partition task for my UEFI conversion. This task is something quick and dirty nothing special. During this test, it failed and looking at the log, it tells you there isn’t enough space on E. I changed the 500mb fat32 partition, to 5GB (no reason why this couldn’t be smaller and later when I format the drive before I lay down the OS, it doesn’t matter anyway).
Anyway, this worked for me. However I do my disk prep a little different now per the TS that Gary has provided. I do my disk prep at the beginning of the TS so if it needs a BIOS update, it doesn’t format the drive during that group of tasks anymore.
The issue very well could have been my missteps from the start but I hope this information helps.
I’ve searched through this post a dozen times now, and I can’t find the download link for the PowerShell script.
Is it available? Would you point me towards a good link, please?
Hey Mike, sorry, the text default didn’t underline, but it’s right at the top, where it says “Download Here”, if you hover over the “Here”, you’ll see the link. https://garytown.com/Downloads/DellBiosUpgradesPackage.zip
Live Saver! Thank you!
I would have sworn I hovered over every word in this post, looking for it.
Thank You!!
Any chance you can post a NON mdt integrated version of this for import? Or at least publish the steps so I can convert them to a std SCCM task sequence?
Ok, Looks like it has all of the steps in the post, however some of them are in the pictures only, I’ll try to update this with additional information, and put all of the steps into a nicer “Code” format. Thanks for the feedback.
Gary, thanks for this usefull post.
In my environment, I received the error 0x80070002. The log said:
Failed toexecute command line ‘powershell.exe -NoProfile -ExecutionPolicy ByPass -file .\DellBiosUpgradePackage-2.0.ps1’ .
he system cannot find the file specified. (Error: 80070002; Source: Windows)
Install Software failed to run command line, hr=0x80070002
How can I test if the problem is powershell component or the missing package?
What do you recommended to me?
If you put a “Pause” step in your TS right before that, you can then launch the command prompt, type in PowerShell, which would launch powershell, and you can test to make sure PowerShell is working in your WinPE Boot Image.
Just thought I’d post my version that uses the script that Robin posted but I’ve added a bit of regex to extract the version number from the name of the update file being used. That way you don’t need to change the file name.
The regex expression is looking for the text between the second _ and .exe as that is the format all the current update files seem to be using.
$tsenv = New-Object -COMObject Microsoft.SMS.TSEnvironment -ErrorAction SilentlyContinue
$tsenv.Value(“SMSTS_BiosUpdate”) = “True”
#Create Log Path
$LogPath = $tsenv.Value(“_SMSTSLogPath”)
#Get Bios Password from File
$BiosPassword = Get-Content .\Bios.txt
#Create Model Variable
$ComputerModel = Get-WmiObject -Class Win32_computersystem | Select-Object -ExpandProperty Model
#Test path
$PathExist = Test-Path .\$ComputerModel
if ($PathExist -eq “True”){
# Create Bios Variables
$BiosCurrentVersion = (Get-WmiObject win32_bios).SMBIOSBIOSVersion
$BiosUpgradeVersion = Get-ChildItem $ComputerModel\*.exe -Verbose | Select -ExpandProperty Name | %{[regex]::match($_, “^(?:[^_]*_){2}(.*?).exe”).Groups[1].Value}
if ($BiosCurrentVersion -lt $BiosUpgradeVersion){
#Copy Bios Installer to the root of the package – the Flash64W didn’t like when I left it in the Computer Model folder, because it has spaces. (Yes, I tried qoutes and stuff)
Copy-Item $ComputerModel\*.exe -Destination $PSScriptRoot
#Get Bios File Name (Uses the Bios EXE file in the same folder)
$BiosFileName = Get-ChildItem $ComputerModel\*.exe -Verbose | Select -ExpandProperty Name
#Get Bios File Name (No Extension, used to create Log File)
$BiosLogFileName = Get-ChildItem $ComputerModel\*.exe -Verbose | Select -ExpandProperty BaseName
$BiosLogFileName = “$BiosLogFileName.log”
#Set Command Arguments for Bios Update
$cmds = “/b=$BiosFileName /s /p=$BiosPassword /l=$LogPath\$BiosLogFileName”
#Update Bios
$Process = start-process $PSScriptRoot\Flash64W.exe -ArgumentList $cmds -PassThru -wait
#Creates and Set TS Variable to be used to run additional steps if reboot requried.
if ($process.ExitCode -eq 2)
{$tsenv.Value(“SMSTS_BiosUpdateRebootRequired”) = “True”}
else
{$tsenv.Value(“SMSTS_BiosUpdateRebootRequired”) = “False”}
if ($process.ExitCode -eq 10)
{$tsenv.Value(“SMSTS_BiosUpdateBatteryCharge”) = “True”}
else
{$tsenv.Value(“SMSTS_BiosUpdateBatteryCharge”) = “False”}
}
}
Hi, I try this with an Optiplex 7050 but my TS is skipping everytime with the message: “The task sequence execution engine skipped the group (Dell BIOS Update) because the condition was evaluated to be false.”
The Package should be OK beause its similar to the one who works (Latitude 7280) ok its a Notebook and not a mini PC but it should be the same right? I mean the powershell script…
Why the TS sequence is skipping the Update Group any idea? The Group conditions is like this:
select * from Win32_ComputerSystem where Manufacturer = “%Dell%”
select * from WIN32_BIOS where SMBIOSBIOSVersion < "1.5.8"
the Optiplex 7050 has a BIOS Version 1.5.2 thats means it should be fine because its less then 1.5.8
I really dont know why its skipping the TS.
Regards
select * from Win32_ComputerSystem where Manufacturer = “%Dell%” – Replace = with LIKE
I never bothered to check BIOS version first, I just have it always run. If the BIOS are already at the same level, it will see it’s the same level, and continue on without upgrading. Only adds a little more time to the TS, plus, then you don’t have to keep updating your TS Step Logic.
Does not work like that, you have minor version x.13.x and major version 1.xx.x
select * from WIN32_BIOS where SMBIOSBIOSVersion < "1.5.8"
The "SMBIOSBIOSVersion" is a string value so you cant use less than "<" comparison
I look at the Dell Bios Download page, it lists older versions and although a pain, I add each version as a string just like you detect the "%Dell%" on the query above.
Every now and again I come across a version that Dell have not listed!!!
If you specify less than 1.5.8 It cannot read that like a12 etc. You need to use minor and major version for that to work.
Hi,
Very interesting.
But I have a problem … to continue after Bios upgrade.
I put my folder with the two tasks in the “Preinstall” folder after the “Gather local only” task.
Just before the “New Computer Only” folder.
The process well start, the BIOS is updated, the computer restart, but it doesn’t continue deployment.
What is wrong ?
Thank you for your help.
Ludovic.
What is calling the reboot? The BIOS upgrade, or do you have a reboot computer step? Make sure you disable any reboot via the actual bios upgrade, and handle the reboot from the actual TS.
hello, did you ever try using the /forcit switch to install the bios even if the battery is low? During a task sequence I typically check if the laptop is plugged in, so even if the battery is <10% it should be ok going forward.
Curious to know the results and if this switch works on all the bios revisions and from the Flash64w.exe utility
thanks
Hello, I have a problem with copying bios files.
I created on DeploymentShare folder named BIOS and then put inside PCs names and then the update files. The names are 100% correct.
Then I want to copy it and it is not copied during script execution
Copy-Item %Deployroot%\BIOS\$ComputerModel\*.exe -Destination $PSScriptRoot
In the original script there was
Copy-Item $ComputerModel\*.exe -Destination $PSScriptRoot
In that case how the script will now where is $ComputerModel located? It makes no sense for me.
Any ideas?
Hello,
Can I use this Bios update method in MDT? If yes what I would need to change on the script?
Regards,
Tomas
Yes, it will work in MDT, the TS I was using was an MDT integrated ConfigMgr TS. Off hand, I can’t think of anything you’d need to change to make it work in standalone MDT. But it’s been awhile since I’ve looked into it. Let me know if have issues with it in MDT, and I’ll see if I can look into it then.
Hello,
What will happen if computer already is on the latest Bios version?
Regards,
Tomas
If a Dell BIOS update sees that it is already on the current version, the BIOS Update will exit out with an exit code “Already on Version”. Currently, I don’t do any logic in the TS to pre-check if the machine is running the current BIOS before running the step. Because Dell built in their own safeguard to skip updating the BIOS if already on current version, I didn’t bother, as I didn’t have time to keep updating the logic for each BIOS. Example. You Update the BIOS to current Level, you then run TS again, it will download the latest BIOS again and try to run, but see it’s current and skip the update, and continue on.
Has anyone had success with this on a Latitude 5580? I support 30 different Dell models and this works on all of the others. I wonder if it is because Dell named the BIOS for the 5580 differently than from other models – Latitude_5X80_Precision_3520_1.10.4.
I’m a bit unclear when do I add the Action to run the script in my Tasksequence, before the machine boots in to WinPe or after. If its before WinPe and before Setup Windows and Config how will it know where to find and download the BiosUpdgarePackage?
It’s during Winpe, typically pretty early in your TS so you have the BIOS updated before you even apply your OS
Right, I understand it has to be pretty early, My very first action in my Task Sequence to to boot in to WinPe, so would the action to run the script has to be after the machine gets out of WinPE. Just trying to understand where I should add this Action.
Thanks
Once the machine is in WinPE, you can run the step. Do not wait for the machine to exit WinPE. It will still work in the full OS, but ideally, you would run this shortly after you had the computer boot into WinPE.
Hi there,
I am trying to upgrade 9020 and 9010 bios’s
I am getting the following error message
This version of is not compatible with the version of Windows you’re running. Check your computer’s system information and then contact the software publisher. (Error: 800700D8; Source: Windows)
Install Software failed to run command line, hr=0x800700d8
I am using your powershell script and I downloaded the Flash64W.exe. Could it be that the bios for the 9020 will not run in WinPE?
Hi, great post and helps us a lot in our environment! I am just struggling to find a link to download the script.
The Link is near the top of the post. Click on the word “HERE”.
Gary,
Thanks for the write up, trying to use this now and even changing the command line step to a Run PowerShell step causes this error:
Error: Invalid Command line.
Unrecognize command line option .
The /? option will show command help.
Any ideas on how to overcome this? Is it not liking the periods and underscores in the file name?
You could potentially rename the file before calling it. Feel free to PM me on twitter with more information.
Hello,
Thanks for sharing, great script !
We have a problem with an unexpected error with Dell Latitude model 7300 and 7400.
Those models do NOT have embedded NIC, so we use a USB-c connector instead.
The error happened when we want to configure the BIOS with the cctk utility:
.\X86_64\CCTK.exe –EmbNic1=EnabledPxe
This returns an error (exit code 42) and the Task Sequence and OSD is crashed …
Is there a way to handle this error to let the TS continues ? Setting up a variable for instance ?
Thanks in advance.
I’m sure you could use a condition / variable, but I have not seen this scenario yet and have no experience / testing to provide a definite answer.
When I try to import the TS into my SCCM, I get…….
Error: Imported Task Sequence Package (1):
• Create new TS – Dell Bios Update WinPE
Not found
instance of __ExtendedStatus
{
Description = “Failed to load class properties and qualifiers for class BDD_UsePackage in task sequence.”;
Operation = “ExecMethod”;
ParameterInfo = “SMS_TaskSequence”;
ProviderName = “WinMgmt”;
StatusCode = 2147749890;
Running SC 1902
Looks like I exported it and it might have had an MDT step (BDD_UserPackage) typically means it’s referencing MDT.
I’m having issues with MDT to update the BIOS, the process run but the bios does not get updated, the bios log file gets copied but without any characters or information in it. I have Powershell added to my boot image and im running the latest Windows PE addon
I’d create a pause in the TS in PE, then test your scripts and do your troubleshooting there. Honestly don’t know why you’re running into any issues.
For some reason i had to clean the hard drive with Diskpart before trying this. I also realized there are some Dell Optiplex models that you couldn’t use the Flash64W utility , instead you have to use the switches of the bios file. I played with the pause and changed the script to use the switches just for certain models.
Hi Bro Gary,
I have run this TS on a few Dell models and all worked great. However, this one model does not seem to acknowledge the model of the laptop so the BIOS update is not applied.
It is a Dell Precision 3540.
In my folder structure I have Precision 3540 as the name of the folder.
I got this name by running a CMD > wmic > csproduct and it tells me the model.
The laptop was at BIOS 1.9.1.
The BIOS update name is Latitude_5X00_Precision_3540_1.10.1.exe
Is there some detection method I need to change in this model in the script?
Thank You
Hi Bro Gary,
I failed to mention I am using MECM 2010 with the latest hotfix of MECM installed.
Due to Dell’s Model Names not matching BIOS, I’ve moved away from using the Model Name and started using SystemSKUNumber in our processes, and have completely moved away from using this script to update BIOS.
That aside, I would use the TS Debugger to see what variables are being passed, then debug the script live on the machine until you figure out what syntax you need to change.
how to you enumerate dell bios? I’m trying to go from 1.9.1 to 1.10.1 but powershell says 1.9.1 is newer than 1.10.1
You would need to cast the variable in the powershell script as a version.
You can see an example in this script
https://github.com/gwblok/garytown/blob/master/hardware/Dell_BIOS_PopulateCMPackage.ps1
thank you for posting this. The upgrade was straight forward and working. Too awesome not to say Thank you.
As our users have different passwords, I just added a step in the TS to open the Bios.txt file and have them input their Bios password and save the open file. Then the upgrade runs as expected.
this has been working great for a long time however I am now having issues with the new UEFI only models like the Latitude 5410/20 and Optiplex 7090. Have you seen this?
I personally don’t have any models to test on to see if it is no longer working. My newest lab test machine is an OptiPlex 7050.
Hi Gary, thank you very much for your script, I have two questions, the first is:
1- Does the dell BIOS update still (in December 2021) skip the update if the version is the same as the one being installed? (because it would save me from creating a BIOS version detection logic) and also how many minutes would you lose while you let the BIOS update validate that the version is the same and skip the update and continue in the OSD?
2- In my environment, sometimes we have BIOS with different passwords (unfortunately, I’m in the company for a while and I’m fixing it manually when I see a problem like this). Is there any way the script can test one password per line in that txt file or remove any existing passwords and then set a single default password after BIOS update?
1) The Dell BIOS Updates have the logic built in, so if you are a Version 5 for example, if you try to apply Version 5 again, the BIOS Update will exit out as already updated. However I’d recommend adding logic to skip updating if already current.
You can take a look at this post for some ideas: https://www.recastsoftware.com/resources/configmgr-docs/configmgr-topics/manufacturer-tools/dell-configmgr/
2) Yes, it’s all possible to script testing several passwords, then to reset the password with a new one, or continue with the one that was successful. You can do this with PowerShell & CCTK, or TS Steps for testing each Password and then leverage the return codes to set variables. I’d like to blog this… but it’s not a simple post, so I have no idea when I’ll be able to do write up.
Dear Gary,
Thank you for this script, but I’m having some issues with Latitude E7440. When I run it, I get “Error unable to locate a BIOS Update Payload in /b=“.
The task sequence will execute under “Preinstall” right after “Gather local only” with the Run Command Line: powershell.exe -NoProfile -ExecutionPolicy ByPass -file “%SCRIPTROOT%\Dell\DellBiosUpgradesPackage\DellBiosUpgradePackage-2.0.ps1”
I have placed the folder under this location: C:\DeploymentShare$\Scripts\Dell\DellBiosUpgradesPackage
and added the bios in the folder for Latitude E7440. In the script I have only removed so it won’t searching for a password (I don’t have a bios password on that computer), otherwise nothing else has changed)
I’m running MDT 6.3.8456.1000
How can I solve this?
Thank you!
This works on rest of your models, just not the E7440?
Typically I start troubleshooting by putting a Pause into the Task Sequence at that point, launching PowerShell, and going through the script line by line to determine what the cause is.
I’ve only testing in ConfigMgr, and it’s been years since I’ve used this.
We’ve completely replaced this process with a new one which I haven’t blogged yet. That too I’ve only used with ConfigMgr.
Sorry I don’t have a simple answer for you.
I just got started with the bios updates and only had E7440 infront of me.
I put a pause after bios update in winpe, and see the following:
Computermodel: Latitude E7440
PSScriptRoot: \\IP\DS\Applications\dell-bios
Copy-Item: Cannot find path ‘X:\deploy\tools\x64\Latitude E7440’ because it does not exist at \\IP\DS\Applications\dell-bios\DellBiosUpgradePackage-2.0.ps1
+ copy-item $ComputerModel\*.exe -Desintion $PSScriptRoot
In MDT I updated the deployment share and also tried “completely regenerate the boot images” also replaced the boot images in WDS.