Удаление MSI файла из командной строки без использования msiexec - программирование

Удаление MSI файла из командной строки без использования msiexec

msiexec - это программное обеспечение командной строки, которое устанавливает программу

4b9b3361

Ответ 1

Короткий ответ: вы не можете. Используйте MSIEXEC/x

Длинный ответ: когда вы запускаете файл MSI непосредственно в командной строке, все, что происходит, это то, что он запускает MSIEXEC для вас. Эта ассоциация хранится в реестре. Вы можете увидеть список ассоциаций (в Проводнике Windows), которые будут доступны для параметров "Инструменты" / "Папка" / "Типы файлов".

Например, вы можете запустить файл .DOC из командной строки, и WordPad или WinWord откроют его для вас.

Если вы посмотрите в реестре под HKEY_CLASSES_ROOT\.msi, вы увидите, что файлы .MSI связаны с ProgID "Msi.Package". Если вы посмотрите в HKEY_CLASSES_ROOT\Msi.Package\shell\Open\command, вы увидите командную строку, которую фактически использует Windows при запуске файла .MSI.

Ответ 2

Есть много способов удалить пакет MSI. Это задумано как "ссылка".

В итоге вы можете удалить с помощью: msiexec.exe, ARP, WMI, PowerShell, систем развертывания, таких как SCCM, VBScript/COM Automation, DTF или через скрытую папку кэша Windows, а также несколько других параметров, представленных ниже.

Первые несколько параграфов содержат важные лакомые кусочки MSI, затем есть 14 разделов с различными способами удаления файла MSI. Puh.

Разделы 1, 2 и 3 - это обычные подходы к удалению (и, следовательно, рекомендуемые). Лично я использую вариант 3 или 5 из раздела 3 (оба варианта с ведением журнала, но вариант 5 также работает тихо). Если вы очень заняты, пропустите все разговоры и попробуйте один из них - он выполнит свою работу.


Если у вас есть проблемы с удалением вообще и вы ищете альтернативу устаревшей MsiZap.exe и/или утилита очистки установщика Windows ( MSICUU2.exe), вы можете попробовать новый инструмент FixIt от Microsoft (или на международной странице). Очевидно, может работать и для других проблем установки.


Если вы считаете, что MSI и Windows Installer доставляют больше хлопот, чем того стоит, вы можете прочитать о корпоративных преимуществах использования файлов MSI.


Установки MSI установочного скрипта обычно поставляются в файле setup.exe. Чтобы узнать больше о параметрах, используемых для удаления таких установок, перейдите по следующим ссылкам: справочный лист setup.exe pdf, параметры командной строки Setup.exe и Update.exe.


Некоторые файлы MSI устанавливаются как часть пакетов через такой механизм, как проекты Burn (WiX Toolkit) или InstallShield Suite. Это может сделать удаление немного отличается от того, что видно ниже. Вот пример для проектов InstallShield Suite.


Имейте в виду, что удаление без вывода сообщений или в интерактивном режиме может привести к различным результатам (!). Для довольно длинного описания причины этого, пожалуйста, прочитайте этот пост: удаление из панели управления отличается от удаления из .msi


Если при попытке удаления вас неожиданно спросили об исходном установочном носителе, прочтите этот ответ: Почему MSI требует исходный MSI файл для удаления? и, возможно, также раздел 12 ниже для некоторых важных технических деталей.


Если у вас установлен CCleaner или аналогичные инструменты очистки, возможно, перейдите к разделу 11.


Если деинсталляция завершается неудачно полностью (запуск невозможен), см. Разделы 12 и 13 ниже для потенциального способа " отменить " установку с помощью инструментов восстановления и/или очистки системы.


1. Using the original MSI

  • Если у вас есть доступ к исходному MSI, который использовался для установки, вы можете просто щелкнуть его правой кнопкой мыши в Windows Explorer и выбрать " Удалить".
  • Вы также можете удалить из командной строки, как описано в разделе 3.

2. Using the old ARP Applet OR new Windows 8/10 Settings Interface

  • Просто надо упомянуть нормальный подход (ы), хотя это очевидно

    • ARP= appwiz.cpl Add/Remove Programs Applet ( appwiz.cpl)
    • Windows 10 Settings Interface => Новая оболочка для той же операции
  • ARP:

    • Запустите , запустите appwiz.cpl ENTER, чтобы открыть апплет добавления/удаления программ (или нажмите "Добавить/удалить программы" на панели управления).
    • Нажмите " Удалить " для продукта, который вы хотите удалить
  • Интерфейс настроек (Windows 8/10):

    • Используйте новый графический интерфейс настроек в Windows 8/10
    • Windows Key + Нажмите I => Apps & Features. Выберите запись и удалите.
    • Некоторые сообщения об ошибках при вызове удалить таким способом. Пожалуйста, добавьте комментарии ниже, если видели.

