Исправление управляемых пользователем приложений

Начиная с установщика Windows 3.0, можно применять исправления к приложению, которое было установлено в контексте, управляемом пользователем, после регистрации исправления как имеющего повышенные привилегии.

Установщик Windows 2.0: Не поддерживается. Вы не можете применять исправления к приложениям, которые устанавливаются в управляемом контексте для каждого пользователя с помощью версий установщика Windows, предшествующих установщику Windows 3.0.

Приложение устанавливается в состоянии, управляемом пользователем, в следующих случаях.

Для установки приложения в контексте, управляемом пользователем, требуются привилегии; Поэтому будущие переустановки или восстановление приложения установщика Windows также выполняются установщиком с повышенными привилегиями. Это означает, что к приложению могут применяться только исправления из надежных источников.

Начиная с установщика Windows 3.0, вы можете применить исправление к управляемому приложению для отдельных пользователей после регистрации исправления как имеющего повышенные привилегии. Чтобы зарегистрировать исправление как имеющее повышенные привилегии, используйте функцию MsiSourceListAddSourceEx или метод SourceListAddSource объекта Patch с повышенными привилегиями. После регистрации исправления можно применить исправление с помощью функций MsiApplyPatch или MsiApplyMultiplePatches , методов ApplyPatch или ApplyMultiplePatchesобъекта установщика или параметра командной строки /p.

Примечание

Исправление можно зарегистрировать как имеющее повышенные привилегии перед установкой приложения. После регистрации исправления оно остается зарегистрированным до тех пор, пока не будет удалено последнее зарегистрированное приложение для этого исправления.

Исправления, примененные к управляемому отдельному пользователю приложению, нельзя удалить без удаления всего приложения. Регистрация исправлений для приложения, управляемого пользователем, удаляется при удалении приложения.

Вы также можете использовать этот метод, чтобы разрешить неадминистраторам исправлять приложения для отдельных компьютеров или использовать исправление с минимальными привилегиями, как описано в разделе Исправление контроля учетных записей (UAC).

Пример 1

В следующем примере скриптов используется метод SourceListAddSource для регистрации пакета исправлений, расположенного по адресу \\server\share\products\patches\example.msp, как имеющего повышенные привилегии. Затем это исправление будет готово к применению к управляемому продукту для каждого пользователя.

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

Пример 2

В следующем примере кода используется функция MsiSourceListAddSourceEx для регистрации пакета исправлений, расположенного по адресу \\server\share\products\patches\example.msp, как имеющего повышенные привилегии. Затем это исправление будет готово к применению к управляемому продукту для каждого пользователя.

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