воскресенье, 28 ноября 2010 г.

Реестр и msiexec

Недавно у меня появилась задача удалять софт скриптами, причем некоторый софт упорно не желал контактировать напрямую с msiexec /x, а желал быть деинсталлированным через свои собственные setup.exe и иже с ними. Конечно же можно было бы просьбу этих программ удовлетворить, но тогда пакет деинсталляции пришлось писать под каждый конкретный софт, он бы занимал место и вообще слишком много внимания одной программе когда у нас их сотня на удаление.
Решено было сделать скрипт который бы просто шерстил определенным образом заданные ветки реестра и удалял оттуда информацию.
И тут я столкнулся с одной занятной ситуацией.

Как всем известно информация об инсталляции хранится в ветке реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall .
Однако на этапе удаления Photoshop CS3 в appwiz.cpl он тем не менее оставался. Почему? Поиски ответа на этот вопрос по реестру привели нас к этой ветке - HKEY_CLASSES_ROOT\Installer\Products .
В соседней ветке HKEY_CLASSES_ROOT\Installer\Features и HKEY_CLASSES_ROOT\Installer\Components также находится информация об установке, но уже менее интересная для нас.
Все работало просто отлично пока не появилась задача на некоторых компьютерах где софт был удален таким варварским способом его восстановить. Некоторые из программ, в частности тот же самый Photoshop CS3, начали утверждать что они уже установлены и было бы неплохо им сделать repair или удалить. Конечно же и тот и другой процесс завершались либо с ошибкой либо со статусом 0 и таким же количеством реально выполненных работ.
Поиски ответа на вопрос как такое может быть привели нас к ветке реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\
Структура разделов там такая же как в HKEY_CLASSES_ROOT\Installer\
Также инсталляция может быть выполнена исключительно из под пользователя, тогда вместо S-1-5-18 надо покопаться в разделе с sid'ом пользователя. Для конвертации sid'а в нормальное имя пользователя можно воспользоваться специальной программой от Sysinternals/Microsoft

Итак для полного удаления всех следов выполненной инсталляции надо удалить соответствующие разделы в ветках реестра
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
HKEY_CLASSES_ROOT\Installer\Features
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\

have fun!

Комментариев нет:

Отправить комментарий