Board logo

标题: [求助]请问有没有通用判断系统启动分区盘符的方法? [打印本页]

作者: forumz     时间: 2007-11-12 17:45    标题: [求助]请问有没有通用判断系统启动分区盘符的方法?

就是有boot.ini, ntdect.com等启动文件所在的分区盘符, 一般情况下这个盘符是C盘, 但万一有特殊情况呢, 有没有一个比较通用的判断方法? 小弟需要的是在winxp, win2k系统环境下判断.
作者: lianjiang2004     时间: 2007-11-12 18:50
楼上的不对吧?比如win98在C:\,xp在D:\时,boot.ini在C:\,而%systemdrive%为d:
作者: forumz     时间: 2007-11-12 18:51


  Quote:
Originally posted by lianjiang2004 at 2007-11-12 06:50 PM:
楼上的不对吧?比如win98在C:\,xp在D:\时,boot.ini在C:\,而%systemdrive%为d:

是啊, 就是会有这种情况的出现, 所以%systemdrive%不一定是启动分区
有没类似%ststendrive%的变量是代表启动分区的呢?
作者: fujianabc     时间: 2007-11-12 18:58
楼住这个问题我以前研究过,似乎没有直接的变量代表启动分区,可以编一个批处理,在各个分区根目录寻找启动文件。
当然我以前还试过不给启动分区分盘符,系统能照样正常运行的。
作者: forumz     时间: 2007-11-12 19:16


  Quote:
Originally posted by fujianabc at 2007-11-12 06:58 PM:
楼住这个问题我以前研究过,似乎没有直接的变量代表启动分区,可以编一个批处理,在各个分区根目录寻找启动文件。
当然我以前还试过不给启动分区分盘符,系统能照样正常运行的。

小弟目前能想到的是用遍历c-z盘的方法判断是否存在boot.ini和ntdect.com两个文件来判断启动分区, 这样做一般情况下就没问题, 不过如你所说启动分区不分盘符,或者有些人几个分区都放boot.ini和ntdect.com文件情况也会有, 虽然可能性很微...

是否有可能注册表中某键值会对应着呢, 因为在"启动和故障恢复"设置窗口那系统是可以知道在哪里提取boot.ini文件.

[ Last edited by forumz on 2007-11-12 at 07:35 PM ]
作者: Climbing     时间: 2007-11-13 09:20
一般来说,启动分区就是C:盘,不需要判断。

就算你的XP/2K安装在D:盘,那么它的启动文件,即boot.ini、ntldr等文件也是在C:盘。
作者: greenworld     时间: 2007-11-13 09:54
这个问题好解决,可以肯定的告诉LZ,无论你的系统安装在什么地方,boot.ini, ntdect.com等启动文件都在C盘根目录
作者: fujianabc     时间: 2007-11-13 13:29
楼上两位说得不对,从winpe下winnt32.exe安装xp,如果启动分区和系统分区不是一个分区,就有可能产生系统分区为c:,启动分区为其它盘符。
可以给你们看一下我现在的分区,xp系统分区是c:,包含ntldr等文件的启动分区没分盘符,而像linux一样,把启动分区挂载在系统分区的boot目录下了。

[ Last edited by fujianabc on 2007-11-13 at 01:34 PM ]
附件 1: 2.png (2007-11-13 13:32, 28.17 K, 下载附件所需积分 1点 ,下载次数: 3)



作者: forumz     时间: 2007-11-14 09:02


  Quote:
Originally posted by fujianabc at 2007-11-13 01:29 PM:
楼上两位说得不对,从winpe下winnt32.exe安装xp,如果启动分区和系统分区不是一个分区,就有可能产生系统分区为c:,启动分区为其它盘符。
可以给你 ...

麻烦jujianabc兄再帮帮忙, 按照你这样没给启动分区配置盘符的情况下以下注册表项是什么内容:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup  下的 BootDir 键值的内容是什么呢? 谢谢~
作者: fujianabc     时间: 2007-11-14 10:21


  Quote:
Originally posted by forumz at 2007-11-14 09:02 AM:


麻烦jujianabc兄再帮帮忙, 按照你这样没给启动分区配置盘符的情况下以下注册表项是什么内容:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup  下的 BootDir 键值的内容是什么呢? 谢谢~

我现在这个键值是G:\,但我没有分区的盘符是G:。
但我觉得你好像找对地方了,我这种情况你就不用考虑了,估计没有其他人会这样做的,我这样做的目的就是不让任何软件来自动修改boot.ini。
作者: forumz     时间: 2007-11-14 10:52
嗯, 大致也就只能做到这步了. 估计win系统将你的这个boot分区自动分配了一个你不用的盘符作为内部识别使用吧.

不过抱着研究的心态想问问:
1. 按你的设置, 在 我的电脑点右键->属性->系统属性->高级->启动和故障恢复 界面里面按"编辑"键 会跳出 boot.ini 文件的修改吗?
2. 另外 那些系统安全软件例如 sreng2.5 等还能读取你系统的 boot.ini 文件吗?  
3. 如果在"运行"输入 "notepad g:\boot.ini" 会怎样呢?

纯粹是比较好奇想知道系统和那些安全软件是如何获得boot.ini文件位置的, 麻烦fujianabc兄了.
作者: lianjiang2004     时间: 2007-11-14 12:40
似乎甚至可以把c:隐藏掉,来启动D:\的xp吧?
作者: fujianabc     时间: 2007-11-14 16:08


  Quote:
