Uso de un script para instalar una aplicación de escritorio en paquetes de aprovisionamiento

En este tutorial se describe cómo incluir scripts en un paquete de aprovisionamiento de cliente de Windows para instalar aplicaciones Win32. También se pueden realizar operaciones con scripts que no sean la instalación de aplicaciones. Sin embargo, es necesario tener cuidado para evitar comportamientos imprevistos durante la ejecución del script (consulte los comentarios siguientes).

Ensamblaje de los activos de la aplicación

  1. En el dispositivo donde va a crear el paquete, coloque todos los recursos en una ubicación conocida. Cada activo debe tener un nombre de archivo único, porque todos los archivos se copiarán en el mismo directorio temporal del dispositivo. Es habitual que muchas aplicaciones tengan un instalador denominado "install.exe" o similar, y puede haber superposición de nombres debido a eso. Para solucionar esto, puedes usar la técnica descrita en el paso siguiente para incluir una estructura de directorio completa que luego se expanda en el directorio temporal del dispositivo. El uso más común de esto sería incluir un subdirectorio para cada aplicación.

  2. Si necesita incluir una estructura de directorios de archivos, deberá conectar los recursos para facilitar la inclusión en los paquetes de aprovisionamiento.

Compresión en un archivo .cab de los activos de la aplicación

  1. Cree un .DDF archivo como se indica a continuación, reemplace file1 y file2 por los archivos que desea empaquetar y agregue el nombre del archivo o directorio.

    ;*** MSDN Sample Source Code MakeCAB Directive file example
    ;
    .OPTION EXPLICIT  ; Generate errors on variable typos
    .set DiskDirectoryTemplate=CDROM  ; All cabinets go in a single directory
    .Set MaxDiskFileCount=1000; Limit file count per cabinet, so that
    ; scanning is not too slow
    .Set FolderSizeThreshold=200000   ; Aim for ~200K per folder
    .Set CompressionType=MSZIP
    ;** All files are compressed in cabinet files
    .Set Cabinet=on
    .Set Compress=on
    ;-------------------------------------------------------------------
    ;** CabinetNameTemplate = name of cab
    ;** DiskDirectory1 = output directory where cab will be created
    ;-------------------------------------------------------------------
    .Set CabinetNameTemplate=tt.cab
    .Set DiskDirectory1=.
    ;-------------------------------------------------------------------
    ; Replace <file> with actual files you want to package
    ;-------------------------------------------------------------------
    <file1>
    <file2>
    ;*** <the end>
    
  2. Usa makecab para crear los archivos .cab.

    Makecab -f <path to DDF file>
    

Creación del script para instalar la aplicación

Crea un script para realizar cualquier trabajo necesario para instalar las aplicaciones. Los ejemplos siguientes se proporcionan como ayuda para empezar a crear el script orquestador que ejecutará los instaladores necesarios. En la práctica, el script orquestador puede hacer referencia a muchos más recursos de los que se muestran en estos ejemplos.

No es necesario crear un script de orquestador. Puedes tener una línea de comandos por aplicación. Si es necesario, puedes crear un script que registre la salida por aplicación, como se menciona más adelante (en lugar de un script orquestador para todo el paquete de aprovisionamiento).

Nota

Todas las acciones realizadas por el script deben ocurrir de forma silenciosa, sin mostrar ninguna interfaz de usuario y sin intervención del usuario.

Los scripts se ejecutarán en el dispositivo en el contexto del sistema.

Ejemplo de depuración

El registro pormenorizada no está integrado, por lo que el registro debe estar integrado en el propio script. Este es un script de ejemplo que registra "Hola mundo" en un archivo de registro. Cuando se ejecute en el dispositivo, el archivo de registro estará disponible tras completarse el aprovisionamiento. Como verá en los ejemplos siguientes, se recomienda registrar cada acción que realice el script.

set LOGFILE=%SystemDrive%\HelloWorld.log
echo Hello, World >> %LOGFILE%

Ejemplo de archivo .exe

Este script de ejemplo muestra cómo crear un archivo de salida de registro en la unidad del sistema, instalar una aplicación desde un .exe instalador y hacer eco de los resultados en el archivo de registro.

