Powershell& bcdedit:识别恢复分区

时间:2017-08-29 12:51:45

标签: powershell recovery disaster-recovery bcdedit bcdstore

我正在尝试编写OEM分区的删除/备份脚本(这只是将系统带回到没有实际用途的过时版本)。

在许多系统上,使用DISKPART list partition会返回更多recovery类型的分区:一个是官方的Microsoft Recovery Tools分区(WinRE),其他分区来自OEM。

第一步是安全地识别WinRE分区的位置。我没有找到bcdedit或PS以外的任何直接方式:

$renv=(bcdedit /enum "{default}" | Select-String "^recoverysequence" | Out-String | Select-String "{.+}").Matches.Value
(bcdedit /enum $renv | Select-String "^device" | Out-String | Select-String "\[.+\]").Matches.Value

返回如下字符串:

[\Device\HarddiskVolume1]

其中卷号是Diskpart中要使用的分区。 (可以备份剩余的恢复分区和OEM类型分区。)

这是识别WinRE分区的正确程序吗?

更直接和/或更好的方法?

2 个答案:

答案 0 :(得分:1)

除了使用Lookbehind-RE精简Select-String之外 我看不到ATM的更好方法。

$renv=(bcdedit /enum "{default}" | Select-String "(?<=^recoverysequence\s+)({.+})").Matches.Value
(bcdedit /enum $renv | Select-String "(?<=^device.+)\[.+\]").Matches.Value
[\Device\HarddiskVolume5]

答案 1 :(得分:1)

有一个名为ReagentC的命令行工具,它在路径中,因此您可以从任何管理命令提示符处调用它。

reagentc /info

...将产生一些输出,例如:

Windows RE status:         Enabled
Windows RE location:       \\?\GLOBALROOT\device\harddisk0\partition4\Recovery\WindowsRE
Boot Configuration Data (BCD) identifier: 496c58c4-71cb-11e9-af8f-001c42903d2e
Recovery image location:   
Recovery image index:      0
Custom image location:     
Custom image index:        0

此外,如果您正在编写代码来完成工作,则可以通过调用winapi函数来完成工作,从而发现恢复分区。它是一个令人讨厌的复杂api,但是...值得一提的是,它的DeviceIOControl控制代码为IOCTL_DISK_GET_PARTITION_INFO_EX。如果您不使用C或定义联合的某种语言,这很麻烦。返回的结构随磁盘是GPT还是MBR格式而异。

如果磁盘为MBR,则返回的分区类型将为0x27,如果它是GPT驱动器,则分区类型将为GUID:de94bba4-06d1-4d40-a16a-bfd50179d6ac