【发布时间】:2023-03-24 15:16:01
【问题描述】:
我正在尝试使用 VBScript 以编程方式创建 Windows 7 BCD 存储。构建存储本身、BootMgr 和 OS Loader 似乎很顺利,就像为每个对象填充大部分元素一样。我遇到麻烦的地方是填充 device 和 osdevice 元素。这是有效的代码:
Const BootMgrId = "{9dea862c-5cdd-4e70-acc1-f32b344d4795}"
BootLdrId = Left(CreateObject("Scriptlet.TypeLib").Guid,38)
Set objStoreClass = GetObject("winmgmts:{(Backup,Restore)}\\.\root\wmi:BcdStore")
objStoreClass.CreateStore "m:\boot\BCD", objStore
objStore.CreateObject BootMgrId, &h10200002, objBootMgr
objStore.CreateObject BootLdrId, &h10200003, objBootLdr
objBootLdr.SetStringElement &h12000002, "\windows\system32\boot\winload.exe"
objBootLdr.SetStringElement &h12000004, "DiskWipe"
objBootLdr.SetStringElement &h22000002, "\windows"
objBootLdr.SetBooleanElement &h26000022, True
我遇到问题的代码是:
objBootMgr.SetPartitionDeviceElement &h11000001, 2, "", "m:"
objBootLdr.SetPartitionDeviceElement &h11000001, 2, "", "m:"
objBootLdr.SetPartitionDeviceElement &h21000001, 2, "", "m:"
我在语句末尾尝试了几种分区路径的变体,包括从 win32_Volume 报告的分区的 DeviceId、旧的 boot.ini 样式 ARC 路径、“partition=”和其他语法似乎在 bcdedit 中工作。
一些笔记。最终目标是在同一个物理磁盘上使用另一个分区。我不相信 SetPartitionDeviceElement 是正确的使用方法(它似乎完全是为了 vhds 的利益)。相反,如果我使用:
objBootMgr.SetDeviceElement &h11000001, 1, ""
objBootLdr.SetDeviceElement &h11000001, 1, ""
objBootLdr.SetDeviceElement &h21000001, 1, ""
device 和 osdevice 元素似乎正确填充并反映了当前的引导分区,但是当我将活动分区更改为该新 BCD 的分区时,新的 BCD 已打开并重新启动,幸运的是没有错误,但它无法启动。这并不奇怪,因为这种方法不允许指定特定分区。我可以使用 bcdedit 和
使其工作bcdedit -store m:\boot\bcd -set {bootmgr} device partition=m:
和
bcdedit -store m:\boot\bcd -set %guid% osdevice partition=m:
bcdedit -store m:\boot\bcd -set %guid% device partition=m:
其中 %guid% 是 OS Loader 的 GUID。
这方面的有用信息非常少。我对 BCD WMI Provider 上的 MSDN pages 和 BCD 上的旧 MS word 文档非常了解。我还发现 Visual BCD 编辑器在整理对象和元素类型方面有一些用处,但我真的坚持这个。有人吗?
【问题讨论】: