I can't get Windows to change the uEFI boot order to PXE boot first from within windows. I'm trying to automate the system so that it PXE boots every time, so I can control the boot option. I've tried BCDEdit:

bcdedit /set {fwbootmgr} DEFAULT <uuid of nic>

Is there anything like efibootmgr for windows?

  • I don't think it is possible to access uEFI from within Windows, but I don;t have any hard evidence for that. bcdedit changes the boot store on a boot device, but you want to change which boot device is used. – Peter Hahndorf Aug 15 '15 at 12:24
  • I don't understand why windows wouldn't have access to the uEFI nvRAM. Linux kernels pretty much universally support modifying this via efibootmgr. There's a program called "EasyUEFI" which provides this support but it costs money for command line/server support. – Collin Reynolds Aug 15 '15 at 18:41

Dell Provides utility called Dell Command Configure which will help you to configure all client systems boot order from windows and during OS deployment through SCCM task sequence.


| improve this answer | |

Deleting {GUID} of loader for Network from {fwbootmgr}/"display order" (mapped to "boot order" in NVRAM) and re-adding it as first eventually will change NVRAM boot order.

Boot order in NVRAM is a list of integers but Windows maps it to a list of GUIDS (eventually to maintain analogy with "display order" for {bootmgr}).

Proposed solution not tried and not guarantied to work. I assume that UEFI rescans hardware on cold boot so the list of bootable devices is updated (and deletion of Network from boot order is safe as it will reappear on next boot).

It seems Windows is limiting access to NVRAM for users for some reason (maybe the same reason used for forbidding chain loading Linux/other boot manager/loader on UEFI).

In BCD there are only two mapped NVRAM variables for {fwbootmgr} - "display order"(boot order) and "timeout". But you can set bootnext variable (which has no mapping in BCD).

You can try Visual BCD Editor for viewing complete BCD as well as changing every element and BCD object.

| improve this answer | |

usebcdedit /set {fwbootmgr} bootsequence {GUID} to set one-time boot.

| improve this answer | |
  • Hi @chengxuncc, Welcome to the community. It would be nice to have a little more explanation on your answer, such as explaining the command and the expected results and also what is there in the link you posted, that can be of contribution to the OP or any other person searching for the same problem. Let the link just as a reference to the real explanation. – fboaventura Apr 5 '19 at 1:35

I just posted an answer to this over at another serverfault question: How do I stop Windows 10 Install from modifying BIOS boot settings?

Guessing we might want to close this question as a duplicate of that one since that one has a working answer (apologies for not finding this question first).

| improve this answer | |

I also posted a powershell/bcdedit-based answer over at How do I stop Windows 10 Install from modifying BIOS boot settings?, to supplement aggieNick02's C++ answer. Here it is:

I came up with this powershell script that works for me. It's not perfect because it just "stupidly" moves the first non-Windows boot entry to the top. That works for my purposes and there may be a way to make it smarter that I just didn't find.

It looks long, but it's mostly comments and formatted for comprehension. It could be re-written to 5 or 6 lines.


# This script looks for the first non-Windows Boot Manager entry in the UEFI/GPT boot order and moves it to the top
# For preventing newly installed Windows from hijacking the top boot order spot on my UEFI/GPT image testing VMs
# by mmseng
# https://github.com/mmseng/bcdedit-revert-uefi-gpt-boot-order

# Notes:
# - There's very little point in using this on regular production machines being deployed. Its main use is for machines being repeatedly imaged, or might be useful for lab machines.
# - AFAICT bcdedit provideds no way to pull the friendly names of the devices in the overall UEFI boot order list. Therefore, this script only moves the first entry it identifies in the list which is NOT "{bootmgr}" (a.k.a. "Windows Boot Manager"). It's up to the user to make sure the boot order will exist in a state where the desired result is achieved.
# - In my case, my test UEFI VMs initially have the boot order of 1) "EFI Network", 2) whatever else. When Windows is installed with GPT partitioning, it changes the boot order to 1) "Windows Boot Manager", 2) "EFI Network", 3) whatever else. In that state, this script can be used to change the boot order to 1) "EFI Network", 2) "Windows Boot Manager", 3) whatever else.
# - This functionality relies on the completely undocumented feature of bcdedit to modify the "{fwbootmgr}" GPT entry, which contains the overall list of UEFI boot devices.
# - AFAICT bcdedit is really only designed to edit Windows' own "{bootmgr}" entry which represents one of the "boot devices" in the overall UEFI list.
# - Here are some sources:
#   - https://www.cnet.com/forums/discussions/bugged-bcdedit-349276/
#   - https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/bcd-system-store-settings-for-uefi
#   - https://www.boyans.net/DownloadVisualBCD.html
#   - https://serverfault.com/questions/813695/how-do-i-stop-windows-10-install-from-modifying-bios-boot-settings
#   - https://serverfault.com/questions/714337/changing-uefi-boot-order-from-windows

# Read current boot order
echo "Reading current boot order..."
$bcdOutput = cmd /c bcdedit /enum "{fwbootmgr}"
echo $bcdOutput

# Kill as many of the stupid characters as possible
echo "Removing extraneous characters from boot order output..."
$bcdOutput = $bcdOutput -replace '\s+',''
$bcdOutput = $bcdOutput -replace '`t',''
$bcdOutput = $bcdOutput -replace '`n',''
$bcdOutput = $bcdOutput -replace '`r',''
$bcdOutput = $bcdOutput.trim()
$bcdOutput = $bcdOutput.trimEnd()
$bcdOutput = $bcdOutput.trimStart()
$bcdOutput = $bcdOutput -replace ' ',''
echo $bcdOutput

# Define a reliable regex to capture the UUIDs of non-Windows Boot Manager devices in the boot order list
# This is difficult because apparently Powershell interprets regex is a fairly non-standard way (.NET regex flavor)
# https://docs.microsoft.com/en-us/dotnet/standard/base-types/regular-expressions
# Even then, .NET regex testers I used didn't match the behavior of what I got out of various Powershell commands that accept regex strings
# However this seems to work, even though I can't replicate the results in any regex testers
$regex = [regex]'^{([\-a-z0-9]+)+}'
echo "Defined regex as: $regex"

# Save matches
echo "Save strings matching regex..."
$foundMatches = $bcdOutput -match $regex

# Grab first match
# If Windows Boot Manager (a.k.a. "{bootmgr}" was the first in the list, this should be the second
# Which means it was probably the first before Windows hijacked the first spot
# Which means it was probably my "EFI Network" boot device
$secondBootEntry = $foundMatches[0]
echo "First match: $secondBootEntry"

# Move it to the first spot
echo "Running this command:"
echo "cmd /c bcdedit $bcdParams /set `"{fwbootmgr}`" displayorder $secondBootEntry /addfirst"
cmd /c bcdedit $bcdParams /set "{fwbootmgr}" displayorder $secondBootEntry /addfirst
| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.