Udostępnij za pośrednictwem


Aktualizacja aplikacji zarządzanych przez Per-User

Począwszy od Instalatora Windows 3.0, można zastosować poprawki do aplikacji zainstalowanej w kontekście zarządzanym przez użytkownika po zarejestrowaniu poprawki jako o podwyższonym poziomie uprawnień.

Instalator Windows 2.0: Niewspierany. Nie można zastosować poprawek do aplikacji zainstalowanych w kontekście zarządzanym przez użytkownika przy użyciu wersji Instalatora Windows starszych niż Instalator Windows 3.0.

Aplikacja jest instalowana w stanie zarządzanym przez użytkownika w następujących przypadkach.

Uprawnienia są wymagane do zainstalowania aplikacji w kontekście zarządzanym przez użytkownika; W związku z tym przyszłe ponowne zainstalowanie instalatora Windows lub naprawy aplikacji są również wykonywane przez instalatora przy użyciu podniesionych uprawnień. Oznacza to, że do aplikacji można stosować tylko poprawki z zaufanych źródeł.

Począwszy od Instalatora Windows 3.0, można zastosować poprawkę do aplikacji zarządzanej przez użytkownika po zarejestrowaniu poprawki jako o podwyższonym poziomie uprawnień. Aby zarejestrować poprawkę jako mającą podwyższone uprawnienia, użyj funkcji MsiSourceListAddSourceEx lub metody SourceListAddSource obiektu Patch, z podwyższonym poziomem uprawnień. Po zarejestrowaniu poprawki można zastosować poprawkę przy użyciu MsiApplyPatch lub msiApplyMultiplePatches funkcji, ApplyPatch lub ApplyMultiplePatches metodobiektu instalatoralub /p opcji wiersza polecenia.

Notatka

Poprawkę można zarejestrować jako z podwyższonym poziomem uprawnień przed zainstalowaniem aplikacji. Po zarejestrowaniu poprawki pozostaje ona zarejestrowana do czasu usunięcia ostatniej zarejestrowanej aplikacji dla tej poprawki.

Nie można usunąć poprawek zastosowanych do aplikacji zarządzanej przez użytkownika bez usuwania całej aplikacji. Rejestracje poprawek dla aplikacji zarządzanej przez użytkownika są usuwane po usunięciu aplikacji.

Możesz również użyć tej metody, aby umożliwić użytkownikowi bez uprawnień administratora stosowanie poprawek dla aplikacji na poziomie maszyny, lub możesz użyć łatek o najniższych uprawnieniach, opisanych w w sekcji Kontrola konta użytkownika (UAC).

Przykład 1

W poniższym przykładzie skryptów użyto metody SourceListAddSource do zarejestrowania pakietu poprawek znajdującego się w lokalizacji \\server\share\products\patches\example.msp jako o podwyższonym poziomie uprawnień. Ta poprawka jest następnie gotowa do zastosowania do produktu zarządzanego przez użytkownika.

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

Przykład 2

Poniższy przykładowy kod używa funkcji MsiSourceListAddSourceEx, aby zarejestrować pakiet poprawek znajdujący się w folderze \\server\share\products\patches\example.msp jako o podwyższonym poziomie uprawnień. Ta poprawka jest następnie gotowa do zastosowania do produktu zarządzanego przez użytkownika.

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