Обновление Per-User управляемых приложений
Начиная с Установщика Windows 3.0, можно применить исправления к приложению, которое было установлено в контексте, управляемом пользователем, после того как исправление было зарегистрировано как обладающее повышенными привилегиями.
Установщик Windows 2.0: Не поддерживается. Исправления нельзя применять к приложениям, установленным в управляемом контексте для каждого пользователя, с помощью версий установщика Windows, предшествующих установщику Windows 3.0.
Приложение устанавливается в управляемом пользователем состоянии в следующих случаях.
- Установка приложения для каждого пользователя была выполнена с помощью развертывания и групповой политики.
- Приложение было разрекламировано определенному пользователю и установлено методом, описанным в разделе Реклама приложения Per-User для установки с повышенными привилегиями.
Привилегии необходимы для установки приложения в контексте, управляемом пользователем; Таким образом, будущие переустановки или восстановление приложения установщика 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;
}