관리되는 애플리케이션 Per-User 패치하기
Windows Installer 3.0부터는 패치가 상승된 권한으로 등록된 후 사용자별 관리 컨텍스트에 설치된 애플리케이션에 패치를 적용할 수 있습니다.
Windows Installer 2.0: 지원되지 않습니다. Windows Installer 3.0 이전 버전의 Windows Installer를 사용하여 사용자별 관리 컨텍스트에 설치된 애플리케이션에는 패치를 적용할 수 없습니다.
애플리케이션은 다음과 같은 경우에 사용자별 관리형 상태로 설치됩니다.
- 애플리케이션의 사용자별 설치는 배포 및 그룹 정책사용하여 수행되었습니다.
- 애플리케이션은 지정된 사용자에게 광고되었고, 관리자 권한으로 설치할 Per-User 애플리케이션을 광고하는 방법에 따라설치되었습니다.
사용자별 관리형 컨텍스트에서 애플리케이션을 설치하려면 권한이 필요합니다. 따라서 이후 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;
}