Originally posted by forumz at 2007-11-14 10:52 AM:
嗯, 大致也就只能做到这步了. 估计win系统将你的这个boot分区自动分配了一个你不用的盘符作为内部识别使用吧.

不过抱着研究的心态想问问:
1. 按你 ...

这些我早就试过了,系统属性,msconfig,以及bootcfg命令都找不到boot.ini文件,g:当然是不能访问。
另外,还想提一点,以前我试过从软盘引导ntldr/boot.ini,也能启动硬盘上的xp,启动后拿掉软盘,系统也会找不到boot.ini的。
作者: fujianabc     时间: 2007-11-14 16:11


  Quote:
Originally posted by lianjiang2004 at 2007-11-14 12:40 PM:
似乎甚至可以把c:隐藏掉,来启动D:\的xp吧?

我同学以前不知道怎么装了一个xp,系统分区和启动分区都是d:,而且系统没分c:盘,硬盘盘符是从d:开始的。
因为c:空闲,他的xp上插上u盘,系统就会把u盘分成c:。
作者: forumz     时间: 2007-11-14 17:56
用这种方法来保护启动分区果然够绝

真是学习了~~
作者: fastslz     时间: 2007-11-14 22:31
确实没有变通的方法,你们说的情况我都遇到过,自己也尝试各种各样的安装方式,最后还是用判断boot.ini windows winnt io.sys这些特定的文件来定位。甚至用磁盘工具来分析如gdisk32 ghost32还有GOTOmsdos兄的TOdisk。真的没什么好方法
作者: fastslz     时间: 2007-11-15 10:14
大家看看这个通用性怎样
@echo off
for /f "skip=2 tokens=1* delims=," %%a in ('WMIC Path Win32_DiskPartition Where "BootPartition=true" Get DeviceID /Format:csv') do set BootPartition=%%b
for /f "tokens=1 delims=[]" %%a in ('WMIC Path Win32_LogicalDiskToPartition Get Antecedent^,Dependent /Format:list ^| find /n "=" ^| find /i "%BootPartition%"') do set LineNum=%%a
set /a LineNum+=1
for /f "tokens=3 delims=="  %%a in ('WMIC Path Win32_LogicalDiskToPartition Get Antecedent^,Dependent /Format:list ^| find /n "=" ^| findstr /b /l /c:"[%LineNum%]"') do set BootDrive=%%~a
for /f "tokens=1,2 delims=," %%a in ("%BootPartition%") do (set BootDisk=%%a)&(set BootPartition=%%b)
set BootPartition=%BootPartition:~1%
set BootDrive=%BootDrive:"=%
set Boot
pause

作者: forumz     时间: 2007-11-15 16:34


  Quote:
Originally posted by fastslz at 2007-11-15 10:14 AM:
大家看看这个通用性怎样
@echo off
for /f "skip=2 tokens=1* delims=," %%a in ('WMIC Path Win32_DiskPartition Where "BootPartition=true" Get DeviceID /Format:csv ...

请教楼上如何使用, 我复制到批处理文件中执行没反应哦

小弟现在用直接读注册表的方法
for /f "skip=4 tokens=3" %%i in ('reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\ /v bootdir') do Set bootdir=%%i
[ Last edited by forumz on 2007-11-15 at 04:36 PM ]
作者: fastslz     时间: 2007-11-15 17:06
需要WMIC命令,XP Home.2000没有该命令
作者: forumz     时间: 2007-11-15 17:25
可以执行了, 原来调用WMIC有点慢, 我看到没反应就关掉执行批处理的那个窗口了. 等了一会执行完返回的的 bootdrive 貌似不是我电脑的启动分区.

我这里是两个硬盘, 启动硬盘是Disk #0, 启动分区是C:
脚本执行后返回
BootDisk=Disk #1
BootDrive=H:
BootPartition=Partition #0

H: 盘是我的WINXP系统下第二个硬盘的第一分区

是否脚本没考虑多硬盘的可能性呢?  因为第一句的 for 循环执行了两次, bootpartition 先被赋了disk #0的信息, 然后再赋了 disk #1 的信息.
作者: fastslz     时间: 2007-11-15 17:41
BootDisk=Disk #1
BootDrive=H:
BootPartition=Partition #0

我也是双硬盘显示
BootDisk=Disk #0
BootDrive=C:
BootPartition=Partition #0

估计你的第2个硬盘在IDE主位置,我试了删除C盘boot.ini,ntldr.io.sys改变你上面所说的注册表键值,及%windir%还是正确判断的,估计WMIC读取 BIOS和硬盘信息分析的
不过还发现当插入U BootDrive也就是U盘盘符了
作者: fastslz     时间: 2007-11-15 17:51
哦忘了说明我第2硬盘主分区是可引导的包含boot.ini
作者: forumz     时间: 2007-11-15 17:54
我两个硬盘分别是 IDE1的Master 和IDE2的Master, 启动分区所在的硬盘是IDE1的Master.

第二硬盘是没有可启动的分区的

[ Last edited by forumz on 2007-11-15 at 05:55 PM ]
作者: fastslz     时间: 2007-11-15 18:28
我是80线上Master slave,所以说吧安装硬件方式也各种各样的,这代码也不通用
作者: forumz     时间: 2007-11-15 18:40
看来还是遍历判断特定文件方法算是比较简单通用的了, 判断后给用户一个提示, 如果不对让用户手动输入启动分区盘符, 哈哈, 解决....