Windows2000磁盘扫描功能

Windows2000/XP 系统磁盘扫描已经升级到卷的高度 , 不再是简单的 SCANDISK 。卷被定义为包含文件系 统的分区 , 它可以用驱动器号/卷安装点或全局唯一标识符(GUID) 来寻址 。我们可以在系统运行时强制进行卷 检查 , 或安排在重新启动时进行卷
检查 , 如果使用脚本还可以更准确地控制何时在卷上进行文件系统检查 。要掌握磁盘扫描特点 , 需要灵活使用下面相互关联的3个工具:Chkdsk.exe、 Chkntfs.exe 以及Autochk.exe 。让我们先来简单认识一下他们 。
chkdsk.exe
检查硬盘驱动器的完整性 , 检查磁盘和修复文件系统就靠它了 。chkdsk.exe 同时可以恢复文件系统错误 , 并可以试图恢复坏扇区 , 如果无法修复就标记坏扇区 , 以避免文件被误写入导致丢失 。
Chkntfs.exe
显示文件系统类型、文件系统“脏字位”状态 , 以及手工安排启动时运行 Chkdsk进行卷检查 , 或取消所 有安排的检查项目等 。
Autochk.exe
查找每个卷上的“脏字位” , 以及 Chkdsk /F 和 Chkntfs /X 或 /C 所作的注册表设置 , 决定是检查卷 , 还是跳过检查 。它可以区分是手工安排的卷检查 , 还是由于文件系统发现卷处于“脏”状态而自动进行卷检查 , 并会把相应的消息写入应用程序事件日志 。该命令不能在 WIN32 模式下运行 。

一、在系统运行时强制进行卷检查
安装 Windows2000/XP 后 , “系统工具”文件夹中不显示磁盘扫描命令 。不是没有了 , 具体这样做:
双击我的电脑 , 然后右键单击要检查的硬盘驱动器 。
单击属性 , 然后单击工具 。
在查错下 , 单击开始检查 。
这样就可以在 Windows 中检查硬盘驱动器的完整性了 。
或者到命令提示符下执行CHKDSK /X 命令 。
/X 是一个新的命令参数 , 它运行 Chkdsk /F , 并强制执行卷卸除 , 关闭非系统卷上打开的文件句柄 , 以 便立即对卷进行检查 。这样 , 要运行 Chkdsk 并修复卷 , 就不必重新启动 。
二、安排在下一次重新启动时进行卷检查
Autochk 通过有2个因素控制是否进行卷检查或跳过检查 。一个是当文件系统检测到问题时 , 系统自己设置 的“脏字位” , 设置脏字位的的目的就是为了在下次启动时对卷进行检查 。另一个是人工安排 , 既用 Chkdsk; /F 和 Chkntfs /X 或 /C 所作的注册表设置 。通过 Chkntfs volume:命令可以查询文件系统类型、文件系统 “字位”状态 , 以及是否已手工安排启动时运行 Chkdsk 进行卷检查等信息 。
Autochk 在确定启动时检查哪些卷所使用的注册表项为:
Hkey_local_MachineSystemCurrentControlSetControlSession ManagerBootExecute:REG_MULTI_SZ:; autocheck autochk *
这是 Autochk 的默认设置 , 也是使用 Chkntfs /d 安排启动时检查所有卷所得到的结果 。
下面通过设置或重设注册表 , 来控制 Autochk 。
命令 BootExecute键植
Chkdsk C: /F autochk /p ??C:;
Chkdsk C:mountpoint /F; Autocheck autochk /p ??VOLUME{GUID};
Chkntfs D: E: /X Autocheck autochk /k:D /k:E *;
Chkntfs G: /CAutocheck autochk /m ??G:;
注解:
/P ??Volume:安排 Chkdsk 无条件地运行来检查卷 。;
/p ??VOLUME{GUID}; 安排 Chkdsk 无条件地运行来检查卷安装点 。;
/k:Volume *; 不对卷执行 Chkdsk 检查 。;
/m ??Volume:让 Autochk 仅查找卷上的脏字位 , 如果已设置脏字位 , 则运行 Chkdsk 。;
另外 , Chkntfs /T:time: 在默认情况下 , 开机时扫描每个分区前会等待10秒钟 , 用户此时可以按任意键 跳过扫描继续启动 。该参数就是用来设置等待时间的 , 即将Autochk 超时值改为指定时间(秒数) , 如果没有指定时间 , 则显示当前设置 。系统在注册表项 key_local_machineSystemCurrentControlSetControlSessionManager下增加一个键:AutoChkTimeOut , 类型为 REG_DWord , 数值为当前设置的超时值 。

