Изменение порядка загрузки uEFI из Windows

Я не могу заставить Windows изменить порядок загрузки uEFI на загрузку PXE сначала из Windows. Я пытаюсь автоматизировать систему, чтобы она каждый раз загружалась через PXE, чтобы я мог контролировать параметры загрузки. Я пробовал BCDEdit:

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

Есть ли что-то вроде efibootmgr для windows?

5 ответов

Удаление {GUID} загрузчика для сети из {fwbootmgr}/"порядка отображения" (сопоставленного с "порядком загрузки" в NVRAM) и повторное добавление его в качестве первого в конечном итоге изменит порядок загрузки NVRAM.

Порядок загрузки в NVRAM - это список целых чисел, но Windows отображает его в список GUIDS (в конце концов, чтобы сохранить аналогию с "порядком отображения" для {bootmgr}).

Предлагаемое решение не опробовано и не гарантировано для работы. Я предполагаю, что UEFI повторно сканирует оборудование при холодной загрузке, поэтому список загрузочных устройств обновляется (и удаление сети из порядка загрузки является безопасным, поскольку оно появится снова при следующей загрузке).

Похоже, Windows почему-то ограничивает доступ к NVRAM для пользователей (возможно, по той же причине, по которой запрещается последовательная загрузка Linux/ другого менеджера загрузки / загрузчика в UEFI).

В BCD есть только две сопоставленные переменные NVRAM для {fwbootmgr} - "порядок отображения" (порядок загрузки) и "время ожидания". Но вы можете установить переменную bootnext (которая не имеет отображения в BCD).

Вы можете попробовать Visual BCD Editor 0.9.0.1 для просмотра полной BCD, а также для изменения каждого элемента и объекта BCD.

Dell Предоставляет утилиту Dell Command Configure, которая поможет вам настроить порядок загрузки всех клиентских систем из Windows и во время развертывания ОС с помощью последовательности задач SCCM.

http://en.community.dell.com/techcenter/enterprise-client/w/wiki/7532.dell-command-configure

Использование bcdedit /set {fwbootmgr} bootsequence {GUID} установить одноразовую загрузку.
https://github.com/chengxuncc/booToLinux

Я только что опубликовал ответ на этот вопрос на другом вопросе о сбое сервера: как остановить установку Windows 10 из-за изменения настроек загрузки BIOS?

Полагаю, мы могли бы захотеть закрыть этот вопрос как дубликат этого, поскольку у него есть рабочий ответ (извинения за то, что не нашли этот вопрос первым).

Я также разместил ответ на основе powershell/bcdedit в разделе Как остановить установку Windows 10 из-за изменения настроек загрузки BIOS?, чтобы дополнить ответ С ++ aggieNick02. Вот:


Я придумал этот скрипт PowerShell, который работает для меня. Он не идеален, потому что просто "тупо" перемещает первую загрузочную запись, отличную от Windows, в начало. Это работает для моих целей и может быть способ сделать это умнее, чего я просто не нашел.

Это выглядит долго, но это в основном комментарии и отформатированы для понимания. Это может быть переписано в 5 или 6 строк.

https://github.com/mmseng/bcdedit-revert-uefi-gpt-boot-order

# 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://faultserver.ru/questions/813695/how-do-i-stop-windows-10-install-from-modifying-bios-boot-settings
#   - https://faultserver.ru/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
Другие вопросы по тегам