Утилита SFC.EXE (System Files Checker) существует во всех версиях Windows, начиная с Windows 2000, и предназначена для проверки состояния и восстановления системных файлов. Механизмы защиты важных файлов в разных версиях Windows реализованы по-разному, но все они учитывают тот факт, что какие-либо системные файлы (обычно исполняемые файлы .exe, файлы библиотек .dll, файлы драйверов) могут быть изменены сторонним программным обеспечением, и должен быть механизм, позволяющий проверить их целостность и отменить обнаруженные изменения.
1. Описание команды SFC.
1.1. Формат командной строки:
C:\ SFC [/SCANNOW] [/VERIFYONLY] [/SCANFILE=файл] [/VERIFYFILE=файл][/OFFWINDIR=автономная папка Windows /OFFBOOTDIR=автономная папка загрузки]
1.2. Параметры командной строки:
- /SCANNOW — Проверка целостности всех защищенных системных файлов и восстановление, по возможности, проблемных файлов.
- /VERIFYONLY — Проверка целостности всех защищенных системных файлов. Восстановление файлов не выполняется.
- /SCANFILE — Проверка целостности указанного файла и его восстановление при обнаружении проблем. В параметре файл следует указать полный путь
- /VERIFYFILE — Проверка целостности файла, полный путь к которому указан в параметре файл. Восстановление файлов не выполняется.
- /OFFBOOTDIR — Расположение автономного каталога загрузки для автономного восстановления
- /OFFWINDIR — Расположение автономного каталога Windows для автономного восстановления
2. Примеры использования команды SFC.
2.1. Отобразить подсказку по использованию:
C:\ sfc /?
2.2. Выполнить проверку целостности системных файлов и восстановить поврежденные. Результаты работы записываются в журнал утилиты \Windows\Logs\CBS\CBS.log:
C:\ sfc /scannow
2.3. Выполнить только сканирование системных файлов без исправления:
C:\ sfc /verifyonly
2.4. Сканировать только файл cmd.exe:
C:\ sfc /VERIFYFILE=c:\windows\system32\cmd.exe
2.5. Сканировать только файл kernel32.dll из состава операционной системы, установленной на логическом диске D:
C:\ sfc /SCANFILE=d:\windows\system32\kernel32.dll /OFFBOOTDIR=d:\ /OFFWINDIR=d:\windows
При выполнении сканирования файлов автономной Windows, ведение файла журнала в настоящее время не поддерживается.
В процессе выполнения программы, на экране отображается информация о ходе сканирования и результаты работы. Пример вывода при использовании сканирования с исправлением командой sfc /scannow:
Начато сканирование системы. Этот процесс может занять некоторое время. Начало стадии проверки при сканировании системы. Проверка 100% завершена. Программа защиты ресурсов Windows обнаружила поврежденные файлы и успешно их восстановила. Подробные сведения см. в файле CBS.Log, который находится по следующему пути: windir\Logs\CBS\CBS.log. Например, C:\Windows\Logs\CBS\CBS.log. Обратите внимание, что ведение журнала в настоящее время не поддерживается для автономного обслуживания.
Начиная с Windows Vista, в качестве средства по обслуживанию компонент операционной системы используется Component-Based Servicing (CBS) — специальный набор программных средств для обеспечения ее целостности. CBS является частью Component Servicing Infrastructure (CSI), обеспечивающей необходимые изменения текущего состояния Windows, например, при обновлении системы (Windows Update), установке или удалении программ и компонент, обновлении драйверов устройств и т.п. Фактически, CBS предоставляет программный интерфейс (API) инсталляторам для корректного изменения текущего состояния системы. Система обслуживания ОС Windows фиксирует множество событий, связанных с отслеживанием этого состояния, в специальном файле C:\Windows\Logs\CBS\CBS.log.
Файл журнала CBS.log, кроме всего прочего, содержит и подробные сведения о ходе выполнения сканирования утилиты sfc.exe и его результатах. Для каждого сканируемого файла записывается дата, время и дополнительные сведения о проверке. Через каждые 100 проверок отображается итоговая информация, сопровождаемая тегом [SR], что позволяет выделить из довольно объемного текста только те записи, которые содержат данный признак, с использованием команды поиска строки в текстовом файле findstr. Найти строки, содержащие [SR] и вывести их в файл sfcdetails.txt текущего каталога:
C:\ findstr /c:"[SR]" %windir%\logs\cbs\cbs.log >sfcdetails.txt
Пример содержимого файла журнала, содержащего только строки с тегом [SR] :
00004b78 [SR] Verifying 100 (0x0000000000000064) components 00004b79 [SR] Beginning Verify and Repair transaction 00004be0 [SR] Verify complete 00004be1 [SR] Verifying 100 (0x0000000000000064) components 00004be2 [SR] Beginning Verify and Repair transaction 00004c30 [SR] Repairing corrupted file "\??\C:\WINDOWS\System32\cmd.exe" from store 00004c5a [SR] Verify complete . . . . 00005594 [SR] Committing transaction 00005599 [SR] Verify and Repair Transaction completed. All files and registry keys listed in this transaction have been successfully repaired
В данном примере, проверено 100 файлов, в которых не обнаружено никаких отклонений, а в следующей порции был обнаружен и успешно исправлен файл msprivs.dll.mui. Последние 2 строки сообщают о завершении работы, и о том, что все файлы и ключи реестра были успешно восстановлены.
В тех случаях, когда не удалось восстановить поврежденный файл, в журнале будет присутствовать строка, содержащая:
Cannot repair member file Имя Файла Детальная информация о файле
Причиной невозможности восстановления файлов может быть неисправность оборудования, нарушение целостности файловой системы, повреждение хранилища эталонных файлов и т.п. В большинстве случаев, кроме неисправности оборудования, зная имя поврежденного файла, можно выполнить восстановление с использованием копирования из дистрибутива или каталогов аналогичной операционной системы.
Для поиска информации в тексте журналов cbs.log удобно фильтровать записи по характерным признакам событий, зафиксированных в журнале. Записывать в текстовый файл sfcnotrepair.txt только те строки журнала cbs.log, которые содержат строку Cannot repair, т.е. на выходе мы получим перечень системных файлов, которые не удалось восстановить:
C:\ findstr /c:"Cannot repair" %windir%\logs\cbs\cbs.log >sfcnotrepair.txt
Записывать в текстовый файл sfcnotrepair.txt только те строки журнала cbs.log, которые содержат строку succsessfylly repaired, т.е. на выходе мы получим перечень системных файлов, которые удалось восстановить:
C:\ findstr /c:"succsessfylly repaired" %windir%\logs\cbs\cbs.log >sfcnotrepair.txt
В каталоге \Windows\Logs\CBS\ кроме текущего файла журнала cbs.log могут храниться устаревшие копии журналов в виде сжатых файлов с именем CbsPersist_ГГГГММДДnnnnnn.cab, которые, при необходимости можно распаковать для дальнейшего углубленного анализа.
2.6. В среде Windows 8-10 для восстановления системных компонент Windows, возможно использование утилиты Dism.exe, поддерживающей (чего не было в Windows Vista/Windows 7) параметр RestoreHealth. Для восстановления системных файлов текущей ОС Windows:
C:\ dism /Online /Cleanup-Image /RestoreHealth
2.7. Для Windows 7 параметр /RestoreHealth неприменим и функции восстановления объединены с функциями сканирования, задаваемыми параметром /ScanHealth. Для восстановления системных файлов текущей ОС Windows 7:
C:\ dism /Online /Cleanup-Image /ScanHealth