Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
A partir do Windows Installer 3.0, é possível aplicar patches a um aplicativo que foi instalado em um contexto gerenciado por usuário depois que o patch foi registrado como tendo privilégios elevados.
Windows Installer 2.0: Não suportado. Não é possível aplicar patches a aplicativos instalados em um contexto gerenciado por usuário usando versões do Windows Installer anteriores ao Windows Installer 3.0.
Um aplicativo é instalado no estado gerenciado por usuário nos seguintes casos.
- A instalação por usuário do aplicativo foi executada usando a implantação e Diretiva de Grupo.
- A aplicação foi anunciada para um utilizador especificado e instalada pelo método descrito em Advertising a Per-User Application To Be Installed with Elevated Privileges.
Os privilégios são necessários para instalar um aplicativo no contexto gerenciado por usuário; portanto, futuras reinstalações ou reparos do aplicativo do Windows Installer também são executados pelo instalador usando privilégios elevados. Isso significa que apenas patches de fontes confiáveis podem ser aplicados ao aplicativo.
A partir do Windows Installer 3.0, você pode aplicar um patch a um aplicativo gerenciado por usuário depois que o patch tiver sido registrado como tendo privilégios elevados. Para registrar um patch como tendo privilégios elevados, use a função MsiSourceListAddSourceEx ou o métodoSourceListAddSourcedo objeto Patch, com privilégios elevados. Depois de registar o patch, pode aplicá-lo usando as funções MsiApplyPatch ou MsiApplyMultiplePatches, ou os métodos ApplyPatch ou ApplyMultiplePatches do Installer Object, ou a opção de linha de comando /p .
Observação
Um patch pode ser registrado como tendo privilégios elevados antes que o aplicativo seja instalado. Quando um patch é registado, permanece registado até que a última aplicação registada para este patch seja removida.
Os patches que foram aplicados a um aplicativo gerenciado por usuário não podem ser removidos sem remover o aplicativo inteiro. Os registros de patch para um aplicativo gerenciado por usuário são removidos na remoção do aplicativo.
Você também pode usar este método para permitir que um não-administrador aplique correções a uma aplicação por máquina ou pode usar a aplicação de patches com privilégios mínimos descrita em Aplicação de Patches do UAC (Controle de Conta de Utilizador).
Exemplo 1
O exemplo de script a seguir usa o métodoSourceListAddSourcepara registrar um pacote de patch localizado em \\server\share\products\patches\example.msp como tendo privilégios elevados. Esse patch está então pronto para ser aplicado a um produto gerenciado por usuário.
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
Exemplo 2
O exemplo de código a seguir usa a funçãoMsiSourceListAddSourceEx para registrar um pacote de patch localizado em \\server\share\products\patches\example.msp como tendo privilégios elevados. Esse patch está então pronto para ser aplicado a um produto gerenciado por usuário.
#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;
}