사용자당 관리형 애플리케이션 패치

Windows Installer 3.0부터는 패치를 상승된 권한으로 등록한 후 사용자당 관리형 컨텍스트에 설치된 애플리케이션에 적용할 수 있습니다.

Windows Installer 2.0: 지원되지 않습니다. 사용자당 관리형 컨텍스트에 설치된 애플리케이션에는 Windows Installer 3.0 이전 버전의 Windows Installer를 사용하여 패치를 적용할 수 없습니다.

애플리케이션은 다음 경우에 사용자 단위 관리형 상태로 설치됩니다.

사용자당 관리형 컨텍스트에서 애플리케이션을 설치하려면 권한이 필요합니다. 따라서 이후 Windows Installer에서 애플리케이션을 다시 설치하거나 복구하는 경우 설치 관리자가 상승된 권한으로 수행합니다. 즉, 신뢰할 수 있는 원본의 패치만 애플리케이션에 적용할 수 있습니다.

Windows Installer 3.0부터는 패치를 상승된 권한으로 등록한 후 사용자당 관리형 애플리케이션에 적용할 수 있습니다. 상승된 권한으로 패치를 등록하려면 상승된 권한으로 Patch 개체의 MsiSourceListAddSourceEx 함수 또는 SourceListAddSource 메서드를 사용합니다. 패치를 등록한 후 MsiApplyPatch 또는 MsiApplyMultiplePatches 함수, Installer 개체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;
}