set LOGFILE=%SystemDrive%\Fiddler_install.log
echo Installing Fiddler.exe >> %LOGFILE%
fiddler4setup.exe /S >> %LOGFILE%
echo result: %ERRORLEVEL% >> %LOGFILE%

Ejemplo de un archivo .msi

Es igual que el instalador anterior, pero instala la aplicación desde un instalador MSI. Ten en cuenta que msiexec se llama con la marca /quiet para cumplir con el requisito de silencio de los scripts ejecutados desde dentro de un paquete de aprovisionamiento.

set LOGFILE=%SystemDrive%\IPOverUsb_install.log
echo Installing IpOverUsbInstaller.msi >> %LOGFILE%
msiexec /i IpOverUsbInstaller.msi /quiet >> %LOGFILE%
echo result: %ERRORLEVEL% >> %LOGFILE%

Ejemplo de PowerShell

Este es un script de ejemplo con registro que muestra cómo ejecutar un script de PowerShell desde la configuración de comandos de aprovisionamiento. El script de PowerShell al que se hace referencia en este ejemplo también debe incluirse en el paquete y cumplir los mismos requisitos que todos los scripts que se ejecutan desde dentro del paquete de aprovisionamiento: debe ejecutarse de forma silenciosa, sin interacción con el usuario.

set LOGFILE=%SystemDrive%\my_powershell_script.log
echo Running my_powershell_script.ps1 in system context >> %LOGFILE%
echo Executing "PsExec.exe -accepteula -i -s cmd.exe /c powershell.exe my_powershell_script.ps1" >> %LOGFILE%
PsExec.exe -accepteula -i -s cmd.exe /c 'powershell.exe my_powershell_script.ps1' >> %LOGFILE%
echo result: %ERRORLEVEL% >> %LOGFILE%

Ejemplo de extracción desde un archivo .CAB

Este script de ejemplo muestra la expansión de un .cab desde el script de comandos de aprovisionamiento y la instalación del setup.exe expandido

set LOGFILE=%SystemDrive%\install_my_app.log
echo Expanding installer_assets.cab >> %LOGFILE%
expand -r installer_assets.cab -F:* . >> %LOGFILE%
echo result: %ERRORLEVEL% >> %LOGFILE%
echo Installing MyApp >> %LOGFILE%
setup.exe >> %LOGFILE%
echo result: %ERRORLEVEL% >> %LOGFILE%

Llamada a varios scripts en el paquete

El paquete de aprovisionamiento puede incluir varios commandfiles.

Se le permite una línea de comandos por paquete de aprovisionamiento. Los archivos por lotes mostrados anteriormente son scripts orquestadores que administran la instalación y llaman a los demás scripts incluidos en el paquete de aprovisionamiento. El script de orquestador es lo que se debe invocar desde la línea de comandos especificada en el paquete.

Esta es una tabla que describe esta relación mediante el ejemplo de PowerShell anterior:

Configuración de ICD Valor Descripción
ProvisioningCommands/DeviceContext/CommandLine cmd /c PowerShell_Example.bat La línea de comandos necesaria para invocar el script orquestador.
ProvisioningCommands/DeviceContext/CommandFiles PowerShell_Example.bat El script orquestador único al que hace referencia la línea de comandos que controla la llamada a los instaladores necesarios o la realización de cualquier otra acción, como la expansión de archivos .cab. Este script debe realizar el registro necesario.
ProvisioningCommands/DeviceContext/CommandFiles my_powershell_script.ps1 Otros activos a los que hace referencia el script orquestador. En este ejemplo, solo hay uno, pero podría haber muchos recursos a los que se hace referencia aquí. Un caso de uso común es usar el orquestador para llamar a una serie de instaladores install.exe o setup.exe con el fin de instalar varias aplicaciones. Cada uno de dichos instaladores debe incluirse aquí como un activo.

Añadido de un script al paquete de aprovisionamiento

Cuando tenga el archivo por lotes escrito y los recursos a los que se hace referencia listos para incluirlos, puede agregarlos a un paquete de aprovisionamiento en la Designer configuración de Windows.

