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;
}
Tematy pokrewne