Patchen von verwalteten Anwendungen pro Benutzer

Ab Windows Installer 3.0 ist es möglich, Patches auf eine Anwendung anzuwenden, die in einem benutzerseitig verwalteten Kontext installiert wurde, nachdem der Patch als Patch mit erhöhten Rechten registriert wurde.

Windows Installer 2.0: Nicht unterstützt. Sie können keine Patches auf Anwendungen anwenden, die in einem benutzerseitig verwalteten Kontext mit Versionen von Windows Installer 3.0 installiert wurden.

In den folgenden Fällen wird eine Anwendung im benutzerseitig verwalteten Zustand installiert.

Für die Installation einer Anwendung im benutzerseitig verwalteten Kontext sind Rechte erforderlich. Daher werden künftige Windows Installer-Neuinstallationen oder -Reparaturen der Anwendung vom Installer auch mit erhöhten Rechten durchgeführt. Dies bedeutet, dass nur Patches aus vertrauenswürdigen Quellen auf die Anwendung angewendet werden können.

Ab Windows Installer 3.0 können Sie einen Patch auf eine benutzerspezifische verwaltete Anwendung anwenden, nachdem der Patch als Patch mit erhöhten Rechten registriert wurde. Um einen Patch mit erhöhten Rechten zu registrieren, verwenden Sie die MsiSourceListAddSourceEx-Funktion oder SourceListAddSource-Methode des Patch-Objekts mit erhöhten Rechten. Nach Registrierung des Patches können Sie den Patch mithilfe der Funktionen MsiApplyPatch oder MsiApplyMultiplePatches, ApplyPatch oder ApplyMultiplePatches des Installer-Objekts oder der Befehlszeilenoption /p anwenden.

Hinweis

Ein Patch kann als Patch mit erhöhten Rechten registriert werden, bevor die Anwendung installiert wird. Wenn ein Patch registriert wurde, bleibt er registriert, bis die letzte registrierte Anwendung für diesen Patch entfernt wird.

Patches, die auf eine benutzerspezifische verwaltete Anwendung angewendet wurden, können nicht entfernt werden, ohne die gesamte Anwendung zu entfernen. Die Patchregistrierungen für eine benutzerspezifische verwaltete Anwendung werden beim Entfernen der Anwendung entfernt.

Sie können diese Methode auch verwenden, um einem Benutzer ohne Administratorrechte das Patchen einer computerspezifischen Anwendung zu ermöglichen. Oder Sie können das Patchen mit geringsten Rechten verwenden, das unter Patchen mithilfe der Benutzerkontensteuerung (User Account Control, UAC) beschrieben wird.

Beispiel 1

Im folgenden Skripterstellungsbeispiel wird die SourceListAddSource-Methode verwendet, um ein Patchpaket unter „\\server\share\products\patches\example.msp“ als Patchpaket mit erhöhten Rechten zu registrieren. Dieser Patch kann dann auf ein benutzerseitig verwaltetes Produkt angewendet werden.

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

Beispiel 2

Im folgenden Codebeispiel wird die MsiSourceListAddSourceEx-Funktion verwendet, um ein Patchpaket unter „\\server\share\products\patches\example.msp“ als Patchpaket mit erhöhten Rechten zu registrieren. Dieser Patch kann dann auf ein benutzerseitig verwaltetes Produkt angewendet werden.

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