3. Using msiexec.exe command line (directly or via a batch file)

  • Вы можете удалить из командной строки (cmd.exe), пакетного файла или даже из исполняемого файла в качестве операции оболочки.
  • Это можно сделать, передав GUID продукта (см. Ниже, как найти этот GUID) или путь к исходному файлу MSI, если он доступен, в msiexec.exe.
  • Для всех приведенных ниже командных строк вы можете добавить /qn чтобы деинсталляция выполнялась в режиме без вывода сообщений. Вот как выполняется удаление при запуске из апплета добавления/удаления.

    • Вариант 1. Базовая интерактивная деинсталляция (доступ к исходному файлу MSI):

       msiexec.exe /x "c:\filename.msi"
      
    • Вариант 2: базовая интерактивная деинсталляция через GUID продукта (нет доступа к исходному файлу MSI - вот как найти GUID продукта - та же ссылка, что и ниже):

       msiexec.exe /x {11111111-1111-1111-1111-11111111111X}
      
    • Вариант 3: Интерактивная деинсталляция с подробным файлом журнала:

       msiexec.exe /x "c:\filename.msi" /L*V "C:\msilog.log"
       msiexec.exe /x {11111111-1111-1111-1111-11111111111X} /L*V "C:\msilog.log"
      
    • Вариант 4: Интерактивная деинсталляция с удаленным, подробным файлом журнала (подробный вариант, запись в журнал - непрерывная запись журнала, может быть очень медленной):

       msiexec.exe /x "c:\filename.msi" /L*V! "C:\msilog.log"
       msiexec.exe /x {11111111-1111-1111-1111-11111111111X} /L*V! "C:\msilog.log"
      
      • Опция flush to log делает удаление медленным, потому что файл журнала записывается непрерывно, а не в пакетном режиме. Это гарантирует, что лог-буфер не будет потерян в случае сбоя установки.

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

    • Вариант 5 (рекомендуется): тихая деинсталляция с подробным файлом журнала - подавление перезагрузок (без сброса в журнал - см. Предыдущий вариант, что это означает):

       msiexec.exe /x "c:\filename.msi" /QN /L*V "C:\msilog.log" REBOOT=R
       msiexec.exe /x {11111111-1111-1111-1111-11111111111X} /QN /L*V "C:\msilog.log" REBOOT=R
      

      Краткое объяснение параметров (так как я рекомендую эту опцию):

       /X = run uninstall sequence
       /QN = run completely silently
       /L*V "C:\msilog.log"= verbose logging at path specified
       {11111111-1111-1111-1111-11111111111X} = product guid of app to uninstall
       REBOOT=R = prevent unexpected reboot of computer
      

      Опять же, как найти руководство по продукту: Как найти GUID продукта с установленной установкой MSI? (для деинсталляции, если у вас нет исходного MSI для указания в команде удаления).

  • Совет: если вы создаете файл журнала для удаления, вы можете найти проблемы в журнале, выполнив поиск "значение 3". Это особенно полезно для многословных файлов, потому что они очень многословны :-).

  • Как найти GUID продукта для установленного MSI?

  • Дополнительная информация о входе в систему с installsite.org: Как мне создать файл журнала моей установки? - отличный обзор различных опций, а также особенностей ведения журнала InstallShield.

  • Msiexec (параметры командной строки) - обзор командной строки для msiexec.exe из MSDN. Вот версия Technet.

4. Using the cached MSI database in the super hidden cache folder

  • MSI удаляет все кабины (более старые версии Windows) и кэширует каждый MSI, установленный в суперскрытой системной папке по адресу % SystemRoot%\Installer (для ее просмотра необходимо показать скрытые файлы).
  • NB. Эта скрытая за ужином папка теперь обрабатывается по-разному в Windows 7 и выше. MSI файлы теперь кэшируются в полном размере. Прочитайте связанную ветку для получения дополнительной информации - рекомендуется прочитать всем, кто находит этот ответ и возится с опасными настройками Windows.
  • Всем файлам MSI здесь будет назначено случайное имя (в шестнадцатеричном формате), но вы можете получить информацию о каждом MSI, показав строку состояния Windows Explorer (Вид → Строка состояния) и затем выбрав MSI. Сводный поток из MSI будет виден в нижней части окна проводника Windows. Или, как указывает Кристофер Галпин, включите столбец "Комментарии" в проводнике Windows и выберите файл MSI ( см. Эту статью в этой статье).
  • Как только вы найдете правильный MSI, просто щелкните по нему правой кнопкой мыши и выберите "Удалить".
  • Вы также можете использовать PowerShell, чтобы показать полный путь к локально кэшированному пакету вместе с названием продукта. Это самый простой вариант на мой взгляд.
  • Чтобы запустить PowerShell: нажмите и удерживайте клавишу Windows, нажмите R, отпустите клавишу Windows, введите "powershell" и нажмите OK. Затем разверните окно PowerShell и выполните следующую команду:
    get-wmiobject Win32_Product | Format-Table Name, LocalPackage -AutoSize

Enter image description here


5. Using PowerShell

  • Существует похожий, но более полный сценарий PowerShell, доступный в MSDN. Это позволяет запускать деинсталляцию на нескольких машинах.
  • Запись, добавленная Even Mien:

    $app = Get-WmiObject -Class Win32_Product -Filter "Name = 'YOUR_APP'"
    $app.Uninstall()
    
  • Этот подход будет работать, но доступ к WMI-классу Win32_Product вызовет проверку целостности программного обеспечения, которая будет очень медленной и в особых случаях может вызвать запуск самовосстановления MSI. Смотрите эту статью: Сценарий удаления Powershell - реальная головная боль

  • Я не проверял это сам, но, похоже, $ app.Uninstall() может запустить UninstallString, зарегистрированную в настройках реестра апплета ARP. Это означает, что в некоторых случаях он может запускать изменение, а не удаление.
  • Ознакомьтесь с этой темой для получения дополнительной информации и способов удаления с помощью Powershell: как удалить приложение с помощью PowerShell?

6. Using the.NET DTF Class Library (часть набора инструментов WiX)

    using Microsoft.Deployment.WindowsInstaller;

    public static void Uninstall( string productCode)
    {
      Installer.ConfigureProduct(productCode, 0, InstallState.Absent, "REBOOT=\"R\"");
    }

7. Using the Windows Installer Automation API


8. Using a Windows Installer major upgrade

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

9. Using Deployment Systems/Remote Administration Systems

  • SCCM, CA Unicenter, IBM Tivoli, Altiris Client Management Suite и ряд других
  • Эти инструменты обеспечивают расширенное управление клиентским ПК, включая установку и удаление файлов MSI.
  • Эти инструменты, кажется, используют комбинацию msiexec.exe, автоматизации, WMI и т.д. И даже свой собственный способ вызывать установки и удаления.
  • По моему опыту, эти инструменты обладают большой "индивидуальностью", и вам нужно приспосабливаться к их различным способам ведения дел.

10. Using WMI - Windows Management Instrumentation


11. Using a third-party tool such as ccleaner or similar

  • Некоторые приложения Windows имеют собственный интерфейс для удаления не только пакетов MSI, но и устаревших установщиков.
  • Я не хочу давать здесь какие-либо конкретные рекомендации по инструменту (особенно коммерческие), но хорошо известный CCleaner имеет такой интерфейс удаления (и у него бесплатная версия). Я также должен добавить, что этот инструмент недавно подвергся атаке вредоносных программ.
  • Я предполагаю, что мы все должны помнить, что даже безопасное программное обеспечение может быть заражено вредоносным ПО в местах их загрузки (атака по FTP).
    • Я использую virustotal.com для проверки своих загрузок, а также Sysinternals Process Explorer для проверки запущенных процессов после установки - вместе с обычным программным обеспечением безопасности (в зависимости от того, что доступно).
    • При таком подходе обычно обнаруживается удивительное количество "серой области" программного обеспечения (панели инструментов, смайлики, рекламное ПО и т.д.), А также несколько ложных срабатываний (они также могут вызвать проблемы, поскольку программное обеспечение безопасности блокирует их доступ или изолирует их, делая много пуха). И, конечно же, настоящее вредоносное ПО.
    • Некоторые советы по использованию Process Explorer можно найти здесь - серию твитов - этот инструмент Process Explorer подключается к virustotal.com для интерактивной проверки всех запущенных процессов - все, что вам нужно, - это несколько шагов настройки.
    • Я должен отметить, что Process Explorer выдает проверку подписи файла, но без эвристики, насколько я понимаю (без проверки подозрительных операций, просто проверка с помощью 60+ комплектов безопасности для помеченных файлов). Вам нужен обычный инструмент безопасности для интерактивной эвристической защиты в Интернете.
    • Я думаю, что некоторые программы обеспечения безопасности граничат с тем, что вызывают больше ложноположительных проблем, чем вредоносные программы. Знаменитые последние слова в эпоху выкупа...
    • Это достаточно большое отступление - я просто не хочу, чтобы люди скачивали вредоносные программы. Сделайте свой чек virustotal.com хотя бы.
  • Удаление, как это должно работать нормально. Я думаю, что эти инструменты слишком много мешают, когда вы пробуете их "функции очистки". Используйте с осторожностью. Если вы используете только функцию удаления, вы должны быть в порядке.

