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

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

Но чтобы удалить файл MSI, кажется, вам нужно вызвать программу msiexec и присвоить ей /x или /uninstall.

Как удалить MSI из командной строки, не используя процедуру msiexec?

Ответы [ 7 ]

142 голосов
/ 29 июня 2009

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

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

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

«Болтать, болтать - больше»: Секции 1 , 2 и 3 нормальные подходы удаления (и, следовательно, рекомендуемые). Personally I use option 3 or 5 from section 3 (оба варианта с ведением журнала, но вариант 5 работает без вывода сообщений также). Если вы очень заняты , пропустите все разговоры и переходите к одному из них - это сделает работу.


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


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


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


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


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


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


Если у вас установлен CCleaner или аналогичные инструменты очистки, возможно, перейдите к section 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 = Add / Remove Programs Applet (appwiz.cpl)
    • Windows 10 Settings Interface => Новая оболочка для той же операции
  • ARP

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

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

3. ** * 1258 1259 * Вы можете удалить из командной строки ( 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" Параметр сброса в журнал замедляет процесс удаления , поскольку файл журнала записывается непрерывно, а не в пакетном режиме. Это гарантирует, что лог-буфер не будет потерян в случае сбоя установки. Другими словами, включите эту опцию, если ваша установка падает, и в вашем подробном файле журнала нет полезной информации . Удалите восклицательный знак, чтобы отключить опцию «Записать в журнал», и удаление будет намного быстрее. Вы все еще получаете подробное ведение журнала, но, как указано, некоторый буфер журнала может быть потерян. Вариант 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 ? Есть несколько способов, я рекомендую использовать Powershell: Как найти GUID продукта с установленной установкой MSI? Несколько других способов, описанных здесь (реестр, папка локального кэша и т. Д.): Поиск 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 или аналогичном сайте).
  • Обратите внимание, что эту функцию можно отключить полностью или частично - ее можно отключить навсегда для всей машины или использовать adhoc для каждой установки.
  • Я видел новые, неразрешимые проблемы установки, возникающие в результате восстановления системы, но обычно он работает нормально . Очевидно, не используйте эту функцию для развлечения. Это последнее средство, и его лучше всего использовать для отката новых драйверов или установок, которые только что были установлены и которые вызывают непосредственные проблемы ( синий экран , перезагрузки, нестабильность и т. Д ... ).
  • Чем дольше вы вернетесь назад, тем больше переделок вы создадите для себя, и тем выше будет риск. Большинство систем имеют только несколько точек восстановления, и большинство из них растягивается на месяц или два, я полагаю.
  • Имейте в виду, что восстановление системы может повлиять на Обновления 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, на тот, что для вашего продукта. Чтобы найти код продукта, см. Ответ: Как найти 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.
45 голосов
/ 16 января 2009

Краткий ответ: вы не можете. Использовать 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-файла.

31 голосов
/ 22 января 2010

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

wmic product get name -> В этом списке будут перечислены все установленные приложения

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

3 голосов
/ 16 января 2009

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

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

2 голосов
/ 10 ноября 2011
wmic product get name

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

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

1 голос
/ 03 февраля 2009

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

msiexec /x filename.msi /q 
0 голосов
/ 16 января 2009

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

...