Как удалить с помощью msiexec с помощью идентификатора продукта id без файла .msi

Я пытаюсь автоматизировать удаление пакетов, созданных с помощью WiX, с целью изменения стека и конфигурации установленного программного обеспечения без повторной подготовки всей ОС. В конце концов я буду использовать сценарии powershell, чтобы сделать это, но в данный момент я не могу заставить мой тестовый пакет интерактивно деинсталлироваться с помощью cmd.

Если я бегу:

msiexec/x '{A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8}'

msiexec/x A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8

Я получил:

"Не удалось открыть установочный пакет. Убедитесь, что пакет существует и к нему можно получить доступ, или обратитесь к поставщику приложения, чтобы убедиться, что это действительный пакет установщика Windows".

Если я запускаю: msiexec/x {A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8}

Я получил:

"Это действие действительно только для продуктов, которые установлены в настоящее время"

Я посмотрел руководство по установке Windows, документацию по WiX, документацию по msiexec и использовал orca для самостоятельного просмотра .msi, но на самом деле я не нашел ничего, что давало бы четкое представление о том, как обрабатывается удаление. Требуется ли MSI файл, и если нет, то почему установщик Windows считает, что это происходит, когда ему присваивается GUID?

Код WiX для установщика .msi:

<?xml version='1.0' encoding='windows-1252'?>
<Wix xmlns='htp://schemas.microsoft.com/wix/2006/wi' >

  <!--DO NOT COPY / PASTE THE PRODUCT ID GUID BELOW TO YOUR OWN WIX SOURCE -->

  <Product Id='A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8' Language='2057' 
           Manufacturer='COMPANYNAME IT-Operations' 
           Name='COMPANYNAMEServerListener' Version='1.0.0' 
           UpgradeCode='PUT-GUID-HERE'>

   <Package Id='*' Manufacturer='COMPANYNAME IT-Operations' Compressed='yes' />
   <Media Id='1' Cabinet='COMPANYNAMEServerListener.cab' EmbedCab='yes' />

    <Directory Id='TARGETDIR' Name='SourceDir'>
      <Directory Id='ProgramFilesFolder' Name='PFiles'>
      <Directory Id='COMPANYNAME' Name='COMPANYNAME'>
        <Directory Id='INSTALLDIR' Name='COMPANYNAMEServerListener'>
        <Component Id='MainExecutable' Guid='*' >
          <File Id='COMPANYNAMEServerListener.exe' 
                Source='COMPANYNAMEServerListener.exe' Vital='yes' 
                KeyPath='yes' />
          <ServiceInstall 
            Id='COMPANYNAMEServerListenerInstall'
            DisplayName='COMPANYNAMEServerListener'
            Description='Accepts and discards TCP connections on port 28028 to indicate that this server is alive and ready to be controlled'
            Name='COMPANYNAMEServerListener'
            Account='NT AUTHORITY\LocalService'
            ErrorControl='normal'
            Start='auto'
            Type='ownProcess'
            Vital='yes'           
          >
            <ServiceDependency Id='tcpip'/>
          </ServiceInstall>
          <ServiceControl Id="StartService" Start="install" Stop="both" Remove="uninstall" Name="COMPANYNAMEServerListener" Wait="yes" />
        </Component>
        </Directory>
        </Directory>
      </Directory>
      </Directory>

    <Feature Id='Complete' Level='1' >
      <ComponentRef Id='MainExecutable' />
    </Feature>

    <CustomTable Id ="COMPANYNAMEMetadata">
      <Column Id="Property" Type="string" Category="Identifier" PrimaryKey="yes"/>
      <Column Id="Value" Type="string"/>
      <Row>
      <Data Column="Property">InstallString</Data>
      <Data Column="Value">/qn</Data>
      </Row>
    </CustomTable>


  </Product>
</Wix>

Ответ 1

Спасибо за помощь - оказывается, это была проблема WiX.

Когда GUID идентификатора продукта оставался явным и жестко запрограммированным, как и в вопросе, в результате у MSI не было свойства ProductCode, кроме свойства идентификатора продукта, при проверке с помощью orca.

Как только я сменил GUID на '*', чтобы автоматически генерировать, появился ProductCode и все отлично работает с синтаксисом, подтвержденным другими ответами.

Ответ 2