三、用脚本从程序中安排卷的修复日程
由于可以通过设置或重设注册表 , 来控制 Autochk , 因此可使用脚本 , 从程序中安排卷的修复日程 。
在记事本程序中 , 使用.VBS文件扩展名存储相应文件(例如:MyScript.vbs) 。同时 , 建议您在一个公共文 件夹(例如:C:Scripts)中保存这些脚本 。打开命令行窗口 。如果需要 , 使用cd命令切换到用以存储脚本的 文件夹中 。在命令行窗口中 , 输入csript 命令并在其后跟随脚本名称 。
例如:
cscript myscript.vbs
1、修改 AutoChk 的 Timeout 值
为 Autochk.exe 设定自动延迟时间为 30 秒 。适用于 Windows XP 或 Windows 2003 Server 。
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!" & strComputer & "rootcimv2")
Set colAutoChkSettings = objWMIService.ExecQuery _
("Select * from Win32_AutochkSetting")
For Each objAutoChkSetting in colAutoChkSettings
objAutoChkSetting.UserInputDelay = 30
objAutoChkSetting.Put_
Next
2、防止 AutoChk 在开机时自动运行

即使电脑下次开机时 , 就算 C盘的 "字位" 已被设定, Autochk 也不会对C磁盘执行检查 。适用于; Windows XP 或 Windows 2003 Server 。
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!" & strComputer & "rootcimv2")
Set objDisk = objWMIService.Get("Win32_LogicalDisk")
errReturn = objDisk.ExcludeFromAutoChk(Array("C:"))
Wscript.Echo errReturn
3、执行 ChkDsk
对电脑的D盘执行ChkDks.exe 。适用于 Windows XP 或 Windows 2003 Server 。
Const FIX_ERRORS = True
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!" & strComputer & "rootcimv2")
Set objDisk = objService.Get("Win32_LogicalDisk.DeviceID="D:"")
errReturn = objDisk.ChkDsk(FIX_ERRORS)
Wscript.Echo errReturn
4、安排在电脑下一次重新启动时 , 对 C 盘执行 Autochk.exe 。适用于 Windows XP 或
Windows 2003 Server。
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!" & strComputer & "rootcimv2")
Set objDisk = objWMIService.Get("Win32_LogicalDisk")
errReturn = objDisk.ScheduleAutoChk(Array("C:"))
Wscript.Echo errReturn

 四、几点重要说明

