2/09/2007

BCD / NTMGR / BCDEDIT

BCDEdit命令简介通过命令行工具Bcdedit,我们可以添加、删除及修改BCD (Boot Configuration Data)中的对象。在BCD中,每个对象均具有唯一的 GUID (Globally Unique Identifier : 全局唯一标识符),如系统中的每块硬盘、每个分区的GUID (全局唯一标识符)均不相同。在BCD中,硬盘或分区的GUID可分为如下几类:
{legacy}:指存在上一代Windows系统如Windows XP的硬盘或分区;
{default}: 默认操作系统所在硬盘或分区;
{current}: 当前硬盘或分区;
{c34b751a-ff09-11d9-9e6e-0030482375e7}: 类似于这个格式的GUID指其他安装了操作系统的硬盘或分区。 (注:这只是个例子,具体数字根据硬盘或分区参数会有相应变化,但均会类似于{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}格式)。
BCDEDIT命令
bcdedit /?: 显示命令帮助
bcdedit.exe /? CREATESTORE: 显示命令参数“ CREATESTORE ”的详细信息,——当然,“ CREATESTORE ”也只是示例,使用中对其他任何可用参数也均可使用类似格式查看该参数的具体说明。
bcdedit 或 bcdedit /enum all: 显示Windows Vista系统当前的启动设置数据,这时系统中所有安装了操作系统的硬盘或分区均会显示相应的 GUID 标识,如 {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} 。
使用BCDEdit备份与恢复启动选项 在对Windows Vista的启动选项修改之前,最好先对其备份,以防万一操作失误或其他故障导致系统无法启动。 bcdedit /export “D:\BCD Backup\Bcd Backup”: 将启动设置备份到D盘 “BCD Backup” 目录下;
bcdedit /import “D:\BCD Backup\Bcd Backup”: 恢复之前备份在D盘 “BCD Backup”目录下启动选项。
使用BCDEdit修改启动菜单选项作为一种良好的操作习惯,在对Windows Vista的启动选项进行任何修改前,首先要对BCD中的启动选项进行备份,相应的命令上页我们已介绍过,在此不再赘述;其次,使用“bcdedit ”或“ bcdedit /enum all ”来查看系统中硬盘或分区的正确 GUID 标识,并将其记录下来。毕竟,BCDEdit只是一款命令行工具,我们操作时需手动输入类似“{xxxxxxxx-xxxx-xxxx-xxxx- xxxxxxxxxxxx}”这样的长字符串时,很容易出错,而这往往会导致Windows Vista启动失败。下面详细介绍使用BCDEdit修改启动选项的常用命令格式: bcdedit /set {legacy} Description “Windows XP Professional SP2”: 修改上一代操作系统在启动菜单中的显示内容,比如说我们也可将其修改为“Vista天地专用XP SP2”之类。注意,命令中的引号不可省略;
bcdedit /set {current} description “Windows Vista Build 5270 x86″: 修改当前启动硬盘或分区上的操作系统在启动菜单中的显示内容。注意,当前分区上的操作系统可能为Windows Vista,也可以是其他系统,当然,命令中的引号也不可省略;
bcdedit /set {5189b25c-5558-4bf2-bca4-289b11bd29e2} description “Windows Vista Build 5270 x64”: 修改安装于其他硬盘或分区的系统在启动菜单中的显示内容,使用这项命令时一定要注意该硬盘/分区的GUID输入正确,相应的GUID可通过“ bcdedit ”或“ bcdedit /enum all ”命令查看。
bcdedit /default {current} : 将当前启动硬盘/分区中的操作系统设置为默认启动的系统;
bcdedit /default {5189b25c-5558-4bf2-bca4-289b11bd29e2}: 设置指定GUID上的操作系统为默认启动的系统;
bcdedit /default {legacy}: 设置上一代Windows 系统Windows XP为默认启动的系统;
bcdedit /displayorder: 设置启用菜单中各项的显示顺序,如: bcdedit.exe /displayorder {legacy} {current}将首先显示Windows XP,然后再显示默认启动的系统如Windows Vista;
bcdedit /timeout 15 : 将默认的启动菜单显示时间30秒更改为15秒,当然,您可以将这个时间修改为任何您希望的数值。
使用BCDEdit修复硬盘/分区结构错误 在对启动选项的修改过程中,如添加或删除某个硬盘/分区时,可能会因操作中的不慎导致硬盘/分区结构的混乱,除了采用恢复修改前的备份方法外,也可以首先使用BCDEdit来尝试一下修复。具体方法如下: X:\>X:\boot\fixntfs.exe -lh -all :这时的“ X: ”指引导目录 “boot” 所在的硬盘/分区;
bcdedit /set {5189b25c-5558-4bf2-bca4-289b11bd29e2} device partition=X: : 将指定GUID的分区设为启动分区。注意,这里的“ X: ”的GUID须与指定值不同,同时,运行该命令后,必须接着运行下面的osdevice命令;
bcdedit /set {5189b25c-5558-4bf2-bca4-289b11bd29e2} osdevice partition=X:: 将指定GUID的分区设为启动分区。注意,这个命令必须与上面的device命令配对使用,同时“ X: ”的GUID须与指定值不同。
运行->CMD,进入命令行窗口,改变当前目录到X:\WINDOWS\SYSTEM32(X是你安装VISTA的盘符)输入BCDEDIT,回车下面是我的计算机输入BCEDIT的结果:Windows Boot Manager--------------------Identifier: {bootmgr}Type: 10100002Device: partition=C:Description: Windows Boot ManagerLocale: ENG-USInherit options: {emssettings}{dbgsettings}Default: {2d0d9c22-4a77-11da-a56e-d40c063bbf5e}Display order: {legacy}{2d0d9c22-4a77-11da-a56e-d40c063bbf5e}{1625d476-43a5-11da-a549-f1ee9bdf6971}{2f3cc56a-43b8-11da-8c03-d55e13bb3670}{33e42816-4a65-11da-aed2-c823da34f85e}{871d0272-45a7-11da-8068-a7b82002f671}{90f4c1fe-43ea-11da-b377-f72b86a72270}Timeout: 30Windows Legacy OS Loader------------------------Identifier: {legacy}Type: 10300006Device: partition=C:Path: \ntldrDescription: Legacy (pre-Longhorn) Microsoft WindowsWindows Boot Loader-------------------Identifier: {2d0d9c22-4a77-11da-a56e-d40c063bbf5e}Type: 10200003Device: partition=E:Path: \Windows\system32\winload.exeDescription: Microsoft Windows Vista 64Locale: ENG-USInherit options: {emssettings}{dbgsettings}Windows device: partition=E:Windows root: \WindowsNo Execute policy: OptInWindows Boot Loader-------------------Identifier: {1625d476-43a5-11da-a549-f1ee9bdf6971}Type: 10200003Device: partition=D:Path: \Windows\system32\winload.exeDescription: Microsoft Windows Vista 32Locale: ENG-USInherit options: {emssettings}{dbgsettings}Windows device: partition=D:Windows root: \WindowsNo Execute policy: OptInDetect hal: Yes简单说明一下:我的计算机上C盘装了XP32,D盘装了VISTA32,E盘装了VISTA64,缺省启动是E盘的VISTA64启动后显示启动菜单,等待时间是30秒,有3个选项,分别是Legacy (pre-Longhorn) Microsoft Windows,Microsoft Windows Vista 64和Microsoft Windows Vista 32所以猜测如下:Windows Boot Manager--------------------Identifier: {bootmgr}Type: 10100002Device: partition=C: BOOT MANAGER是装在C区的Description: Windows Boot ManagerLocale: ENG-USInherit options: {emssettings}{dbgsettings}Default: {2d0d9c22-4a77-11da-a56e-d40c063bbf5e} 这是缺省启动项Display order: {legacy} 第一个菜单项{2d0d9c22-4a77-11da-a56e-d40c063bbf5e} 第二个菜单项{1625d476-43a5-11da-a549-f1ee9bdf6971} 第三个菜单项{2f3cc56a-43b8-11da-8c03-d55e13bb3670} 未知{33e42816-4a65-11da-aed2-c823da34f85e} 未知{871d0272-45a7-11da-8068-a7b82002f671} 未知{90f4c1fe-43ea-11da-b377-f72b86a72270} 未知Timeout: 30 等待时间是30秒Windows Legacy OS Loader------------------------Identifier: {legacy} 这是第一个菜单项Type: 10300006Device: partition=C: 启动分区是CPath: \ntldr 使用\NTLDR作为引导程序Description: Legacy (pre-Longhorn) Microsoft Windows 显示为Legacy (pre-Longhorn) Microsoft WindowsWindows Boot Loader-------------------Identifier: {2d0d9c22-4a77-11da-a56e-d40c063bbf5e} 这是第二个菜单项(注意这个才是唯一的ID,不会重复的)Type: 10200003Device: partition=E: 启动分区是EPath: \Windows\system32\winload.exe 使用\Windows\system32\winload.exe作为引导程序Description: Microsoft Windows Vista 64 显示为Microsoft Windows Vista 64Locale: ENG-USInherit options: {emssettings}{dbgsettings}Windows device: partition=E:Windows root: \WindowsNo Execute policy: OptInWindows Boot Loader-------------------Identifier: {1625d476-43a5-11da-a549-f1ee9bdf6971} 这是第三个菜单项(注意这个才是唯一的ID,不会重复的)Type: 10200003Device: partition=D: 启动分区是DPath: \Windows\system32\winload.exe 使用\Windows\system32\winload.exe作为引导程序Description: Microsoft Windows Vista 32 显示为Microsoft Windows Vista 32Locale: ENG-USInherit options: {emssettings}{dbgsettings}Windows device: partition=D:Windows root: \WindowsNo Execute policy: OptInDetect hal: Yes对BCDEDIT的简单探索:BCDEDIT 查看当前启动菜单内容BCDEDIT -? 查看BCDEDIT命令帮助BCDEDIT -? -xxxxx 查看BCDEDIT能够使用的命令选项的帮助(其中的xxxxx可以是TIME, DELETE, SET等等)有用的命令:BCDEDIT -TIME 30 设置启动菜单等待时间为30秒BCDEDIT -DELETE {2d0d9c22-4a77-11da-a56e-d40c063bbf5e} 删除Identifier为{2d0d9c22-4a77-11da-a56e-d40c063bbf5e}的菜单项,如果没有发现这个Identifier的有效菜单,则什么也不做,推荐使用BCDEDIT -DELETE {2d0d9c22-4a77-11da-a56e-d40c063bbf5e} 强制删除Identifier为{2d0d9c22-4a77-11da-a56e-d40c063bbf5e}的菜单项,请一定小心使用BCDEDIT -SET {2d0d9c22-4a77-11da-a56e-d40c063bbf5e} Description "MY god1" 将Identifier为{2d0d9c22-4a77-11da-a56e-d40c063bbf5e}的菜单的显示文字改为MY god1(注意:如果中间有空格,则要包括在引号中)其他命令选项我暂时不需要用,所以没有试了.我使用这个命令删除了重复安装时多出来的菜单,并将VISTA32和VISTA64改名以便区分
注意是在Macbook上,不是PC上,就是说必须有MacBook。 Windows Vista拥有全新的启动管理器,作者利用它实现了Vista与OS X的双重启动。启动到Mac OS X。打开Terminal(终端)程序,输入以下命令将 boot.efi 复制到桌面: cp /usr/standalone/i386/boot.efi ~/Desktop/复制boot.efi 到USB闪存上. 启动到Vista,复制boot.efi到C: 以管理员身份打开Command Prompt. 需要探测你是否有继承的启动加载器,在Command Prompt窗口输入. bcdedit /enum all find "{ntldr}"如果返回:identifier {ntldr}那么就是有继承的启动加载器,进行步骤6、7;如果没有返回任何内容就忽略步骤6、7. 将下列内容复制到继承启动加载器. bcdedit /copy {ntldr} /d "Mac OS X"bcdedit /set {YOUR-GUID-HERE} device bootbcdedit /set {YOUR-GUID-HERE} path boot.efibcdedit /displayorder {YOUR-GUID-HERE} /addlast要将其中的YOUR-GUID-HERE使用世纪的GUID替代,可以这样察看GUID:C:>bcdedit /copy {ntldr} /d "Mac OS X"The entry was successfully copied to {bcfa924e-07e0-11db-9d86-accf6fd346a1}.C:>bcdedit /set {bcfa924e-07e0-11db-9d86-accf6fd346a1} device bootThe operation completed successfully.C:>bcdedit /set {bcfa924e-07e0-11db-9d86-accf6fd346a1} path boot.efiThe operation completed successfully.C:>bcdedit /displayorder {bcfa924e-07e0-11db-9d86-accf6fd346a1} /addlastThe operation completed successfully.输入以下内容创建继承加载器. bcdedit /create {ntldr} /d "Mac OS X"bcdedit /set {ntldr} device bootbcdedit /set {ntldr} path boot.efibcdedit /displayorder {ntldr} /addlast
关于BCD文件,我们需要关注的内容只有Objects下的内容,在Objects下,有很多以CLSID命名的子键,每一个子键均有其特殊的含义,对于Windows启动来说,启动项目的子键总是成对出现的。如上图所示,{50c73d4c-e6b3-11da-bc73-d30cdb1ce216}和{50c73d4d-e6b3-11da-bc73-d30cdb1ce216}就是一对。唯一的差别只在于第一个段的最后一个字符不同,其余的内容完全相同。Windows Vista 的Boot Manager将根据CLSID来识别不同的启动项目。 展开每一个CLSID键,一般都会有2个字键:Description和Elements。在Elements键下方,会有树木不等的子键存在,每一个子键都代表不同的含义。有一些是显示的内容,有一些是指向一些特殊的程序或目录用于Windows Vista 的启动,剩下的一些和Windows Vista 的启动参数有关。 例如: l 12000004键下的Element字符串内容就是用于设定在 Boot Manager 的启动菜单上显示内容的。如下图所示,我已经将Windows Vista安 装以后默认的启动菜单上的Microsoft Windows 字样修改为 Microsoft Windows Vista Beta 2 X86 EN。这样在系统启动的时候,就可以 很明确的知道安装的Windows Vista是什么版本了。l 12000005 键用于指定Boot Manager的语言,如果安装了 Windows Vista 的简体中文版本,那么这里的内容一定是 zh-CN,如果你想使用英文版的Boot Manager,那么只需要修改为 en-US即可。不过前提是需要在C:\Boot 目录下有一个 en-US的目录,而且里面有相应的en-US语言的资源文件。l 42000002键用于指定 Windows Vista 的引导程序。在Windows Vista里面,引导程序已经改为 winload.exe。l 而 22000002节点用于指定 Windows Vista 安装以后的系统目录的名字,默认是 Windows目录。l 如果休眠模式,那么22000002节点用于指向休眠文件的文件名,默认是 hiberfil.sys文件。l 42000002节点用于设置从休眠模式唤醒时由哪个程序完成休眠状态à正常状态的转化。在Windows Vista 里面,这个程序叫做 winresume.exe。l 如果安装了早期的采用 NTLDR引导的操作系统,如Windows 2000/XP/Server 2003,那么Boot Manager将出现一个叫做{466f5a88-0af2-4f76-9038-095b170dc21c}的CLSID,这个CLSID用于代表采用NTLDR启动模式的操作系统的引导程序的名字。当用户从 Boot Manager里面选择 Earlier version of Windows菜单项目以后,Boot Manager将根据12000002节点指向的内容调用早期Windows操作系统的引导程序,默认为NTLDR。l {9dea862c-5cdd-4e70-acc1-f32b344d4795}是一个专用于代表 Windows Boot Manager的CLSID。l 在{9dea862c-5cdd-4e70-acc1-f32b344d4795}键下面,有一个叫做24000001的子键,这个键用于指定将要显示在Windows Boot Manager上的操作系统启动菜单的CLISD编号。24000001子键的Element键是一个REG_MULTI_SZ类型的注册表键值,这表示可以写入多个内容。在我的系统上面,这个键值数据有3项,这代表了我的系统至少安装了3个操作系统,而且安装了采用NTLDR引导的早期的Windows操作系统。实际上,Element键值反映的问题的确和真实的情况一致,我的确在我的机器上安装了Windows XP、Windows Vista Beta 2 X86 EN和 Windows Vista Beta Build 5XXX 3个操作系统。\需要注意的是,Windows Vista 新增的 Windows Memory Diagnostic 项目的并不属于{9dea862c-5cdd-4e70-acc1-f32b344d4795}键,它是作为一个单独的键{b2721d73-1db4-4c62-bf78-c548a880142d}存在的。最后需要说明的是,Windows Vista 对BCD键是采用了保护措施的。Windows Vista 默认设定,只允许 SYSTEM 用户能够完全控制这个键,而Administrators组用户只有读取的权限,没有开枪写入的权限。而其他类型的用户则根本没有查看的权限。换句话说,要修改这个键,就需要手动调整注册表的安全描述符的内容了。调整注册表安全描述符的方法很简单,只需要右键点击将要被修改的键,然后选择权限,然后点击添加按钮把自己的账户加入列表,并打开写入权限即可,这里不再详细的描述.

0 comments: