Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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