1、开机时按下某个键跳过 Autochk
如果安排 Chkdsk 在启动时运行以检查某个卷 , 但实际启动时决定按下某个键跳过Autochk , 则 Autochk 将 不会检查该卷 , 并删除相应的注册表项 , 在以后 , Autochk也不会检查该卷 。
2、Autochk应用程序事件日志
当 Autochk 在启动时运行检查某个卷时 , 它会输出记录到一个称为 Bootex.log 的文件中 , 该文件放在被 检查卷的根目录下 。随后 , Winlogon 服务将每个 Bootex.log文件的内容移到“应用程序事件日志”中 。每个 被检查卷的事件日志消息按以下方式:
记录:
事件 ID:1001
源:Winlogon
说明:它包括文件系统类型、驱动器号或 GUID 及卷名称或序列号 , 可以帮助确定Chkdsk 检查的是哪个卷 。此外还包括 , Chkdsk 是因为用户的安排而运行的呢 , 还是因为已设置了脏字位而运行的等信息 。
3、以只读方式运行的 Chkdsk 未检测到 NTFS 卷上的损坏
当只读模式对一个使用 NTFS 文件系统的磁盘卷运行 Chkdsk 时 , Chkdsk 可能检测不到磁盘结构的损坏 。原因是如果主文件表中的 $logfile 数据区被破坏 , 则可能会出现这一现象 。解决方案是若要解决这一问题 , 请在运行 Chkdsk 时使用 /f 选项 , 以便重新初始化 $logfile 数据区并修复损坏问题 。
在命令提示符下键入下面的命令 , 然后按 ENTER 键
chkdsk volume_label :/v /f
其中 , volume_label是您要对其运行 Chkdsk 的磁盘卷标 。
4、在Microsoft Windows 2000 Server SP3上 , 在还原或复制大量的数据后 Chkdsk 找到不正确的安全 ID在您还原或复制大量的数据和与这些数据关联的 NTFS 文件系统安全信息时 , Chkdsk.exe 可能会报告此分 区有错误 。即使您把数据还原或复制到一个已知无错误的分区中时也会发生此问题 。Chkdsk 可能会报告类似如 下内容的错误消息:
CHKDSK is verifying security descriptors (stage 3 of 3)...
Repairing the security file record segment.
Deleting an index entry with Id 8447 from index $SII of file 9.
Deleting an index entry with Id 31126 from index $SII of file 9.
Deleting an index entry with Id 50636 from index $SII of file 9.
Deleting an index entry with Id 31126 from index $SDH of file 9.
Deleting an index entry with Id 50636 from index $SDH of file 9.
Deleting an index entry with Id 8447 from index $SDH of file 9.
Replacing invalid security id with default security id for file 1461234.
Security descriptor verification completed.
Windows found problems with the file system.
注意 , 报告的错误数和安全 ID 可能因具体情况而异 。索引项 ID 和文件编号也可能会有所变化 。
如果您接着对此分区运行 chkdsk /f 命令 , 并对应用的权限执行审核 , 则会发现某些文件和文件夹可能已 丢失了用户定义的权限 。这些权限可能已被默认权限代替 , 而默认权限只向 Local System 和 Administrators; 帐户授予访问权 。
无论您使用何种程序还原或复制数据都会发生此问题 。报告发生此问题的情形有:
在使用 Ntbackup.exe; 工具还原数据(带安全信息)之后 , 以及在使用 Xcopy.exe 带/o和/x参数复制数据(带安全信息)之后 。
原因在设计上 , NTFS 文件系统要求以块的形式编写安全描述符 , 而且在每一个安全描述符块的末尾至少要留下; 20 字节 。这是为安全描述符标头留下的空间 。然而 , 在某些情况下 , NTFS 代码的错误计算会导致安全描述符 几乎写到了块的末尾 , 以致留下不足 20 字节的可用空间 。Chkdsk.exe 于是就会删除这些安全描述符并使用默 认安全描述符代替它们 , 以确保在块的最后留下最少 20 字节的可用空间 。这将导致某些文件和文件夹丢失用 户自定义的安全性 。
通过下载SP4解决此问题 。

5、McAfee VirusScan 6.1 在执行磁盘扫描操作期间将计算机挂起
当运行磁盘扫描程序扫描硬盘时 , 计算机可能会停止响应(挂起) 。如果计算机上安装了 Network; Associates McAfee VirusScan 6.1 , 则可能会出现此问题 。
要解决此问题 , 可以使用下面的两种方法之一:
方法1
修改 VirusScan 扫描设置:
启动 VirusScan(依次单击开始、所有程序、McAfee , 然后单击 VirusScan) 。
在 VirusScan 窗口的左下角 , 单击“选择任务” 。
单击 Change my VirusScan settings(更改我的 VirusScan 设置) 。
单击 Configure VShIEld background scanning(配置 VShield 背景扫描) 。
单击以清除 Enable Internet Filter(启用 Internet 过滤)复选框 。
单击以清除 Enable Download and E-mail scanning(启用下载和电子邮件扫描)复选框 。
单击 Apply Settings(应用设置) 。
退出 VirusScan 。
方法2
与 Network Associates 联系 , 以获取能够解决此问题的 McAfee VirusScan 版本 。
6、关于共享群集磁盘
【Windows2000磁盘扫描功能】对于运行群集服务的服务器群集节点所共享的卷 , 不允许在启动时运行Autochk.exe 进行检查 。当这些卷 被联机 , 或从一个节点移到另一节点时 , 群集服务会检查该卷是否处于“脏”状态 。如果是 , 那么在联机前 , 就要使用 Chkdsk 来检查该卷 。但并去不检查 BootExecute 注册表值 , 所以也不会去考虑那些值 。