ユーザーごとのマネージド アプリケーションのパッチ適用

Windows インストーラー 3.0 以降では、パッチが昇格された特権を持つとして登録されたら、そのパッチをユーザーごとのマネージド コンテキストでインストールされているアプリケーションに適用できます。

Windows インストーラー 2.0: サポートされていません。 Windows インストーラー 3.0 より前のバージョンの Windows インストーラーを使用して、ユーザーごとのマネージド コンテキストでインストールされているアプリケーションにパッチを適用することはできません。

アプリケーションは、次の場合にユーザーごとのマネージド状態でインストールされます。

ユーザーごとのマネージド コンテキストでアプリケーションをインストールするには特権が必要です。そのため、将来の Windows インストーラーでのアプリケーションの再インストールや修復も、昇格された特権を使用するインストーラーによって実行されます。 つまり、アプリケーションに適用できるのは、信頼できるソースからのパッチだけです。

Windows インストーラー 3.0 以降では、パッチが昇格された特権を持つとして登録されたら、そのパッチをユーザーごとのマネージド アプリケーションに適用できます。 パッチを昇格された特権を持つとして登録するには、MsiSourceListAddSourceEx 関数、または Patch オブジェクトの SourceListAddSource メソッドを昇格された特権で使用します。 パッチを登録したら、MsiApplyPatch または MsiApplyMultiplePatches 関数、Installer オブジェクトApplyPatch または ApplyMultiplePatches メソッド、あるいは /p のコマンド ライン オプションを使用してそのパッチを適用できます。

Note

アプリケーションがインストールされる前に、パッチを昇格された特権を持つとして登録できます。 パッチは、いったん登録されると、このパッチに最後に登録されたアプリケーションが削除されるまで登録されたままになります。

ユーザーごとのマネージド アプリケーションに適用されているパッチは、そのアプリケーション全体を削除しないと削除できません。 ユーザーごとのマネージド アプリケーションのパッチ登録は、そのアプリケーションの削除時に削除されます。

この方法を使用すると、管理者以外のユーザーがマシンごとのアプリケーションにパッチを適用できるようにしたり、「ユーザー アカウント制御 (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;
}