マネージド アプリケーション Per-User 修正プログラムの適用
Windows インストーラー 3.0 以降では、更新プログラムが昇格された特権を持つものとして登録された後、ユーザー管理コンテキストごとにインストールされたアプリケーションにパッチを適用できます。
Windows インストーラー 2.0: サポートされていません。 Windows インストーラー 3.0 より前のバージョンの Windows インストーラーを使用して、ユーザーごとのマネージド コンテキストにインストールされているアプリケーションにパッチを適用することはできません。
アプリケーションは、次の場合にユーザーごとの管理状態でインストールされます。
- アプリケーションのユーザーごとのインストールは、展開とグループ ポリシー 使用して実行されました。
- アプリケーションは、指定されたユーザーにアドバタイズされ、「昇格された特権でインストールされる Per-User アプリケーションのアドバタイズ」で説明されている方法によってインストールされました。
ユーザーごとのマネージド コンテキストでアプリケーションをインストールするには、特権が必要です。そのため、今後の Windows インストーラーによるアプリケーションの再インストールまたは修復も、管理者特権を使用してインストーラーによって実行されます。 つまり、信頼できるソースからのパッチのみをアプリケーションに適用できます。
Windows インストーラー 3.0 以降では、更新プログラムが昇格された特権を持つものとして登録された後、ユーザーごとのマネージド アプリケーションにパッチを適用できます。 昇格された特権を持つパッチを登録するには、MsiSourceListAddSourceEx 関数または Patch オブジェクトの SourceListAddSource メソッドを昇格された特権で使用します。 パッチを登録した後は、MsiApplyPatch または MsiApplyMultiplePatches 関数、インストーラー オブジェクトの ApplyPatchメソッドまたは applyMultiplePatches メソッドを、または /p コマンドライン オプションをして適用できます。
手記
パッチは、アプリケーションをインストールする前に、昇格された特権を持つものとして登録できます。 パッチが登録されると、このパッチに対して最後に登録されたアプリケーションが削除されるまで、パッチは登録されたままになります。
ユーザーごとのマネージド アプリケーションに適用されたパッチは、アプリケーション全体を削除しないと削除できません。 ユーザーごとのマネージド アプリケーションのパッチ登録は、アプリケーションの削除時に削除されます。
また、この方法を使用して、管理者以外のユーザーがコンピューターごとのアプリケーションにパッチを適用したり、「ユーザー アカウント制御 (UAC) Patchingで説明されている最小特権の修正プログラムを使用したりできます。
例 1
次のスクリプト サンプルでは、SourceListAddSource メソッドを使用して、\\server\share\products\patchs\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\patchs\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;
}