Исправление ошибки Windows Installer 0x80040154
В этой статье я расскажу об исправлении одной очень распространенной ошибки Windows Installer. Обыскавши Интернет как русскоязычный, так и англоязычный, включая форумы и ньюсгруппы Microsoft, я понял что ошибка довольно распространенная, однако исправить ее, на самом деле никому не удавалось.
Суть проблемы
Как то одним жарким летним вечером я решил установить на свой компьютер ActeiveState ActivePerl. Скачал инсталлятор, который был в .msi файле и запустил его. Каково же было мое удивление, когда вместо привычного инсталлятора я увидел вот это:
Как вскоре оказалось, подобная ошибка выпадала при запуске на моем компьютере любого .msi файла.
Недолго думая, я полез в интернет, ввел в поиск появившееся сообщение, и, «О ужас!» — я увидел сотни постов людей с этой проблемой! В русскоязычном и англоязычном сегменте Интернета у множества людей была аналогичная проблема, и никто ее не смог решить по существу.
Решение проблемы
Для начала я включил Log-файл установщика Windows. Как включить лог Windows Installer вы можете почитать здесь, или поискать в любом поисковике по ключевому слову «voicewarmup».
Лог-файлы появляются во временной папке пользователя, которая обычно находится по пути C:\Users\имя_профиля\AppData\Local\Temp. Открыв лог, я увидел следующую ошибку:
MSI (c) (B8:84) [22:08:06:894]: Failed to connect to server. Error: 0x80040154
Поискав по коду ошибки в Интернете, и не нашедши никаких способов решения проблемы, я решил подумать логически.
Что означает ошибка 0x80040154? Поискав в поисковике, и воспользовавшись утилитой Error Lookup, я определил, что ошибка означает «Класс не зарегистрирован».
Обычно такая ошибка появляется, когда вы запрашиваете у системы создать COM-объект, который не был должным образом зарегистрирован в реестре. Но как определить какой именно объект не зарегистрирован?
Для начала я воспользовался старым добрым отладчиком WinDbg, который входит в пакет Debugging Tools For Windows. Мне понадобилась именно 64-разрядная версия данного отладчика.
Перед началом отладки необходимо загрузить отладочные символы для распознавания имен системных функций и переменных. Эти символы являются довольно полезной вещью не только для поиска ошибок, но также и для исследования работы Windows в целом.
Я предпочитаю указывать отладчику путь для поиска символов через переменную среды _NT_SYMBOL_PATH, которая должна быть задана как: C:\Symbols;srv*C:\Symbols*https://msdl. microsoft. com/download/symbols. В данном случае папка C:\Symbols — это хранилище загруженных символов на жестком диске, чтобы отладчик каждый раз не лез в интернет за ними.
Загрузил я в отладчик файл C:\windows\system32\msiexec. exe и задал для него параметры командной строки так, чтобы он открыл .msI файл. В моем случае параметром командной строки было: /i «C:\Users\MAV\Desktop\ActivePerl-5.12.4.1205-MSWin32-x64-294981.msi» однако можно задавать путь к любому другому .msi файлу.
Сам по себе отладчик, конечно не решит проблему, нужно ее локализовать. Поразмыслив, какие функции могут создавать COM-объекты, я остановился на CoCreateInstance, CoCreateInstanceEx и CoGetClassObject
Для установки точек прерывания на эти функции вводим в командной строке отладчика:
Bp ole32!CoCreateInstance
Bp ole32!CoCreateInstanceEx
Bp ole32!CoGetClassObject
Если точки останова у вас не ставятся, значит вы неправильно настроили символы.
После запуска приложения (F5), срабатывает точка останова на Ole32!CoCreateInstance. Если точка останова не срабатывает, а выпадает окно с параметрами Wndows Installer, то вы неправильно указали параметры командной строки для запуска.
Давайте теперь посмотрим, из какого же места кода вызывается создание нашего объекта, для этого мы можем нажать Debug->Step Out (Shift+F11). Мне пришлось нажать указанную комбинацию дважды, для того чтобы выйти в исходную вызывающую функцию.
Исходная вызывающая функция называется Msi! CreateMsiServerProxy и, очевидно, находится в модуле Msi. dll.
Запомнив имя функции, а также примерный вид искомого кода, я открыл дизассемблер IDA Pro, и загрузил в него файл msi. dll. Следует отметить пару особенностей данного отладчика: во первых, IDA любит блокировать доступ к исследуемому файлу, во вторых, она создает в папке с исследуемым файлом несколько своих файлов баз данных, так что я рекомендую копировать исследуемые файлы в отдельную папку. В третьих, IDA не всегда подгружает файлы с символами, поэтому рекомендую в указанную отдельную папку также скопировать файл Msi. pdb из вышеуказанной папки C:\Symbols.
После нахождения функции CreateMsiServerProxy, находим знакомые строки кода в ней:
Не иначе как функция пытается создать объект по CLSID IID_IMsiServer. Здесь я не буду вдаваться в подробности COM и искать различия между CLSID и IID, важно что я получил зацепку — имя интерфейса ID_IMsiServer и CLSID .
Windows Registry Editor Version 5.00
После импорта ключа реестра я вновь попробовал запустить .msi файл, и, «О чудо!», он запустился, после чего я успешно установил ActivePerl.
У вас может быть аналогичная проблема, но при этом отсутствовать другой ключ реестра. Импортировать при этом необходимо те ключи, которых у вас нет.
Выводы
Спасибо за внимание, я очень надеюсь что статья вам понравилась, жду ваших отзывов, а также с удовольствием отвечу на ваши вопросы.
Почему недоступен сервер обновления для браузера Google Chrome
При попытке проверить наличие обновлений для браузера в окне «О Google Chrome» может появиться сообщение об ошибке. Запишите сообщение об ошибке (или отсутствии таковой).
Сервер обновлений недоступен (ошибка 1)
Ошибка 1 означает, что Google Chrome невозможно обновить в его текущем каталоге.
Сначала в окне О Google Chrome проверьте номер версии Google Chrome, которой вы пользуетесь.
Chromium можно получить, если загрузить исходный код и создать собственную версию браузера или скопировать версию сборки от кого-то, кто создал её из исходного кода.
Сервер обновлений недоступен (ошибка 3)
Ошибка 3 указывает на ошибку соединения с сервером обновления Google.
Это распространенная проблема функции автоматического обновления Google Chrome. Чтобы её решить, нужно запустить Google Chrome С правами обычного пользователя. Кроме того, из соображений безопасности не рекомендуется устанавливать запуск Google Chrome только с правами администратора.
Сервер обновлений недоступен (ошибка 4)
Если Ошибка 4 возникает постоянно, подробно опишите проблему на справочном форуме.
Сервер обновлений недоступен (ошибка 7)
Ошибка 7 означает, что обновление загружено, но не установлено должным образом.
Попробуйте перезапустить свой компьютер. Откройте Диспетчер задач Windows и проверьте, отображается файл GoogleUpdate. exe или GoogleUpdateOnDemand. exe в списке процессов. Если да, попробуйте снова установить обновления с веб-браузера.
Проверка обновлений не завершается
Если постоянно появляется сообщение «Проверка обновлений» и значок вращается, это означает, что серверу обновлений Google не удалось подключиться к веб-браузеру Google Chrome. Убедитесь, что на компьютере установлена последняя версию Google Chrome.
Сообщение или статус обновления не отображаются
Если в нижней части окна О Google Chrome не отображается сообщение о статусе (как «Обновления»), это означает, что обновление по запросу отключено.
Убедитесь, что на компьютере установлена Последняя версия Google Chrome.
Https://habr. com/ru/sandbox/33155/
Https://webznam. ru/publ/google/chrome/oshibki_obnovlenija_chrome_server_nedostupen/2-1-0-117