Восстановление компонента прямой заменой файлов

Метки:  , , ,

Продолжаем цикл статей о разнообразных правильных (а порой и не очень) методах восстановления компонентов в рамках компонентной модели Windows. Честно говоря, подобные описанному в данном посте "кривому" методу восстановления работоспособности компонентной модели рождаются вовсе не от хорошей жизни, появляются они под воздействием многочисленных проблем с компонентами операционной системы. Во многих случаях официальные методы восстановления хранилища компонентов (dism и аналоги) не помогают, помимо этого отсутствует какая бы то ни было внятная официальная документация, из чего складывается недопонимание структуры и принципов работы компонентной модели. При подобном отношении со стороны разработчиков абсолютно любые средства вернуть компонентную модель в работоспособное состояние хороши!! В данной публикации речь пойдет о восстановлении компонента прямой заменой файлов. Фактически методом предусматривается прямая ручная замена поврежденных [кривых, неправильно функционирующих] файлов, являющихся причиной возникновения ошибок. Исправные файлы копируются с работоспособной станции-донора. Узкое место метода заключается в том, что для реализации требуется наличие находящейся на том же уровне обновлений нормально функционирующей операционной системы той же версии.

Описанный в статье метод рекомендуется к использованию только в критических случаях, поскольку представляет собой довольно непрофессиональную попытку замены файлов компонентов. С другой стороны, качество реализации компонентной модели в операционных системах Windows Vista/7 является моральным оправданием любых доступных методик восстановления работоспособности системы.

Проблема

В качестве примера мы опишем случай из практики. В поле зрения техподдержки попала станция, где очередное (информация о версии утеряна) обновление Windows 7 привело систему в неработоспособное состояние. Неработоспособность, в данном случае, выражалась в отказе запуска множества исполняемых системных образов. Визуально это было заметно по ошибкам запуска и постоянно всплывающим окнам, в заголовке которых высвечивалось "<имя_образа> (в контексте которого произошел сбой) - ошибочный образ", а в информационной части окна можно было видеть сообщение: X:\XXXXXX\xxxxxxxx.dll либо не предназначен для выполнения под управлением Windows или содержит ошибку. Попробуйте переустановить программу с помощью исходного установочного носителя или обратитесь к системному администратору или поставщику программного обеспечения за поддержкой:

bad image

В английских версиях в заголовке можно увидеть "<filename> - bad image", а описание звучит как: "<filename> is either not designed to run on Windows or it contains an error. Try installing the program again using the original installation media or contact your system administrator or the software vendor for support." Часто сообщение в окне дополняется специфической деталью сбоя, например кодом ошибки: "Error status 0xc000012f".

Данный класс ошибок имеет множество специфических особенностей, однако мы будем разбирать их в контексте (исключительно) повреждения системных библиотек, то есть метод сложно применим к различного рода сторонним приложениям, в которых аналогичные проблемы запуска связаны с основным исполняемым файлом и внутренними библиотеками приложения. Исходя из этого, метод нельзя отнести к универсальным.

В данном случае, как вы можете видеть на снимке экрана выше, у нас повреждена библиотека с именем ncrypt.dll, относительно неё мы и поведем дальнейшее повествование. Тем не менее, в вашей версии сбоя используйте уникальное имя сбойной библиотеки. На проблемной системе имелось несколько дополнительных особенностей инцидента:

  • замена одного файла ncrypt.dll с донорской машины по основному местоположению C:\Windows\System32\ ни к чему не приводит, ошибка продолжает с завидной регулярностью себя проявлять. Оно и понятно, если изучить логику подстановки ревизий библиотеки, то все станет понятно;
  • замена нескольких файлов ncrypt.dll по каким-то выборочным местоположениям тоже может не дать результата, поскольку вы должны точно знать какие приложения какие ревизии библиотеки используют;

Решение

