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 ha instalado en un contexto administrado por usuario después de que la revisión se haya registrado con privilegios elevados.
Windows Installer 2.0: no compatible. No se pueden aplicar revisiones a las aplicaciones instaladas en un contexto administrado por usuario con versiones de Windows Installer anteriores a Windows Installer 3.0.
Una aplicación se instala en el estado administrado por usuario en los casos siguientes.
- La instalación por usuario de la aplicación se realizó mediante la implementación y directiva de grupo.
- La aplicación se anunció a un usuario especificado e instaló mediante el método descrito en Anuncio de una aplicación por usuario que se instalará con privilegios elevados.
Se requieren privilegios para instalar una aplicación en el contexto administrado por usuario. Por lo tanto, el instalador también realiza futuras reinstalaciones o reparaciones de Windows Installer con privilegios elevados. Esto significa que solo se pueden aplicar revisiones de orígenes de confianza a la aplicación.
A partir de Windows Installer 3.0, puede aplicar una revisión a una aplicación administrada por usuario después de que la revisión se haya registrado con privilegios elevados. Para registrar una revisión 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 con 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 revisiones de una aplicación administrada por usuario se quitan al eliminar la aplicación.
También puede usar este método para permitir que un usuario 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 con 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 con 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;
}