12. Using a cleanup tool such as msizap or similar

  • Для полноты MsiZap.exe следует упомянуть, хотя он устарел, не поддерживается и устарел. Это не должно использоваться на любых более новых версиях Windows
  • Этот инструмент командной строки ( MsiZap.exe) также был доступен графический интерфейс ( MSICUU2.exe). Оба инструмента устарели.
  • Предполагалось использовать эти инструменты для очистки неудачных деинсталляций:
  • Как правило, для редкого случая, когда кэшированный MSI со случайным именем ошибочно отсутствует, и по этой причине происходит сбой удаления при запросе исходного MSI. Это редкая проблема, но я видел это сам. Всего несколько возможных причин: Перешли к этому ответу.
    • Ключевые слова: помехи при восстановлении системы, плохие приложения для очистки, сбой msiexec.exe, перебои с питанием, помехи в программном обеспечении безопасности, грубые ошибки отладки при разработке MSI (идентичные коды пакетов и т.д.), Манипулирование пользователями и взлом (что здесь происходит? Сэкономить место)?), так далее...
    • Его также можно использовать для установки любой установки MSI, хотя это явно не рекомендуется.
    • Дополнительная информация: Почему MSI требует исходный MSI файл для удаления?
  • Этот новый инструмент поддержки (этот инструмент теперь также устарел) можно попробовать в последних версиях Windows, если у вас есть несуществующие пакеты MSI, требующие удаления.
  • Некоторые предлагают использовать инструмент, на который ссылается saschabeaumont: удаление без MSI файла. Если вы попробуете, и это сработает, пожалуйста, сообщите нам об этом.
  • Если у вас есть доступ к исходному MSI, который фактически использовался для установки продукта, вы можете использовать его для запуска удаления. Это должен быть точный MSI, который был использован, а не просто похожий.

13. Using system restore ("installation undo" - last resort IMHO)

  • Строго говоря, это не способ " удалить ", а " отменить " последнюю установку или несколько установок в этом отношении.
  • Восстановление через точку восстановления возвращает систему к предыдущему состоянию установки (вы можете найти демонстрационные ролики об этом на YouTube или аналогичном сайте).
  • Обратите внимание, что эта функция может быть отключена полностью или частично - ее можно отключить навсегда для всей машины или по отдельности для каждой установки.
  • Я видел новые, неразрешимые проблемы установки, возникающие в результате восстановления системы, но обычно все работает нормально. Очевидно, не используйте эту функцию для развлечения. Это последнее средство, и его лучше всего использовать для отката новых драйверов или установок, которые только что были установлены и которые вызывают немедленные проблемы (синий экран, перезагрузка, нестабильность и т.д.).
  • Чем дольше вы вернетесь назад, тем больше переделок вы создадите для себя, и тем выше будет риск. Большинство систем имеют только несколько точек восстановления, и большинство из них растягивается на месяц или два, я полагаю.
  • Помните, что восстановление системы может повлиять на обновления Windows, которые затем должны быть применены повторно, а также на многие другие параметры системы. Помимо чистой досады, это также может привести к появлению проблем с безопасностью, и вам может потребоваться выполнить определенную проверку безопасности на целевых окнах с помощью Microsoft Baseline Security Analyzer или аналогичных инструментов.
  • Поскольку я упоминал о восстановлении системы, полагаю, мне следует упомянуть функцию "Последняя удачная конфигурация". Эта функция не имеет ничего общего с удалением или восстановлением системы, но это последняя конфигурация загрузки, которая сработала или привела к работающей системе. Он может быть использован для возобновления работы вашей системы, если во время загрузки она отключится или остановится. Это часто происходит после установки драйвера.

