Applicazione di patch Per-User applicazioni gestite
A partire da Windows Installer 3.0, è possibile applicare patch a un'applicazione installata in un contesto gestito per utente dopo la registrazione della patch come privilegi elevati.
Windows Installer 2.0: Non supportato. Non è possibile applicare patch alle applicazioni installate in un contesto gestito per utente usando versioni di Windows Installer precedenti a Windows Installer 3.0.
Un'applicazione viene installata nello stato gestito per utente nei casi seguenti.
- L'installazione per utente dell'applicazione è stata eseguita usando la distribuzione e Criteri di gruppo.
- L'applicazione è stata pubblicizzata a un utente specificato e installata dal metodo descritto in Pubblicità di un'applicazione Per-User da installare con privilegi elevati.
I privilegi sono necessari per installare un'applicazione nel contesto gestito per utente; pertanto, le future reinstallazioni di Windows Installer o le riparazioni dell'applicazione vengono eseguite anche dal programma di installazione usando privilegi elevati. Ciò significa che solo le patch provenienti da origini attendibili possono essere applicate all'applicazione.
A partire da Windows Installer 3.0, è possibile applicare una patch a un'applicazione gestita per utente dopo la registrazione della patch come privilegi elevati. Per registrare una patch come con privilegi elevati, usare la funzione MsiSourceListAddSourceEx o il metodo SourceListAddSource dell'oggetto Patch , con privilegi elevati. Dopo aver registrato la patch, è possibile applicare la patch usando le funzioni MsiApplyPatch o MsiApplyMultiplePatches , ApplyPatch o ApplyMultiplePatchesdell'oggetto Installer o l'opzione della riga di comando /p.
Nota
È possibile registrare una patch con privilegi elevati prima dell'installazione dell'applicazione. Quando è stata registrata una patch, rimane registrata fino all'ultima applicazione registrata per questa patch.
Le patch applicate a un'applicazione gestita per utente non possono essere rimosse senza rimuovere l'intera applicazione. Le registrazioni delle patch per un'applicazione gestita per utente vengono rimosse alla rimozione dell'applicazione.
È anche possibile usare questo metodo per consentire a un non amministratore di applicare patch a un'applicazione per computer oppure è possibile usare l'applicazione di patch con privilegi minimi descritta in Applicazione di patch al controllo dell'account utente.
Esempio 1
Nell'esempio di scripting seguente viene usato il metodo SourceListAddSource per registrare un pacchetto patch disponibile in \\server\share\products\patches\example.msp con privilegi elevati. Tale patch è quindi pronta per essere applicata a un prodotto gestito per utente.
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
Esempio 2
Nell'esempio di codice seguente viene usata la funzione MsiSourceListAddSourceEx per registrare un pacchetto di patch disponibile in \\server\share\products\patches\example.msp con privilegi elevati. Tale patch è quindi pronta per essere applicata a un prodotto gestito per utente.
#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;
}