Поделиться через


Обновление Per-User управляемых приложений

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

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

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

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

Начиная с Windows Installer 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;
}