使用脚本安装预配程序包中的桌面应用

本演练介绍如何在 Windows 客户端预配包中包含脚本以安装 Win32 应用程序。 还可以执行除安装应用以外的脚本化操作。 但是,需要注意避免脚本执行过程中出现意外行为 (请参阅) 下面的 备注

整合应用程序资源

  1. 在创作包的设备上,将所有资产放在已知位置。 每个资源必须具有一个唯一的文件名,因为所有文件都将复制到设备上的同一临时目录中。 许多应用通常具有名为“install.exe”或类似的安装程序,因此可能存在名称重叠。 若要解决此问题,你可以使用下一步骤中描述的技术包含一个完整的目录结构,然后将其展开到设备上的临时目录中。 这一技术最常用的情况就是,包含每个应用程序的子目录。

  2. 如果需要包含文件的目录结构,则需要利用这些资产,以便轻松包含在预配包中。

Cab 应用程序资源

  1. .DDF创建如下所示的文件,将 file1file2 替换为要打包的文件,并添加文件/目录的名称。

    ;*** 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. 使用 makecab 创建 cab 文件。

    Makecab -f <path to DDF file>
    

创建脚本,安装应用程序

创建脚本执行安装应用程序所需的所有工作。 提供以下示例,帮助创作 orchestrator 脚本的入门,此脚本将执行所需的安装程序。 实际上,相比这些示例中的脚本,orchestrator 脚本可引用更多的资源。

无需创建业务流程协调程序脚本。 每个应用可以对应有一个命令行。 如有必要,你可以创建一个记录每个应用的输出的脚本,如下所述(而不是对整个预配包使用一个 orchestrator 脚本)。

注意

  • 脚本执行的所有操作必须以静默方式发生,不显示 UI,也不需要用户交互。
  • 脚本将在设备上的系统上下文中运行。

调试示例

未内置精细日志记录,因此日志记录必须内置到脚本本身中。 下面是记录 Hello World 到日志文件的示例脚本。 在设备上运行时,预配完成后将提供日志文件。 如以下示例所示,建议记录脚本执行的每个操作。

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

.exe 示例

此示例脚本演示如何在系统驱动器上创建日志输出文件、从 .exe 安装程序安装应用,以及如何将结果回显到日志文件。

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

.msi 示例

此示例与之前的安装程序相同,但安装的是 MSI 应用程序中的应用。 注意,为满足从预配包中运行脚本的静默要求,必须将 msiexec 和 /quiet 标志一起调用。

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

PowerShell 示例

这是一个包含日志记录的示例脚本,演示如何从预配命令设置运行 PowerShell 脚本。 从此示例引用的 PowerShell 脚本也必须包含在包中,并遵循与预配包中运行的所有脚本相同的要求:它必须以无提示方式执行,无需用户交互。

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%

从 .CAB 中提取的示例

此示例脚本显示从预配命令脚本扩展 .cab,以及扩展 setup.exe

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%

调用包中的多个脚本

预配包可以包含多个 CommandFiles

每个预配包允许一个 CommandLine 。 以上所示批处理文件是 orchestrator 脚本,可管理安装并调用预配包中包含的任意其他脚本。 业务流程协调程序脚本应从包中指定的 CommandLine 调用。

下表使用上面的 PowerShell 示例描述此关系:

ICD 设置 描述
ProvisioningCommands/DeviceContext/CommandLine cmd /c PowerShell_Example.bat 调用 orchestrator 脚本所需的命令行。
ProvisioningCommands/DeviceContext/CommandFiles PowerShell_Example.bat 由处理调用所需的安装程序或执行任意其他操作(例如,展开 cab 文件)的命令行引用的单个 orchestrator 脚本。 此脚本必须进行所需的日志记录。
ProvisioningCommands/DeviceContext/CommandFiles my_powershell_script.ps1 orchestrator 脚本引用的其他资源。 在此示例中,只有一个,但此处可能引用了许多资产。 一个常见的用例是,使用 orchestrator 调用一系列 install.exe 或 setup.exe 安装程序,从而安装多个应用程序。 每个安装程序都必须作为资源包含在其中。

将脚本添加到预配包中

编写批处理文件并准备好包含引用的资产后,可以将它们添加到 Windows 配置设计器中的预配包。

使用 Windows 配置设计器,指定如何在预配包的 CommandLine 设置中运行脚本的完整详细信息。 这包括标志或通常键入命令行的任何其他参数。 因此,例如,如果包中包含名 install.exe 的应用安装程序和名为 InstallMyApp.bat 的用于自动化安装的脚本,应将 ProvisioningCommands/DeviceContext/CommandLine 设置配置为:

cmd /c InstallMyApp.bat

在 Windows 配置设计器中如下所示:

所选自定义项中的命令行。

你还需要为此命令行添加相关资源,包括 orchestrator 脚本和它引用的任意其他资源,例如安装程序或 .cab 文件。

在 Windows 配置设计器中,通过添加 ProvisioningCommands/DeviceContext/CommandFiles 设置下的文件完成此操作。

所选自定义项中的命令文件。

完成后, 生成包

备注

  1. 不支持通过 ProvisioningCommands 进行交互或控制台输出。 所需工作都需要以静默方式完成。 如果脚本尝试执行以下任一操作,则会导致未定义的行为,并且如果在安装或开箱即用体验期间执行,则可能会使设备处于不可恢复状态:

    1. 回显到主机
    2. 在屏幕上显示任何内容
    3. 用对话框或安装向导提示用户
  2. 当在首次启动中应用时,预配会在启动序列的早期和建立用户上下文之前运行;必须格外小心,仅包含可在此时运行的安装程序。 可通过管理工具预配其他安装程序。

  3. 如果设备由于脚本错误而处于不可恢复状态,则可以使用 Windows 客户端中的恢复选项重置设备。

  4. 已将 CommandFile 资源部署到设备的临时文件夹中,每个包的临时文件夹都是唯一的。

    1. 对于在现用体验期间添加的包,这通常位于 %WINDIR%\system32\config\systemprofile\appdata\local\Temp\ProvisioningPkgTmp\<{PackageIdGuid}>\Commands\0

      0后面的 Commands\ 引用安装顺序,并指示要安装的第一个应用。 针对包中的每个应用,该数字将会递增。

    2. 对于通过双击已部署的设备添加的包,这将位于执行预配包的用户的临时文件夹中: %TMP%\ProvisioningPkgTmp\<{PackageIdGuid}>\Commands\0

  5. 将使用将 CommandFiles 作为工作目录部署的目录执行命令行。 这意味着,你无需将完整路径特定于命令行或任意脚本中的资源。

  6. 运行时预配组件将尝试运行位于尽可能最早点的预配包中的脚本,具体取决于添加 PPKG 时所处的阶段。 例如,如果在全新体验期间添加了包,则会在应用包后(全新体验仍然在发生时)立即运行。 这发生在用户帐户配置选项呈现给用户之前。 将显示一个旋转进度对话框,屏幕上将显示“请等待”。

    注意

    此时会有 30 分钟的预配置进程超时。 需要在这期间完成所有脚本和安装。

  7. 脚本会在其余预配继续运行时在后台执行。 对于使用双击安装在现有系统上添加的包,不会收到预配或脚本执行已完成的通知

后续步骤

详细了解如何应用预配包:

应用预配包