【问题标题】:Unable to set DeviceElements for a Windows BCD with WMI无法使用 WMI 为 Windows BCD 设置 DeviceElements
【发布时间】: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、旧的 bo​​ot.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 编辑器在整理对象和元素类型方面有一些用处,但我真的坚持这个。有人吗?

【问题讨论】:

    标签: vbscript wmi bcdstore


    【解决方案1】:

    好的。我想出了这个。选项如下:

    objBootMgr.SetPartitionDeviceElement &h11000001, 2, "", "\Device\Harddisk0\Partition3"
    

    对于磁盘/分区相关的语法,或

    objBootMgr.SetPartitionDeviceElement &h11000001, 2, "", "\Device\HarddiskVolume3"
    

    用于独立于磁盘的卷语法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-17
      • 1970-01-01
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      • 2018-11-09
      • 2019-12-18
      • 1970-01-01
      相关资源
      最近更新 更多