"Ссылочный стиль" Ответ: Это альтернативный ответ на приведенный ниже, с несколькими показанными вариантами. Удаление MSI файла из командной строки без использования msiexec.


Указанная вами команда верна: msiexec/x {A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8}

Если вы получили "Это действие действительно только для продуктов, которые в настоящее время установлены", вы использовали нераспознанный код продукта или пакета, и вы должны найти правильный. Часто это может быть вызвано использованием ошибочного кода пакета вместо кода продукта для удаления - код пакета изменяется при каждой перестройке файла MSI и является единственным указанием, которое вы видите при просмотре страницы свойств файла MSI. Он должен работать для удаления, если вы используете правильный. Нет места для ошибки. Если вы хотите найти код продукта, вам нужно открыть MSI. Код продукта находится в таблице свойств.


ОБНОВЛЕНИЕ, январь 2018 г.:

Учитывая все перенаправления реестра, я не уверен, что приведенный ниже подход на основе реестра более приемлем. Я не проверил должным образом, потому что теперь полагаюсь на следующий подход с использованием PowerShell: Как я могу найти GUID продукта установленной установки MSI?

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


Legacy, опция реестра:

Вы также можете найти код продукта, просматривая реестр из этого базового ключа: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall. Нажмите F3 и найдите название вашего продукта. (Если это 32-разрядный установщик на 64-разрядной машине, он может находиться в папке HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall).

Устаревший вариант PowerShell: (в значительной степени похож на новый, связанный ответ выше)

Наконец, вы можете найти код продукта с помощью PowerShell:

get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name

enter image description here

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

Ответ 3

Хорошо, что этот анализ действительно легко и детерминистически анализировать: либо пакет msi действительно не установлен в системе, либо вы что-то делаете неправильно. Конечно, правильный вызов:

msiexec /x {A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8}

(Требуются права администратора для course-. С фигурными скобками без кавычек кавычки here- нужны только в том случае, если в командной строке указаны пути или значения с пустым.)
Если сообщение: "Это действие действительно только для продуктов, которые в настоящее время установлены", то это действительно так. Либо пакет с этим ProductCode не установлен, либо произошла опечатка.

Чтобы проверить, где ошибка:

  1. Сначала попробуйте щелкнуть правой кнопкой мыши (вероятно) установленный MSI файл. Вы увидите (кроме "Установить" и "Восстановить") запись об удалении. Нажмите на это.
    a) Если эта деинсталляция работает, ваш msi имеет другой код продукта, чем вы ожидаете (возможно, у вас неправильный источник WiX или ваша сборка имеет динамическое ведение журнала при изменении кода продукта).
    б) Если при удалении выдается то же самое "... только для уже установленных продуктов", пакет не устанавливается (что, очевидно, является предварительным условием для его удаления).

  2. Если это был случай 1.a), вы можете найти правильный ProductCode вашего пакета, если откроете свой MSI файл с помощью Orca, Insted или другого редактора/инструмента. Просто Google для них. Посмотрите там в таблице с именем "Свойство" и найдите строку "Код продукта" в первом столбце. Во втором столбце есть правильное значение.

Других возможностей нет.

Просто предложение для используемой командной строки: я бы добавил хотя бы "/qb" для простого индикатора выполнения или "/qn" (последний для полной тихой деинсталляции, но имеет смысл только если вы уверены, что это работает).

Ответ 4

Нет причин для того, чтобы команда {} не работала. Полуявными вопросами являются:

  • Вы уверены, что продукт действительно установлен! Там что-то в ARP/Programs & Features.

  • Исходная установка на самом деле видна в текущем контексте. Похоже, что это может быть установка для каждого пользователя, и если вы вошли в систему как кто-то другой, тогда он не узнает об этом - вам нужно будет войти в ту же учетную запись, что и исходная установка.

  • Если каталог \windows\installer был поврежден, кешированный файл будет отсутствовать, а это используется для удаления.

Ответ 5

msiexec.exe/x "{588A9A11-1E20-4B91-8817-2D36ACBBBF9F}" /q

Ответ 6

вам нужно /q в конце

MsiExec.exe /x {2F808931-D235-4FC7-90CD-F8A890C97B2F} /q

Ответ 7

Попробуйте выполнить эту команду msiexec/x {product-id}/qr