我们正在通过 iPXE 将一些系统设置为 PXEboot,并且根据主服务器状态,正常启动或通过 wimboot 和 MDT 重新映像。系统配置为首先从网络引导。iPXE 和 wimboot 都在 UEFI 下运行。
它工作得很好,除了在 Windows 安装结束时,BIOS 已被修改为指向新的 Windows 引导管理器作为主引导设备。因此,如果不进入 bios 和更改设置,它就无法再次成像。
我理解为什么引导顺序会因为 wimboot/MDT 过程涉及多次重新启动而改变。但我真的很想将 PXE 始终作为主引导,或者在完成后将引导顺序重新设置为网络优先。(我的 PXE 服务器将传递网络引导机会,以允许安装工作或在不需要映像时让系统独立运行。)
更新 -我看到两种可能性:
- 弄清楚 windows 安装程序如何告诉 UEFI 从目标安装磁盘启动,并在 windows 安装完成后执行相同的操作以设置回 PXE 启动。
- 安装 Windows 后使用 Windows 引导管理器和 BCDEdit 将 PXE 引导选项置于从本地磁盘引导之上(在超级用户处发现的问题与此处基本相同。讨论的最终结果并不是我真正想要的( PXE 首先在 UEFI 设置中)但可能会产生相同的行为(PXE 启动总是有机会在 Windows 启动之前采取行动)。
学到了以下内容:
一旦我了解了引导顺序和 Windows API 的 UEFI 规范,代码(C++,为 64 位构建,因为这就是我们所使用的全部)并不算太糟糕。这需要内置到一个需要管理权限并静态链接windows运行时的exe中,然后我在安装操作系统后在MDT中运行它,然后再重新启动。
首先,您必须声明调用 API 的特权。使用一个小帮手:
然后打电话
接下来,获取引导选项列表(uint16_t 值的串联):
然后,您可以遍历每个引导选项,为其形成 Boot#### 变量名称,然后使用它来获取包含有关该选项的信息的结构。您需要查看第一个活动选项的“描述”是否等于“Windows 启动管理器”。描述是结构中偏移量 6 处的以空字符结尾的宽字符串。
现在,如果您发现活动的 WBM 和非 WBM 引导选项,并且第一个 WBM 选项位于 wbmOffset,并且第一个非 WBM 选项位于 nonWBMOffset,且 wbmOffset < nonWBMOffset,则将 BootOrder 变量中的条目交换为以下内容:
我想出了这个适用于我的 powershell 脚本。它并不完美,因为它只是“愚蠢地”将第一个非 Windows 启动项移动到顶部。这适用于我的目的,并且可能有一种方法可以让它变得更聪明,而我只是没有找到。
它看起来很长,但主要是注释和格式以便于理解。它可以重写为 5 或 6 行。
https://github.com/mmseng/bcdedit-revert-uefi-gpt-boot-order