Mise à jour corrective des applications gérées par utilisateur

À compter de Windows Installer 3.0, il est possible d’appliquer des correctifs à une application installée dans un contexte géré par l’utilisateur après l’inscription du correctif comme disposant de privilèges élevés.

Windows Installer 2.0 : non pris en charge. Vous ne pouvez pas appliquer de correctifs aux applications installées dans un contexte managé par utilisateur à l’aide de versions de Windows Installer antérieures à Windows Installer 3.0.

Une application est installée dans l’état géré par l’utilisateur dans les cas suivants.

Les privilèges sont requis pour installer une application dans le contexte géré par l’utilisateur ; Par conséquent, les futures Windows réinstallations ou réparations de l’application sont également effectuées par le programme d’installation à l’aide de privilèges élevés. Cela signifie que seuls les correctifs provenant de sources approuvées peuvent être appliqués à l’application.

À compter de Windows Installer 3.0, vous pouvez appliquer un correctif à une application gérée par utilisateur une fois que le correctif a été inscrit comme disposant de privilèges élevés. Pour inscrire un correctif comme disposant de privilèges élevés, utilisez la fonction MsiSourceListAddSourceEx ou la méthode SourceListAddSource de l’objet Patch , avec des privilèges élevés. Après avoir inscrit le correctif, vous pouvez appliquer le correctif à l’aide des fonctions MsiApplyPatch ou MsiApplyMultiplePatches , ApplyPatch ou ApplyMultiplePatches de l’objet Installer, ou de l’option de ligne de commande /p.

Notes

Un correctif peut être inscrit comme ayant des privilèges élevés avant l’installation de l’application. Lorsqu’un correctif a été inscrit, il reste inscrit jusqu’à ce que la dernière application inscrite pour ce correctif soit supprimée.

Les correctifs appliqués à une application gérée par utilisateur ne peuvent pas être supprimés sans supprimer l’ensemble de l’application. Les inscriptions de correctifs pour une application gérée par utilisateur sont supprimées lors de la suppression de l’application.

Vous pouvez également utiliser cette méthode pour permettre à un non-administrateur de corriger une application par ordinateur, ou vous pouvez utiliser des correctifs avec privilèges minimum décrits dans la mise à jour corrective du contrôle de compte d’utilisateur (UAC).

Exemple 1

L’exemple de script suivant utilise la méthode SourceListAddSource pour inscrire un package de correctifs situé dans \\server\share\products\patches\example.msp comme disposant de privilèges élevés. Ce correctif est ensuite prêt à être appliqué à un produit géré par utilisateur.

const msiInstallContextUserManaged = 1
const msiInstallSourceTypeNetwork = 1

const PatchCode = "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}"
const UserSid = "S-X-X-XX-XXXXXXXXX-XXXXXXXXX-XXXXXXXXX-XXXXXXX"
const PatchPath = "\\server\share\products\patches\"
const PatchPackageName = "example.msp"

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

Set patch = installer.Patch(PatchCode, "", UserSid, msiInstallContextUserManaged)

patch.SourceListAddSource msiInstallSourceTypeNetwork, PatchPath, 0

patch.SourceListInfo("PackageName") = PatchPackageName

Exemple 2

L’exemple de code suivant utilise la fonction MsiSourceListAddSourceEx pour inscrire un package de correctifs situé sur \\server\share\products\patches\example.msp comme disposant de privilèges élevés. Ce correctif est ensuite prêt à être appliqué à un produit géré par utilisateur.

#ifndef UNICODE
#define UNICODE
#endif    // UNICODE

#ifndef _WIN32_MSI
#define _WIN32_MSI
#endif    // _WIN32_MSI

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


/////////////////////////////////////////////////////////////////
// RegisterElevatedPatch
//
// Purpose: register a patch elevated from a network location
//
// Arguments:
//    wszPatchCode <entity type="ndash"/> GUID of patch to be registered
//    wszUserSid   - String SID that specifies the user account
//    wszPatchPath <entity type="ndash"/> Network location of patch
//    wszPatchPackageName <entity type="ndash"/> Package name of patch
//
/////////////////////////////////////////////////////////////////
UINT RegisterElevatedPatch(LPCWSTR wszPatchCode, 
LPCWSTR wszUserSid, 
LPCWSTR wszPatchPath, 
LPCWSTR wszPatchPackageName)
{
// wszUserSid can be NULL
// when wszUserSid is NULL, register patch for current user
// current user must be administrator
if (!wszPatchCode || !wszPatchPath || !wszPatchPackageName)
    return ERROR_INVALID_PARAMETER;

UINT uiReturn = ERROR_SUCCESS;

uiReturn = MsiSourceListAddSourceEx(
/*szPatchCode*/ wszPatchCode,
/*szUserSid*/ wszUserSid,
/*dwContext*/ MSIINSTALLCONTEXT_USERMANAGED,
/*dwOptions*/ MSISOURCETYPE_NETWORK+MSICODE_PATCH,
/*szSource*/ wszPatchPath,
/*dwIndex*/ 0);
if (ERROR_SUCCESS == uiReturn)
{
uiReturn = MsiSourceListSetInfo(
/*szPatchCode*/ wszPatchCode,
/*szUserSid*/ wszUserSid,
/*dwContext*/ MSIINSTALLCONTEXT_USERMANAGED,
/*dwOptions*/ MSISOURCETYPE_NETWORK+MSICODE_PATCH,
/*szProperty*/ L"PackageName",
/*szValue*/ wszPatchPackageName);
if (ERROR_SUCCESS != uiReturn)
{
// Function call failed, return error code
    return uiReturn;
}
}
else
{
// Function call failed, return error code
    return uiReturn;
}

return ERROR_SUCCESS;
}