14. Windows Installer Functions (C++)

Для полноты я предполагаю, что мы должны упомянуть суть всего этого - простой способ: функции Win32 Windows Installer API. Вероятно, это функции, используемые большинством, если не всеми другими подходами, перечисленными выше "под капотом". Они в основном используются приложениями или решениями, имеющими непосредственное отношение к MSI как технологии.

На serverfault.com есть ответ, который может представлять интерес для краткого изложения различных программных подходов к удалению (функции установщика COM Automation,.NET, Win32).

Ниже вы найдете фрагмент C++, показывающий, как удалить Orca, 10.1.17134.12 по коду продукта с помощью вызова функции MsiConfigureProductEx. Чтобы удалить другой продукт, замените GUID, указанный для prodcode на prodcode вашего продукта. Чтобы найти код продукта, см. Следующий ответ: Как я могу найти GUID продукта установленной установки MSI?

Удаление произойдет в режиме полного графического интерфейса. Для запуска в режиме без вывода сообщений или в каком-либо другом режиме графического интерфейса пользователя (сокращенный, базовый и т.д.) См. Функцию: MsiSetInternalUI.

#include "pch.h"

#define WIN32_LEAN_AND_MEAN //Minimize includes from Windows.h
#include <windows.h>
#include <msi.h> // Windows Installer
#include <tchar.h> 

#pragma comment(lib, "msi.lib") // To make code link

int main()
{
    const TCHAR noreboot[] = _T("REBOOT=ReallySuppress");
    const TCHAR prodcode[39] = _T("{D7B80ABC-1950-37B8-F851-C3783EED9C93}"); // Orca, 10.1.17134.12

    UINT res = MsiConfigureProductEx(prodcode, INSTALLLEVEL_DEFAULT, INSTALLSTATE_ABSENT, noreboot);

    return res; // Error Codes: https://msdn.microsoft.com/en-us/library/windows/desktop/aa376931(v=vs.85).aspx
}

Фрагмент был создан и протестирован с последней версией Visual Studio 2017 от сентября 2018 года:

  1. Создайте новое "Консольное приложение Windows" из Visual C++ => Рабочий стол Windows.
  2. Скопируйте и вставьте приведенный выше код в ваш основной файл CPP (заменив все, что там есть).
  3. Это должно быть так, чтобы можно было запустить код. Может быть, установить точку останова, построить и запустить.

    • Остерегайтесь изменений шаблонов по умолчанию в VS2017 и возможных странных ошибок: слишком много ошибок для правильной работы механизма IntelliSense.
    • ОБНОВЛЕНИЕ Сентябрь 2018: шаблоны снова изменились. Я больше не вижу вышеупомянутую проблему.
    • Ссылка MSDN в коде содержит список возможных сообщений об ошибках, возвращаемых из msiexec.exe.

Ответ 3

Также помните, что удаление может быть инициировано с помощью команды WMIC:

wmic product get name → Здесь будут перечислены имена всех установленных приложений

wmic product where name='myappsname' call uninstall → это приведет к удалению приложения.

Ответ 4

Расширение файла msi сопоставляется с msiexec (так же, как и ввод имени файла .txt в командной строке запускает обработчик файла Notepad/default .txt для отображения файла).

Таким образом, ввод в имя файла с расширением .msi действительно запускает msiexec с файлом MSI в качестве аргумента и принимает действие по умолчанию, устанавливает. По этой причине при удалении требуется вызывать msiexec с деинсталлятором для его установки.

Ответ 5

wmic product get name

Просто получается, что cmd застрял... все еще мигает _ через пару минут

в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall, если вы можете найти папку с именем программного обеспечения, которое вы пытаетесь установить (а не с именем ProductCode), UninstallString указывает на собственный деинсталлятор приложения C:\Program Files\Zune\ZuneSetup.exe /x

Ответ 6

Я бы попробовал следующий синтаксис: он работает для меня.

msiexec /x filename.msi /q 

Ответ 7

Я предполагаю, что когда вы вводите int file.msi в командной строке, Windows автоматически вызывает msiexec file.msi для вас. Я предполагаю это, потому что, когда вы вводите picture.png, он вызывает просмотрщик изображений по умолчанию.