Aplicación de revisiones para aplicaciones administradas por usuario

A partir de Windows Installer 3.0, es posible aplicar revisiones a una aplicación que se haya instalado en un contexto administrado por usuario después de que la revisión se haya registrado como con privilegios elevados.

Windows Instalador 2.0: no compatible. No se pueden aplicar revisiones a las aplicaciones instaladas en un contexto administrado por usuario mediante versiones de Windows Instalador anteriores a Windows Installer 3.0.

Una aplicación se instala en el estado administrado por usuario en los casos siguientes.

Se requieren privilegios para instalar una aplicación en el contexto administrado por usuario; por lo tanto, el instalador también realiza futuras Windows reinstalaciones o reparaciones de la aplicación mediante privilegios elevados. Esto significa que solo se pueden aplicar revisiones de orígenes de confianza a la aplicación.

A partir de Windows Instalador 3.0, puede aplicar una revisión a una aplicación administrada por usuario después de que la revisión se haya registrado como con privilegios elevados. Para registrar una revisión como con privilegios elevados, use la función MsiSourceListAddSourceEx o el método SourceListAddSource del objeto Patch , con privilegios elevados. Después de registrar la revisión, puede aplicar la revisión mediante las funciones MsiApplyPatch o MsiApplyMultiplePatches , ApplyPatch o ApplyMultiplePatches del objeto Installer o la opción de línea de comandos /p.

Nota

Una revisión se puede registrar como tener privilegios elevados antes de instalar la aplicación. Cuando se ha registrado una revisión, permanece registrada hasta que se quita la última aplicación registrada para esta revisión.

Las revisiones que se han aplicado a una aplicación administrada por usuario no se pueden quitar sin quitar toda la aplicación. Los registros de revisión de una aplicación administrada por usuario se quitan en la eliminación de la aplicación.

También puede usar este método para permitir que un no administrador aplique revisiones a una aplicación por máquina, o bien puede usar la aplicación de revisiones con privilegios mínimos que se describe en Aplicación de revisiones de Control de cuentas de usuario (UAC).

Ejemplo 1

En el ejemplo de scripting siguiente se usa el método SourceListAddSource para registrar un paquete de revisión ubicado en \\server\share\products\patch\example.msp como tener privilegios elevados. Después, esa revisión está lista para aplicarse a un producto administrado por usuario.

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

Ejemplo 2

En el ejemplo de código siguiente se usa la función MsiSourceListAddSourceEx para registrar un paquete de revisión ubicado en \\server\share\products\patch\example.msp como tener privilegios elevados. Después, esa revisión está lista para aplicarse a un producto administrado por usuario.

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