Как удалить с msiexec, используя идентификатор продукта guid без.присутствует файл 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 AUTHORITYLocalService'
            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>

7 ответов


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

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


обновление, январь 2018:

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

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


наследство, реестр вариант:

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

Legacy, PowerShell option: (во многом похож на новый, связанный ответ выше)

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

get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name

enter image description here

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


нет причин для команды {} не работать. Наполовину очевидные вопросы:--1-->

  1. вы уверены, что продукт действительно установлен! Есть что-то в ARP/программах и функциях.

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

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


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

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

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

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

  1. сначала попробуйте щелкнуть правой кнопкой мыши по (вероятно) установлен .сам файл msi. Вы увидите (кроме "Install" и "Repair") запись удаления. Klick на что.
    a) если это удаление работает, ваш msi имеет другой код продукта, чем вы ожидаете (возможно, у вас неправильный источник WiX или ваша сборка имеет динамический logig где изменяется код продукта).
    b) если это удаление дает то же самое "...только для уже установленных продуктов " пакет не установлен (что является обязательным условием для его удаления).

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

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

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


команду msiexec.exe / x " {588A9A11-1E20-4B91-8817-2D36ACBBBF9F}" /q


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

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

Как только я изменил GUID На " * " для автоматической генерации, появился код продукта, и все работает нормально с синтаксисом, подтвержденным другими ответами.


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

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

попробуйте эту команду msiexec / x {product-id} / qr