Con el Diseñador de configuraciones de Windows, especifica todos los detalles de cómo se debe ejecutar el script en el valor de configuración CommandLine del paquete de aprovisionamiento. Esto incluye las marcas o cualquier otro parámetro que normalmente se escribiría en la línea de comandos. Así, por ejemplo, si el paquete contiene un instalador de aplicación llamado install.exe y un script usado para automatizar la instalación llamado InstallMyApp.bat, el valor de configuración ProvisioningCommands/DeviceContext/CommandLine debe configurarse para lo siguiente:

cmd /c InstallMyApp.bat

En el Diseñador de configuraciones de Windows, tiene esta apariencia:

Línea de comandos en Personalizaciones seleccionadas.

También debes agregar los activos relevantes para esa línea de comandos, incluyendo el script orquestador y cualquier otro activo al que este haga referencia, como los instaladores o los archivos .cab.

En el Diseñador de configuraciones de Windows, esto se logra agregando archivos en el valor de configuración ProvisioningCommands/DeviceContext/CommandFiles.

Archivos de comandos en Personalizaciones seleccionadas.

Cuando haya terminado, compile el paquete.

Observaciones

  1. Mediante ProvisioningCommands, no se admite ninguna intervención del usuario ni salida de la consola. Todo el trabajo debe ser silencioso. Si el script intenta realizar cualquiera de las siguientes acciones, provoca un comportamiento indefinido y podría colocar el dispositivo en un estado irrecuperable si se ejecuta durante la instalación o la experiencia rápida:

    1. Eco en la consola
    2. Mostrar cualquier cosa en la pantalla
    3. Pedir al usuario que intervenga con un cuadro de diálogo o un asistente para la instalación.
  2. Cuando se aplica en el primer arranque, el aprovisionamiento se ejecuta pronto en la secuencia de arranque y antes de que se haya establecido un contexto de usuario; debes tener cuidado e incluir únicamente instaladores que se puedan ejecutar en este momento. Otros instaladores pueden aprovisionarse a través de una herramienta de administración.

  3. Si el dispositivo se coloca en un estado irrecuperable debido a un script incorrecto, puede restablecerlo mediante las opciones de recuperación del cliente Windows.

  4. Los recursos de CommandFile se implementan en el dispositivo en una carpeta temporal exclusiva de cada paquete.

    1. En el caso de los paquetes agregados durante la experiencia integrada, esto suele ser en %WINDIR%\system32\config\systemprofile\appdata\local\Temp\ProvisioningPkgTmp\<{PackageIdGuid}>\Commands\0

      Después 0Commands\ hace referencia al orden de instalación e indica la primera aplicación que se va a instalar. El número aumentará para cada aplicación del paquete.

    2. Para los paquetes agregados haciendo doble clic en un dispositivo ya implementado, estará en la carpeta temporal del usuario que ejecuta el paquete de aprovisionamiento: %TMP%\ProvisioningPkgTmp\<{PackageIdGuid}>\Commands\0

  5. La línea de comandos se ejecutará con el directorio en el que se hayan implementado los valores de configuración CommandFile como directorio de trabajo. Esto significa que no es necesario especificar de la ruta de acceso completa de los activos en la línea de comandos ni en ningún script.

  6. El componente de aprovisionamiento en tiempo de ejecución intentará ejecutar los scripts desde el paquete de aprovisionamiento lo antes posible, según la fase en la que se haya agregado dicho paquete. Por ejemplo, si el paquete se ha agregado durante la configuración rápida, se ejecutará inmediatamente después de aplicar el paquete, mientras aún se esté produciendo la configuración rápida. Esto es antes de que se presenten al usuario las opciones de configuración de la cuenta de usuario. Aparecerá un cuadro de diálogo de progreso giratorio y se mostrará "por favor espere" en la pantalla.

    Nota

    En este punto existe un tiempo de expiración de 30 minutos para el proceso de aprovisionamiento. Todos los scripts y las instalaciones deben completarse dentro de ese período de tiempo.

  7. Los scripts se ejecutan en segundo plano, mientras el resto del aprovisionamiento sigue ejecutándose. En el caso de los paquetes agregados en sistemas existentes que usan el doble clic para instalar, no hay ninguna notificación de que se haya completado el aprovisionamiento o la ejecución de scripts.