使用脚本安装预配程序包中的桌面应用
本演练介绍如何在 Windows 客户端预配包中包含脚本以安装 Win32 应用程序。 还可以执行除安装应用以外的脚本化操作。 但是,需要注意避免脚本执行过程中出现意外行为 (请参阅) 下面的 备注 。
整合应用程序资源
在创作包的设备上,将所有资产放在已知位置。 每个资源必须具有一个唯一的文件名,因为所有文件都将复制到设备上的同一临时目录中。 许多应用通常具有名为“install.exe”或类似的安装程序,因此可能存在名称重叠。 若要解决此问题,你可以使用下一步骤中描述的技术包含一个完整的目录结构,然后将其展开到设备上的临时目录中。 这一技术最常用的情况就是,包含每个应用程序的子目录。
如果需要包含文件的目录结构,则需要利用这些资产,以便轻松包含在预配包中。
Cab 应用程序资源
.DDF
创建如下所示的文件,将 file1 和 file2 替换为要打包的文件,并添加文件/目录的名称。;*** 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>
使用 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
设置下的文件完成此操作。
完成后, 生成包。
备注
不支持通过 ProvisioningCommands 进行交互或控制台输出。 所需工作都需要以静默方式完成。 如果脚本尝试执行以下任一操作,则会导致未定义的行为,并且如果在安装或开箱即用体验期间执行,则可能会使设备处于不可恢复状态:
- 回显到主机
- 在屏幕上显示任何内容
- 用对话框或安装向导提示用户
当在首次启动中应用时,预配会在启动序列的早期和建立用户上下文之前运行;必须格外小心,仅包含可在此时运行的安装程序。 可通过管理工具预配其他安装程序。
如果设备由于脚本错误而处于不可恢复状态,则可以使用 Windows 客户端中的恢复选项重置设备。
已将 CommandFile 资源部署到设备的临时文件夹中,每个包的临时文件夹都是唯一的。
对于在现用体验期间添加的包,这通常位于
%WINDIR%\system32\config\systemprofile\appdata\local\Temp\ProvisioningPkgTmp\<{PackageIdGuid}>\Commands\0
0
后面的Commands\
引用安装顺序,并指示要安装的第一个应用。 针对包中的每个应用,该数字将会递增。对于通过双击已部署的设备添加的包,这将位于执行预配包的用户的临时文件夹中:
%TMP%\ProvisioningPkgTmp\<{PackageIdGuid}>\Commands\0
将使用将 CommandFiles 作为工作目录部署的目录执行命令行。 这意味着,你无需将完整路径特定于命令行或任意脚本中的资源。
运行时预配组件将尝试运行位于尽可能最早点的预配包中的脚本,具体取决于添加 PPKG 时所处的阶段。 例如,如果在全新体验期间添加了包,则会在应用包后(全新体验仍然在发生时)立即运行。 这发生在用户帐户配置选项呈现给用户之前。 将显示一个旋转进度对话框,屏幕上将显示“请等待”。
注意
此时会有 30 分钟的预配置进程超时。 需要在这期间完成所有脚本和安装。
脚本会在其余预配继续运行时在后台执行。 对于使用双击安装在现有系统上添加的包,不会收到预配或脚本执行已完成的通知
后续步骤
详细了解如何应用预配包: