Udostępnij za pośrednictwem


Odinstalowywanie poprawek

Począwszy od Instalatora Windows 3.0, można odinstalować niektóre poprawki z aplikacji. Poprawka musi być poprawką z możliwością odinstalowania. W przypadku korzystania z instalatora Windows w wersji mniejszej niż wersja 3.0 usuwania poprawek wymaga odinstalowania produktu poprawki i ponownego zainstalowania produktu bez stosowania poprawki.

Instalator Windows 2.0: Niewspierane. Poprawki stosowane przy użyciu wersji Instalatora Windows starszej niż Instalator Windows 3.0 nie są odinstalowywalne.

Po wywołaniu dezinstalacji poprawki przy użyciu dowolnej z poniższych metod instalator próbuje usunąć poprawkę z pierwszego produktu widocznego dla aplikacji lub użytkownika żądającego odinstalowania. Instalator wyszukuje aktualizowane produkty w następującej kolejności: zarządzane na poziomie użytkownika, niezarządzane na poziomie użytkownika, na poziomie maszyny.

Odinstalowywanie poprawki przy użyciu polecenia MSIPATCHREMOVE w wierszu polecenia

Poprawki można odinstalować za pomocą polecenia przy użyciu msiexec.exe i opcji wiersza polecenia . Poniższy przykładowy wiersz polecenia usuwa odinstalowywalną poprawkę , example.msp, z aplikacji example.msi, przy użyciu właściwości MSIPATCHREMOVE oraz opcji /i w wierszu polecenia. W przypadku korzystania z /i, można zidentyfikować poprawioną aplikację za pomocą ścieżki do pliku pakietu aplikacji (.msi) lub kodu produktu aplikacji . W tym przykładzie pakiet instalacyjny aplikacji znajduje się w lokalizacji "\\server\share\products\example\example.msi", a właściwość ProductCode aplikacji to "{0C9840E7-7F0B-C648-10F0-4641926FE463}". Pakiet poprawek znajduje się w folderze "\\server\share\products\example\patches\example.msp", a identyfikator GUID kodu poprawki to "{EB8C947C-78B2-85A0-644D-86CEEF8E07C0}".

Msiexec /I {0C9840E7-7F0B-C648-10F0-4641926FE463} MSIPATCHREMOVE={EB8C947C-78B2-85A0-644D-86CEEF8E07C0} /qb

Odinstalowywanie poprawki przy użyciu standardowych opcji wiersza polecenia

Począwszy od Instalatora Windows w wersji 3.0, można użyć standardowych opcji wiersza polecenia używanych przez aktualizacje systemu operacyjnego Microsoft Windows (update.exe) w celu odinstalowania poprawek Instalatora Windows z wiersza polecenia.

Poniższy wiersz polecenia to standardowy odpowiednik wiersza polecenia Instalatora Windows używany do odinstalowania poprawki z użyciem właściwości MSIPATCHREMOVE. Opcja /uninstall używana razem z opcją /package oznacza odinstalowanie poprawki. Do poprawki można odwoływać się przez pełną ścieżkę do poprawki lub identyfikator GUID kodu poprawki.

Msiexec /package {0C9840E7-7F0B-C648-10F0-4641926FE463} /uninstall {EB8C947C-78B2-85A0-644D-86CEEF8E07C0} /passive

Notatka

/pasywna opcja standardowa nie jest dokładnym odpowiednikiem opcji Instalatora Windows /qb.

 

Odinstalowywanie poprawki przy użyciu metody RemovePatches

Poprawki można odinstalować ze skryptu przy użyciu Instalatora Windows interfejsu automatyzacji. Poniższy przykład skryptowy usuwa odinstalowywalną poprawkę, example.msp, z aplikacji example.msiprzy użyciu metody RemovePatches obiektu Instalatora. Każda odinstalowana poprawka może być reprezentowana przez pełną ścieżkę do pakietu poprawek lub identyfikator GUID kodu poprawki. W tym przykładzie pakiet instalacyjny aplikacji znajduje się w lokalizacji "\\server\share\products\example\example.msi", a właściwość ProductCode aplikacji to "{0C9840E7-7F0B-C648-10F0-4641926FE463}". Pakiet poprawek znajduje się w folderze "\\server\share\products\example\patches\example.msp", a identyfikator GUID kodu poprawki to "{EB8C947C-78B2-85A0-644D-86CEEF8E07C0}".

const msiInstallTypeSingleInstance = 2
const PatchList = "{EB8C947C-78B2-85A0-644D-86CEEF8E07C0}"
const Product = "{0C9840E7-7F0B-C648-10F0-4641926FE463}"

Dim installer
Set installer = CreateObject("WindowsInstaller.Installer")

installer.RemovePatches(PatchList, Product, msiInstallTypeSingleInstance, "")

Odinstalowywanie poprawki przy użyciu opcji Dodaj/Usuń programy

W systemie Windows XP można odinstalować poprawki przy użyciu opcji Dodaj/Usuń programy.

Odinstalowywanie poprawki przy użyciu funkcji MsiRemovePatches

Twoje aplikacje mogą przy użyciu funkcji Instalatora Windowsodinstalować poprawki z innych aplikacji. Poniższy przykład kodu usuwa odinstalowywalną poprawkę, example.msp, z aplikacji example.msi, przy użyciu funkcji MsiRemovePatches. Do poprawki można odwoływać się przez pełną ścieżkę do pakietu poprawek lub identyfikator GUID kodu poprawki. W tym przykładzie pakiet instalacyjny aplikacji znajduje się w lokalizacji "\\server\share\products\example\example.msi", a właściwość ProductCode aplikacji to "{0C9840E7-7F0B-C648-10F0-4641926FE463}". Pakiet poprawek znajduje się w folderze "\\server\share\products\example\patches\example.msp", a identyfikator GUID kodu poprawki to "{EB8C947C-78B2-85A0-644D-86CEEF8E07C0}".

    UINT uiReturn = MsiRemovePatches(
          /*szPatchList=*/TEXT("\\server\\share\\products\\example\\patches\\example.msp"),
          /*szProductCode=*/  TEXT("{0C9840E7-7F0B-C648-10F0-4641926FE463}"),
          /*eUninstallType=*/ INSTALLTYPE_SINGLE_INSTANCE,
          /*szPropertyList=*/ NULL);

Odinstalowywanie poprawki ze wszystkich aplikacji przy użyciu funkcji MsiRemovePatches

Pojedyncza poprawka może aktualizować więcej niż jeden produkt na komputerze. Aplikacja może użyć MsiEnumProductsEx, aby wyliczyć wszystkie produkty na komputerze i określić, czy poprawka została zastosowana do określonego wystąpienia produktu. Następnie aplikacja może odinstalować poprawkę przy użyciu MsiRemovePatches. Na przykład pojedyncza poprawka może zaktualizować wiele produktów, jeśli poprawka aktualizuje plik w składniku, który jest współużytkowany przez wiele produktów, a poprawka jest dystrybuowana w celu zaktualizowania obu produktów.

W poniższym przykładzie pokazano, jak aplikacja może użyć Instalatora Windows do usunięcia poprawki ze wszystkich aplikacji, które są dostępne dla użytkownika. Nie usuwa poprawki z aplikacji zainstalowanych dla jednego użytkownika przez innego użytkownika.

#ifndef UNICODE
#define UNICODE
#endif //UNICODE

#ifndef _WIN32_MSI
#define _WIN32_MSI 300
#endif //_WIN32_MSI

#include <stdio.h>
#include <windows.h>
#include <msi.h>

#pragma comment(lib, "msi.lib")

const int cchGUID = 38;

///////////////////////////////////////////////////////////////////
// RemovePatchFromAllVisibleapplications:
//
// Arguments:
//    wszPatchToRemove - GUID of patch to remove
//
///////////////////////////////////////////////////////////////////
//
UINT RemovePatchFromAllVisibleapplications(LPCWSTR wszPatchToRemove)
{
    if (!wszPatchToRemove)
        return ERROR_INVALID_PARAMETER;

    UINT uiStatus = ERROR_SUCCESS;
    DWORD dwIndex = 0;
    WCHAR wszapplicationCode[cchGUID+1] = {0};

    DWORD dwapplicationSearchContext = MSIINSTALLCONTEXT_ALL;
    MSIINSTALLCONTEXT dwInstallContext = MSIINSTALLCONTEXT_NONE;

    do
    {
        // Enumerate all visible applications in all contexts for the caller.
        // NULL for szUserSid defaults to using the caller's SID
        uiStatus = MsiEnumProductsEx(/*szapplicationCode*/NULL,
         /*szUserSid*/NULL,
         dwapplicationSearchContext,
         dwIndex,
         wszapplicationCode,
         &dwInstallContext,
         /*szSid*/NULL,
         /*pcchSid*/NULL);

        if (ERROR_SUCCESS == uiStatus)
        {
            // check to see if the provided patch is
            // registered for this application instance
            UINT uiPatchStatus = MsiGetPatchInfoEx(wszPatchToRemove,
             wszapplicationCode,
             /*szUserSid*/NULL,
             dwInstallContext,
             INSTALLPROPERTY_PATCHSTATE,
             NULL,
             NULL);

            if (ERROR_SUCCESS == uiPatchStatus)
            {
                // patch is registered to this application; remove patch
                wprintf(L"Removing patch %s from application %s...\n",
                 wszPatchToRemove, wszapplicationCode);
                                
                UINT uiRemoveStatus = MsiRemovePatches(
                 wszPatchToRemove,
                 wszapplicationCode,
                 INSTALLTYPE_SINGLE_INSTANCE,
                 L"");

                if (ERROR_SUCCESS != uiRemoveStatus)
                {
                    // This halts the enumeration and fails. Alternatively
                    // you could output an error and continue the
                    // enumeration
                     return ERROR_FUNCTION_FAILED;
                }
            }
            else if (ERROR_UNKNOWN_PATCH != uiPatchStatus)
            {
                // Some other error occurred during processing. This
                // halts the enumeration and fails. Alternatively you
                // could output an error and continue the enumeration
                 return ERROR_FUNCTION_FAILED;
            }
            // else patch was not applied to this application
            // (ERROR_UNKNOWN_PATCH returned)
        }

        dwIndex++;
    }
    while (uiStatus == ERROR_SUCCESS);

    if (ERROR_NO_MORE_ITEMS != uiStatus)
        return ERROR_FUNCTION_FAILED;

    return ERROR_SUCCESS;
}

sekwencjonowanie poprawek

usuwanie poprawek

Dezinstalowalne poprawki

Patch Odinstaluj akcje niestandardowe

MSIPATCHREMOVE

MsiEnumapplicationsEx

MsiGetPatchInfoEx

MsiRemovePatches