Выходит оставшимся в запасе, самым простым способом, в данном случае, является замена всех без исключения ревизий проблемного файла, размещающихся в операционной системе. Давайте опишем метод восстановления компонента прямой заменой файлов подробнее, разбив весь процесс на подразделы, подробно описывающие шаги.

Поиск файлов для копирования

Перво-наперво, при помощи поиска (в проводнике или любым специализированным средством) по системному разделу (обычно C:\) находим все каталоги, содержащие в своем названии искомую маску *ncrypt* в донорской/целевой системах:

Соответственно, в найденных директориях располагаются и подпадающие под маску файлы (ncrypt.dll). Как можно увидеть из имен каталогов, они предназначаются для хранения различных ревизий компонента, включающего в себя файл ncrypt.dll. Но определить точно какая именно ревизия используется тем или иным приложением сложно, поскольку используются обычно сразу несколько ревизий.

На всякий случай не забываем файл в системном каталоге C:\Windows\system32\ (Хотя он и представляет собой жесткую ссылку на одно из описанных выше местоположений).

В ходе того же самого поиска, кроме директорий, были выявлены и файлы, которые располагаются по следующим путям:

как вы видите, надо будет скопировать еще и сопоставимые манифесты компонентов.

Установка безопасности для каталогов/файлов

Все не так просто как кажется, дело в том, что на всех системах директория компонентной модели WinSxS (и вложенные в неё объекты) защищены на уровне разрешений файловой системы. Поэтому на данном шаге нам потребуется взять владение каталогов WinSxS для собственной учетной записи (под которой выполняете восстановление), затем выставить полные разрешения для этой учетной записи, а далее применить их для всех вложенных папок/файлов.

Выполнять приведенные здесь действия следует из-под учетной записи с правами локального Администратора (с эскалацией привилегий).

Сделать это можно двумя способами:

  1. Через проводник. Нажимаем правую клавишу мыши на директории WinSxS - пункт Свойства - вкладка Безопасность - кнопка Дополнительно - вкладка Владелец - кнопка Изменить - ставим курсор на нужного нам пользователя, активируем чекбокс Заменить владельца подконтейнеров и объектов - жмем кнопку Применить. После окончания процесс закрываем все открытые окна через кнопку OK, повторно жмем правую клавишу мыши на директории WinSxS - вкладка Безопасность - во фрейме Группы и пользователи кнопка Изменить - выделяем курсором группу Администраторы - ставим разрешения Изменение и Запись;
  2. Через командную строку. Из командной строки (cmd) выполняем следующие команды:

    takeown /f c:\winsxs\*

    даем группе Администраторы (в которую, я надеюсь, включена ваша учетная запись) полный доступ к целевому файлу, для этого выполняем следующую команду:

    icacls c:\windows\winsxs\* /GRANT АДМИНИСТРАТОРЫ:F

Копирование каталогов/файлов

И последним шагом выполняется непосредственно копирование (с заменой) с донорской (исправной) системы на целевую (проблемную) содержимого всех обнаруженных на предыдущих шагах каталогов и файлов, не забывайте так же и .manifest-файлы.
Что именно мы копируем:

  1. Если присутствуют .cat или .mum файлы компонента, то скопировать их в каталог %WinDir%\servicing\Packages (с донора на цель);
  2. Если присутствуют манифесты (.manifest-файл(ы)) компонента, то скопировать их в каталог %WinDir%\WinSxS\Manifests (с донора на цель);
  3. Если присутствуют остальные каталоги/файлы компонента, то скопировать их в каталог %WinDir%\WinSxS\ (c донора на цель);
  4. Если присутствуют файлы в директории C:\Windows\System32, то скопировать их в эту же директорию (с донора на цель);

Производить операции копирования файлов (во избежание блокировок на работающей системе) можно при помощи любого загрузочного LiveCD, предварительно скопировав все переносимые файлы на флешку (или любой иной носитель). Выполнять же само копирование можно как при помощи командной строки, так и выполнить перемещение с помощью проводника Windows.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *