Bagikan melalui


Patching Per-User Aplikasi Terkelola

Dimulai dengan Windows Installer 3.0, dimungkinkan untuk menerapkan patch ke aplikasi yang telah diinstal dalam konteks yang dikelola per pengguna setelah patch didaftarkan sebagai memiliki hak istimewa yang ditinggikan.

Pemasang Windows 2.0: Tidak didukung. Anda tidak dapat menerapkan patch ke aplikasi yang diinstal dalam konteks terkelola per pengguna menggunakan versi Pemasang Windows yang lebih lama dari Windows Installer 3.0.

Aplikasi diinstal dalam status yang dikelola per pengguna dalam kasus berikut.

Hak istimewa diperlukan untuk menginstal aplikasi dalam konteks yang dikelola per pengguna; oleh karena itu, penginstalan ulang Windows Installer di masa mendatang atau perbaikan aplikasi juga dilakukan oleh alat penginstal menggunakan hak istimewa yang ditingkatkan. Ini berarti bahwa hanya patch dari sumber tepercaya yang dapat diterapkan ke aplikasi.

Dimulai dengan Windows Installer 3.0, Anda dapat menerapkan patch ke aplikasi terkelola per pengguna setelah patch terdaftar sebagai memiliki hak istimewa yang ditinggikan. Untuk mendaftarkan patch sebagai memiliki hak istimewa yang ditinggikan, gunakan fungsi MsiSourceListAddSourceEx atau metode SourceListAddSource dari objek Patch , dengan hak istimewa yang ditinggikan. Setelah mendaftarkan patch, Anda dapat menerapkan patch menggunakan fungsi MsiApplyPatch atau MsiApplyMultiplePatches , metode ApplyPatch atau ApplyMultiplePatches dari Installer Object, atau opsi baris perintah /p.

Catatan

Patch dapat didaftarkan sebagai memiliki hak istimewa yang ditinggikan sebelum aplikasi diinstal. Ketika patch telah didaftarkan, patch tetap terdaftar sampai aplikasi terakhir yang terdaftar untuk patch ini dihapus.

Patch yang telah diterapkan ke aplikasi terkelola per pengguna tidak dapat dihapus tanpa menghapus seluruh aplikasi. Pendaftaran patch untuk aplikasi terkelola per pengguna dihapus pada penghapusan aplikasi.

Anda juga dapat menggunakan metode ini untuk mengaktifkan non-administrator untuk menambal aplikasi per komputer, atau Anda dapat menggunakan patching hak istimewa paling sedikit yang dijelaskan dalam Patching Kontrol Akun Pengguna (UAC).

Contoh 1

Sampel skrip berikut menggunakan metode SourceListAddSource untuk mendaftarkan paket patch yang terletak di \\server\share\products\patches\example.msp karena memiliki hak istimewa yang ditinggikan. Patch tersebut kemudian siap untuk diterapkan ke produk yang dikelola per pengguna.

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

Contoh 2

Sampel kode berikut menggunakan fungsi MsiSourceListAddSourceEx untuk mendaftarkan paket patch yang terletak di \\server\share\products\patches\example.msp karena memiliki hak istimewa yang ditinggikan. Patch tersebut kemudian siap untuk diterapkan ke produk yang dikelola per pengguna.

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