다음을 통해 공유


관리되는 애플리케이션 Per-User 패치하기

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

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

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

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

Windows Installer 3.0부터는 패치가 상승된 권한으로 등록된 후 사용자별 관리형 애플리케이션에 패치를 적용할 수 있습니다. 상승된 권한이 있는 것으로 패치를 등록하려면, 관리자 권한으로 MsiSourceListAddSourceEx 함수나 Patch 개체의 SourceListAddSource 메서드를 사용하십시오. 패치를 등록한 후 MsiApplyPatch 또는 MsiApplyMultiplePatches 함수, Installer 개체또는 /p 명령줄 옵션ApplyMultiplePatches 메서드를 ApplyPatch 사용하여 패치를 적용할 수 있습니다.

메모

애플리케이션을 설치하기 전에 상승된 권한이 있는 것으로 패치를 등록할 수 있습니다. 패치가 등록되면 이 패치에 대해 마지막으로 등록된 애플리케이션이 제거될 때까지 등록된 상태로 유지됩니다.

사용자별 관리형 애플리케이션에 적용된 패치는 전체 애플리케이션을 제거하지 않고는 제거할 수 없습니다. 사용자별 관리형 애플리케이션에 대한 패치 등록은 애플리케이션을 제거할 때 제거됩니다.

이 방법을 사용하여 비관리자가 컴퓨터별 애플리케이션을 패치할 수 있도록 하거나 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;
}