четверг, 8 мая 2014 г.

Ошибка: Класс не зарегистрирован и восстановление защищенных библиотек Windows7

Столкнулся с проблемой и потратил немало времени на решение. В логе ошибок одной программы стало появляться сообщение "Ошибка: Класс не зарегистрирован"  и программа перестала работать. Паралельно в системном логе нашлось несколько ошибок файловой системы, которые вылечились chkdsk. То что это повредилась какая-то библиотека windows было понятно сразу, но вот как узнать какая именно получилось с помощью этой статьи и программки http://technet.microsoft.com/ru-ru/sysinternals/bb896645. Этой библиотекой оказалась msadrh15.dll из системной компоненты ms ado (или mdac - я не знаю есть ли разница).

Далее проблема оказалась в том, что в windows 7 эта библиотека защищена нативным средством защиты библиотек и просто так заменить файлик на хороший и затем выполнить в терминале
regsvr32 msadrh15.dll 
не получится. Хотя на Windows XP - это было бы самое то.
Создатели windows 7 предлагают средство восстановления системных библиотек. В моем случае надо было бы набрать в терминале
sfc /VERIFYFILE="C:\Program Files\Common Files\System\ado\msadrh15.dll"
я так делал, но почему-то восстановить файл не получилось. Я получил сообщение

Защита ресурсов Windows обнаружила поврежденные файлы, но не удалось устранить некоторые из них. Сведения о включенных см.Журнал % WinDir %\Logs\CBS\CBS.log.

Далее пришлось воспользоваться этой статьей. Вот как это выглядело в моем случае:
- становлюсь владельцем файла:
takeown /f "C:\Program Files\Common Files\System\ado\msadrh15.dll"
- даю группе Администраторы полные права на этот файл (не понятно только зачем, если я уже и так владелец):
icacls Администраторы /grant "C:\Program Files\Common Files\System\ado\msadrh15.dll":F

Далее можно скопировать хороший файл с рабочей системы и затем выполнить наконец-то
regsvr32 msadrh15.dll 

Система сообщила, что библиотека зарегистрирована успешно. Приложение заработало.

А если бы на компьютере создавались резервные копии системы - то всего этого можно было и не делать ;-)