Bagikan melalui


Menghapus Instalan Patch

Dimulai dengan Windows Installer 3.0, dimungkinkan untuk menghapus beberapa patch dari aplikasi. Patch harus berupa patch yang dapat dibongkar. Saat menggunakan versi Penginstal Windows kurang dari versi 3.0, menghapus patch memerlukan penghapusan instalasi produk patch dan menginstal ulang produk tanpa menerapkan patch.

Pemasang Windows 2.0: Tidak didukung. Patch yang diterapkan menggunakan versi Pemasang Windows yang lebih lama dari Windows Installer 3.0 tidak dapat diinstal.

Ketika Anda memanggil penghapusan instalan patch dengan salah satu metode berikut, alat penginstal mencoba menghapus patch dari produk pertama yang terlihat oleh aplikasi atau pengguna yang meminta penghapusan instalasi. Alat penginstal mencari produk yang di-patch dalam urutan berikut: dikelola per pengguna, per pengguna tidak dikelola, per mesin.

Menghapus instalasi patch menggunakan MSIPATCHREMOVE pada baris perintah

Anda dapat menghapus patch dari perintah dengan menggunakan msiexec.exe dan Opsi Baris Perintah. Contoh baris perintah berikut menghapus patch yang dapat dihapus instalannya, example.msp, dari aplikasi, example.msi, menggunakan properti MSIPATCHREMOVE dan opsi baris perintah /i. Saat menggunakan /i, aplikasi yang di-patch dapat diidentifikasi dengan jalur ke paket aplikasi (file .msi) atau kode produk aplikasi. Dalam contoh ini, paket penginstalan aplikasi terletak di "\\server\share\products\example\example.msi" dan properti ProductCode aplikasi adalah "{0C9840E7-7F0B-C648-10F0-4641926FE463}". Paket patch terletak di "\\server\share\products\example\patches\example.msp" dan KODE patch GUID adalah "{EB8C947C-78B2-85A0-644D-86CEEF8E07C0}".

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

Menghapus instalan patch menggunakan opsi baris perintah standar

Dimulai dengan Windows Installer versi 3.0, Anda dapat menggunakan opsi baris perintah standar yang digunakan oleh Microsoft Windows Operating System Updates (update.exe) untuk menghapus instalan patch Pemasang Windows dari baris perintah.

Baris perintah berikut adalah baris perintah standar yang setara dengan baris perintah Pemasang Windows yang digunakan untuk mencopot pemasangan patch menggunakan properti MSIPATCHREMOVE . Opsi /uninstall yang digunakan dengan opsi /package menunjukkan penghapusan instalasi patch. Patch dapat dirujuk oleh jalur lengkap ke patch atau oleh KODE patch GUID.

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

Catatan

Opsi standar /pasif tidak sama persis dengan opsi Windows Installer /qb.

 

Menghapus instalan patch menggunakan metode RemovePatches

Anda dapat menghapus patch dari skrip dengan menggunakan Windows Installer Automation Interface. Sampel skrip berikut menghapus patch yang dapat dihapus instalannya, example.msp, dari aplikasi, example.msi, menggunakan metode RemovePatches dari objek Installer . Setiap patch yang dihapus instalasinya dapat diwakili oleh jalur lengkap ke paket patch atau GUID kode patch. Dalam contoh ini, paket penginstalan aplikasi terletak di "\\server\share\products\example\example.msi" dan properti ProductCode aplikasi adalah "{0C9840E7-7F0B-C648-10F0-4641926FE463}". Paket patch terletak di "\\server\share\products\example\patches\example.msp" dan KODE patch GUID adalah "{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, "")

Menghapus instalasi patch menggunakan Tambah/Hapus Program

Dengan Windows XP, Anda bisa mencopot pemasangan patch menggunakan Tambah/Hapus program.

Menghapus instalan patch menggunakan fungsi MsiRemovePatches

Aplikasi Anda dapat menghapus patch dari aplikasi lain dengan menggunakan Fungsi Penginstal Windows. Contoh kode berikut menghapus patch yang dapat dihapus instalannya, example.msp, dari aplikasi, example.msi, menggunakan fungsi MsiRemovePatches . Patch dapat dirujuk oleh jalur lengkap ke paket patch atau GUID kode patch. Dalam contoh ini, paket penginstalan aplikasi terletak di "\\server\share\products\example\example.msi" dan properti ProductCode aplikasi adalah "{0C9840E7-7F0B-C648-10F0-4641926FE463}". Paket patch terletak di "\\server\share\products\example\patches\example.msp" dan KODE patch GUID adalah "{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);

Menghapus instalasi patch dari semua aplikasi menggunakan fungsi MsiRemovePatches

Satu patch dapat memperbarui lebih dari satu produk di komputer. Aplikasi dapat menggunakan MsiEnumProductsEx untuk menghitung semua produk di komputer dan menentukan apakah patch telah diterapkan ke instans produk tertentu. Aplikasi kemudian dapat menghapus instalan patch menggunakan MsiRemovePatches. Misalnya, satu patch dapat memperbarui beberapa produk jika patch memperbarui file dalam komponen yang dibagikan oleh beberapa produk dan patch didistribusikan untuk memperbarui kedua produk.

Contoh berikut menunjukkan bagaimana aplikasi dapat menggunakan Pemasang Windows untuk menghapus patch dari semua aplikasi yang tersedia untuk pengguna. Ini tidak menghapus patch dari aplikasi yang diinstal per pengguna untuk pengguna lain.

#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;
}

Urutan Patch

Menghapus Patch

Patch yang tidak dapat diinstall

Mencopot Pemasangan Tindakan Kustom

MSIPATCHREMOVE

MsiEnumapplicationsEx

MsiGetPatchInfoEx

MsiRemovePatches