Désinstallation des correctifs

À compter de Windows Installer 3.0, il est possible de désinstaller certains correctifs des applications. Le correctif doit être un correctif désinstallable. Lorsque vous utilisez une version de Windows Installer inférieure à la version 3.0, la suppression des correctifs nécessite la désinstallation du produit correctif et la réinstallation du produit sans appliquer le correctif.

Windows Installer 2.0 : non pris en charge. Les correctifs appliqués à l’aide d’une version de Windows Installer antérieure à Windows Installer 3.0 ne sont pas désinstallables.

Lorsque vous appelez une désinstallation d’un correctif par l’une des méthodes suivantes, le programme d’installation tente de supprimer le correctif du premier produit visible par l’application ou l’utilisateur qui demande la désinstallation. Le programme d’installation recherche les produits corrigés dans l’ordre suivant : managé par l’utilisateur, non managé par l’utilisateur, par ordinateur.

Désinstallation d’un correctif à l’aide de MSIPATCHREMOVE sur une ligne de commande

Vous pouvez désinstaller des correctifs à partir d’une commande à l’aide de msiexec.exe et des options de ligne de commande. L’exemple de ligne de commande suivant supprime un correctif désinstallable, example.msp, d’une application, example.msi, à l’aide de la propriété MSIPATCHREMOVE et de l’option de ligne de commande /i. Lorsque vous utilisez /i, l’application corrigée peut être identifiée par le chemin d’accès au package de l’application (fichier .msi) ou par le code produit de l’application. Dans cet exemple, le package d’installation de l’application se trouve dans « \\server\share\products\example\example.msi » et la propriété ProductCode de l’application est « {0C9840E7-7F0B-C648-10F0-4641926FE463} ». Le package correctif se trouve à l’emplacement « \\server\share\products\example\patches\example.msp » et le GUID du code correctif est « {EB8C947C-78B2-85A0-644D-86CEEF8E07C0} ».

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

Désinstallation d’un correctif à l’aide des options de ligne de commande standard

À compter de Windows Installer version 3.0, vous pouvez utiliser les options de ligne de commande standard utilisées par les mises à jour du système d’exploitation Microsoft Windows (update.exe) pour désinstaller les correctifs Windows Installer à partir d’une ligne de commande.

La ligne de commande suivante est la ligne de commande standard équivalente à la ligne de commande Windows Installer utilisée pour désinstaller un correctif à l’aide de la propriété MSIPATCHREMOVE. L’option /uninstall utilisée avec l’option /package indique la désinstallation d’un correctif. Le correctif peut être référencé par le chemin d’accès complet au correctif ou par le GUID du code correctif.

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

Notes

L’option /passive standard n’est pas exactement équivalente à l’option Windows Installer /qb.

 

Désinstallation d’un correctif à l’aide de la méthode RemovePatches

Vous pouvez désinstaller des correctifs d’un script à l’aide de l’interface Automation de Windows Installer. L’exemple de script suivant supprime un correctif désinstallable, example.msp, d’une application, example.msi, à l’aide de la méthode RemovePatches de l’objet Installer. Chaque correctif désinstallé peut être représenté par le chemin d’accès complet au package de correctifs ou par le GUID du code correctif. Dans cet exemple, le package d’installation de l’application se trouve dans « \\server\share\products\example\example.msi » et la propriété ProductCode de l’application est « {0C9840E7-7F0B-C648-10F0-4641926FE463} ». Le package correctif se trouve à l’emplacement « \\server\share\products\example\patches\example.msp » et le GUID du code correctif est « {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, "")

Désinstallation d’un correctif à l’aide de l’ajout/suppression de programmes

Avec Windows XP, vous pouvez désinstaller des correctifs à l’aide de l’ajout/suppression de programmes.

Désinstallation d’un correctif à l’aide de la fonction MsiRemovePatches

Vos applications peuvent désinstaller des correctifs d’autres applications à l’aide des fonctions Windows Installer. L’exemple de code suivant supprime un correctif désinstallable, example.msp, d’une application, example.msi, à l’aide de la fonction MsiRemovePatches. Un correctif peut être référencé par le chemin d’accès complet au package de correctifs ou par le GUID du code correctif. Dans cet exemple, le package d’installation de l’application se trouve dans « \\server\share\products\example\example.msi » et la propriété ProductCode de l’application est « {0C9840E7-7F0B-C648-10F0-4641926FE463} ». Le package correctif se trouve à l’emplacement « \\server\share\products\example\patches\example.msp » et le GUID du code correctif est « {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);

Désinstallation d’un correctif de toutes les applications à l’aide de la fonction MsiRemovePatches

Un seul correctif peut mettre à jour plusieurs produits sur l’ordinateur. Une application peut utiliser MsiEnumProductsEx pour énumérer tous les produits sur l’ordinateur et déterminer si un correctif a été appliqué à un instance particulier du produit. L’application peut ensuite désinstaller le correctif à l’aide de MsiRemovePatches. Par exemple, un seul correctif peut mettre à jour plusieurs produits si le correctif met à jour un fichier dans un composant partagé par plusieurs produits et si le correctif est distribué pour mettre à jour les deux produits.

L’exemple suivant montre comment une application peut utiliser Windows Installer pour supprimer un correctif de toutes les applications disponibles pour l’utilisateur. Il ne supprime pas le correctif des applications installées par l’utilisateur pour un autre utilisateur.

#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;
}

Séquencement des correctifs

Suppression des correctifs

Correctifs désinstallables

Actions personnalisées de désinstallation d’un correctif

MSIPATCHREMOVE

MsiEnumapplicationsEx

MsiGetPatchInfoEx

MsiRemovePatches