Share via


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 qui a été installée dans un contexte géré par utilisateur une fois que le correctif a été inscrit comme disposant de privilèges élevés.

Windows Installer 2.0 : Non pris en charge. Vous ne pouvez pas appliquer de correctifs aux applications qui sont installées dans un contexte géré 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 utilisateur dans les cas suivants.

Des privilèges sont requis pour installer une application dans le contexte géré par utilisateur ; par conséquent, les prochaines réinstallations ou réparations de Windows Installer 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 ayant des 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, des méthodes ApplyPatch ou ApplyMultiplePatches de l’objet Installer ou de l’option de ligne de commande /p.

Notes

Un correctif peut être inscrit comme disposant de 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 qui ont été appliqués à une application managée par utilisateur ne peuvent pas être supprimés sans supprimer l’application entière. Les inscriptions de correctifs pour une application managé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 la mise à jour corrective des privilèges minimum décrite dans 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 alors 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é dans \\server\share\products\patches\example.msp comme disposant de privilèges élevés. Ce correctif est alors 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;
}