次の方法で共有


パッチのアンインストール

Windows インストーラー 3.0 以降では、一部のパッチをアプリケーションからアンインストールできるようになりました。 このパッチはアンインストール可能なパッチである必要があります。 バージョン 3.0 より前のバージョンの Windows インストーラーを使用する場合、パッチを削除するには、パッチ製品をアンインストールしてから、そのパッチが適用されていない製品を再インストールする必要があります。

Windows インストーラー 2.0: サポートされていません。 Windows インストーラー 3.0 より前のバージョンの Windows インストーラーを使用して適用されたパッチはアンインストールできません。

次のいずれかの方法でパッチのアンインストールを呼び出すと、インストーラーは、アンインストールを要求しているアプリケーションまたはユーザーに表示される最初の製品からパッチを削除しようとします。 インストーラーは、ユーザーごとのマネージド、ユーザーごとのアンマネージド、マシンごとの順序で、パッチが適用された製品を検索します。

コマンド ラインで MSIPATCHREMOVE を使用してパッチをアンインストールする

msiexec.exe とコマンド ライン オプションを使用することで、コマンドからパッチをアンインストールすることができます。 次のサンプル コマンド ラインは、MSIPATCHREMOVE プロパティと /i コマンド ライン オプションを使用して、アンインストール可能なパッチ example.msp をアプリケーション example.msi から削除するものです。 /i を使用する場合、パッチが適用されたアプリケーションは、アプリケーションのパッケージ (.msi ファイル) へのパス、またはアプリケーションの製品コードによって識別できます。 この例では、アプリケーションのインストール パッケージは "\\server\share\products\example\example.msi" にあり、アプリケーションの ProductCode プロパティは "{0C9840E7-7F0B-C648-10F0-4641926FE463}" です。 パッチ パッケージは "\\server\share\products\example\patchs\example.msp" にあり、パッチ コード GUID は "{EB8C947C-78B2-85A0-644D-86CEEF8E07C0}" です。

Msiexec /I {0C9840E7-7F0B-C648-10F0-4641926FE463} MSIPATCHREMOVE={EB8C947C-78B2-85A0-644D-86CEEF8E07C0} /qb

標準のコマンド ライン オプションを使用してパッチをアンインストールする

Windows インストーラー バージョン 3.0 以降では、Microsoft Windows オペレーティング システムの更新プログラム (update.exe) で使用される標準のコマンド ライン オプションを使用して、コマンド ラインから Windows インストーラーパッチをアンインストールできます。

次のコマンド ラインは、MSIPATCHREMOVE プロパティを使用してパッチをアンインストールするために使用される Windows インストーラー コマンド ラインの標準コマンド ラインに相当するものです。 /package オプションと共に使用される /uninstall オプションは、パッチのアンインストールを表します。 パッチは、パッチへの完全なパスまたはパッチ コードの GUID で参照できます。

Msiexec /package {0C9840E7-7F0B-C648-10F0-4641926FE463} /uninstall {EB8C947C-78B2-85A0-644D-86CEEF8E07C0} /passive

Note

/passive 標準オプションは、Windows インストーラーの /qb オプションと完全に等価なものではありません。

 

RemovePatches メソッドを使用してパッチをアンインストールする

Windows インストーラーのオートメーション インターフェイスを使用して、スクリプトからパッチをアンインストールできます。 次のサンプル スクリプトは、Installer オブジェクトの RemovePatches メソッドを使用して、アンインストール可能なパッチ example.msp をアプリケーション example.msi から削除します。 アンインストールされる各パッチは、パッチ パッケージへの完全なパスまたはパッチ コード GUID で表すことができます。 この例では、アプリケーションのインストール パッケージは "\\server\share\products\example\example.msi" にあり、アプリケーションの ProductCode プロパティは "{0C9840E7-7F0B-C648-10F0-4641926FE463}" です。 パッチ パッケージは "\\server\share\products\example\patchs\example.msp" にあり、パッチ コード GUID は "{EB8C947C-78B2-85A0-644D-86CEEF8E07C0}" です。

const msiInstallTypeSingleInstance = 2
const PatchList = "{EB8C947C-78B2-85A0-644D-86CEEF8E07C0}"
const Product = "{0C9840E7-7F0B-C648-10F0-4641926FE463}"

Dim installer
Set installer = CreateObject("WindowsInstaller.Installer")

installer.RemovePatches(PatchList, Product, msiInstallTypeSingleInstance, "")

プログラムの Add または Remove を使用してパッチをアンインストールする

Windows XP では、プログラムの Add または Remove を使用してパッチをアンインストールできます。

MsiRemovePatches 関数を使用してパッチをアンインストールする

アプリケーションでは、Windows インストーラーの関数を使用して、他のアプリケーションからパッチをアンインストールできます。 次のコード例は、MsiRemovePatches 関数を使用して、アンインストール可能なパッチ example.msp をアプリケーション example.msi から削除します。 パッチは、パッチ パッケージへの完全なパスまたはパッチ コードの GUID で参照できます。 この例では、アプリケーションのインストール パッケージは "\\server\share\products\example\example.msi" にあり、アプリケーションの ProductCode プロパティは "{0C9840E7-7F0B-C648-10F0-4641926FE463}" です。 パッチ パッケージは "\\server\share\products\example\patchs\example.msp" にあり、パッチ コード GUID は "{EB8C947C-78B2-85A0-644D-86CEEF8E07C0}" です。

    UINT uiReturn = MsiRemovePatches(
          /*szPatchList=*/TEXT("\\server\\share\\products\\example\\patches\\example.msp"),
          /*szProductCode=*/  TEXT("{0C9840E7-7F0B-C648-10F0-4641926FE463}"),
          /*eUninstallType=*/ INSTALLTYPE_SINGLE_INSTANCE,
          /*szPropertyList=*/ NULL);

MsiRemovePatches 関数を使用してすべてのアプリケーションからパッチをアンインストールする

1 つのパッチで、コンピューター上の複数の製品を更新できます。 アプリケーションでは、MsiEnumProductsEx を使用してコンピューター上のすべての製品を列挙し、製品の特定のインスタンスにパッチが適用されているかどうかを判断できます。 その後、アプリケーションで MsiRemovePatches を使用してパッチをアンインストールできます。 たとえば、複数の製品で共有されているコンポーネントのファイルを更新するパッチがあり、そのパッチが両方の製品を更新するために配布されている場合、1 つのパッチで複数の製品を更新することができます。

次の例では、アプリケーションで Windows インストーラーを使用して、ユーザーが使用できるすべてのアプリケーションからパッチを削除する方法を示します。 別のユーザーのためにユーザーごとにインストールされたアプリケーションからパッチを削除することはできません。

#ifndef UNICODE
#define UNICODE
#endif //UNICODE

#ifndef _WIN32_MSI
#define _WIN32_MSI 300
#endif //_WIN32_MSI

#include <stdio.h>
#include <windows.h>
#include <msi.h>

#pragma comment(lib, "msi.lib")

const int cchGUID = 38;

///////////////////////////////////////////////////////////////////
// RemovePatchFromAllVisibleapplications:
//
// Arguments:
//    wszPatchToRemove - GUID of patch to remove
//
///////////////////////////////////////////////////////////////////
//
UINT RemovePatchFromAllVisibleapplications(LPCWSTR wszPatchToRemove)
{
    if (!wszPatchToRemove)
        return ERROR_INVALID_PARAMETER;

    UINT uiStatus = ERROR_SUCCESS;
    DWORD dwIndex = 0;
    WCHAR wszapplicationCode[cchGUID+1] = {0};

    DWORD dwapplicationSearchContext = MSIINSTALLCONTEXT_ALL;
    MSIINSTALLCONTEXT dwInstallContext = MSIINSTALLCONTEXT_NONE;

    do
    {
        // Enumerate all visible applications in all contexts for the caller.
        // NULL for szUserSid defaults to using the caller's SID
        uiStatus = MsiEnumProductsEx(/*szapplicationCode*/NULL,
         /*szUserSid*/NULL,
         dwapplicationSearchContext,
         dwIndex,
         wszapplicationCode,
         &dwInstallContext,
         /*szSid*/NULL,
         /*pcchSid*/NULL);

        if (ERROR_SUCCESS == uiStatus)
        {
            // check to see if the provided patch is
            // registered for this application instance
            UINT uiPatchStatus = MsiGetPatchInfoEx(wszPatchToRemove,
             wszapplicationCode,
             /*szUserSid*/NULL,
             dwInstallContext,
             INSTALLPROPERTY_PATCHSTATE,
             NULL,
             NULL);

            if (ERROR_SUCCESS == uiPatchStatus)
            {
                // patch is registered to this application; remove patch
                wprintf(L"Removing patch %s from application %s...\n",
                 wszPatchToRemove, wszapplicationCode);
                                
                UINT uiRemoveStatus = MsiRemovePatches(
                 wszPatchToRemove,
                 wszapplicationCode,
                 INSTALLTYPE_SINGLE_INSTANCE,
                 L"");

                if (ERROR_SUCCESS != uiRemoveStatus)
                {
                    // This halts the enumeration and fails. Alternatively
                    // you could output an error and continue the
                    // enumeration
                     return ERROR_FUNCTION_FAILED;
                }
            }
            else if (ERROR_UNKNOWN_PATCH != uiPatchStatus)
            {
                // Some other error occurred during processing. This
                // halts the enumeration and fails. Alternatively you
                // could output an error and continue the enumeration
                 return ERROR_FUNCTION_FAILED;
            }
            // else patch was not applied to this application
            // (ERROR_UNKNOWN_PATCH returned)
        }

        dwIndex++;
    }
    while (uiStatus == ERROR_SUCCESS);

    if (ERROR_NO_MORE_ITEMS != uiStatus)
        return ERROR_FUNCTION_FAILED;

    return ERROR_SUCCESS;
}

パッチのシーケンス処理

パッチの削除

アンインストール可能なパッチ

パッチをアンインストールするカスタム アクション

MSIPATCHREMOVE

MsiEnumapplicationsEx

MsiGetPatchInfoEx

MsiRemovePatches