Dela via


Uppdatering av Per-User förvaltade applikationer

Från och med Windows Installer 3.0 är det möjligt att tillämpa korrigeringar på ett program som har installerats i en användarhanterad kontext efter att korrigeringen har registrerats med utökade privilegier.

Windows Installer 2.0: Stöds inte. Du kan inte tillämpa korrigeringar på program som är installerade i en hanterad kontext per användare med versioner av Windows Installer tidigare än Windows Installer 3.0.

En applikation installeras i ett användarhanterat tillstånd i följande fall.

Behörigheter krävs för att installera ett program i den hanterade kontexten per användare. Därför utförs framtida ominstallationer eller reparationer av programmet i Windows Installer av installationsprogrammet med utökade privilegier. Det innebär att endast korrigeringar från betrodda källor kan tillämpas på programmet.

Från och med Windows Installer 3.0 kan du tillämpa en korrigering på ett hanterat program per användare när korrigeringen har registrerats med utökade privilegier. Om du vill registrera en korrigering som har förhöjd behörighet använder du funktionen MsiSourceListAddSourceEx eller metoden SourceListAddSource för objektet Patch med utökade privilegier. När du har registrerat korrigeringen kan du använda korrigeringen med hjälp av funktionerna MsiApplyPatch eller MsiApplyMultiplePatches, ApplyPatch eller ApplyMultiplePatches metoderna för Installer Objecteller kommandoradsalternativet /p .

Not

En korrigering kan registreras med utökade privilegier innan programmet installeras. När en korrigering har registrerats förblir den registrerad tills det senast registrerade programmet för den här korrigeringen har tagits bort.

Korrigeringar som har tillämpats på ett hanterat program per användare kan inte tas bort utan att hela programmet tas bort. Korrigeringsregistreringarna för ett hanterat program per användare tas bort när programmet tas bort.

Du kan också använda den här metoden för att göra det möjligt för en icke-administratör att korrigera ett program per dator, eller så kan du använda korrigering med lägsta behörighet som beskrivs i UAC-korrigering (User Account Control).

Exempel 1

Följande skriptexempel använder metoden SourceListAddSource för att registrera ett korrigeringspaket som finns på \\server\share\products\patches\example.msp som har förhöjd behörighet. Korrigeringen är sedan redo att tillämpas på en hanterad produkt per användare.

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

Exempel 2

I följande kodexempel används funktionen MsiSourceListAddSourceEx för att registrera ett korrigeringspaket som finns på \\server\share\products\patches\example.msp som har förhöjd behörighet. Korrigeringen är sedan redo att tillämpas på en hanterad produkt per användare.

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