プロビジョニング パッケージでスクリプトを使用してデスクトップ アプリをインストールする

このチュートリアルでは、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>
    

アプリケーションをインストールするスクリプトを作成する

アプリケーションのインストールに必要な操作を実行するスクリプトを作成します。 必要なインストーラーを実行するオーケストレータ スクリプトを作成しやすいように、以下の例を用意しました。 実際には、オーケストレータ スクリプトはこれら例よりずっと多くのアセットを参照することがあります。

オーケストレーター スクリプトを作成する必要はありません。 アプリごとにコマンド ラインを 1 つ作ることができます。 必要な場合は、プロビジョニング パッケージ全体で 1 つの オーケストレータ スクリプトを作成するのではなく、後述のように、アプリごとの出力をログに記録するスクリプトを作成できます。

スクリプトにより実行されるすべてのアクションは自動的に実行されるため、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%

パッケージ内で複数のスクリプトを呼び出す

プロビジョニング パッケージには、複数 の CommandFile を含めることができます。

プロビジョニング パッケージごとに 1 つの CommandLine を使用できます。 上に示したバッチ ファイルは、インストールを管理し、プロビジョニング パッケージに含まれている他のスクリプトを呼び出す、オーケストレータ スクリプトです。 オーケストレーター スクリプトは、パッケージで指定された CommandLine から呼び出す必要があります。

上の PowerShell の例を使用して、このリレーションシップを説明する表を次に示します。

ICD 設定 設定値 説明
ProvisioningCommands/DeviceContext/CommandLine cmd /c PowerShell_Example.bat オーケストレータ スクリプトを呼び出すために必要なコマンド ライン。
ProvisioningCommands/DeviceContext/CommandFiles PowerShell_Example.bat 必要なインストーラーの呼び出しや、cab ファイルの展開などの他のアクションの実行を処理するコマンド ラインにより参照される単一のオーケストレータ スクリプト。 このスクリプトは、必要なログ記録を行う必要があります。
ProvisioningCommands/DeviceContext/CommandFiles my_powershell_script.ps1 オーケストレータ スクリプトにより参照される他のアセット。 この例では 1 つだけですが、ここで参照されるアセットは多数存在する可能性があります。 一般的な使用事例として、オーケストレータを使って一連の install.exe または setup.exe インストーラーを呼び出し、複数のアプリケーションをインストールする事例があります。 これらの各インストーラーは、ここにアセットとして含める必要があります。

プロビジョニング パッケージにスクリプトを追加する

バッチ ファイルを記述して、参照されるアセットを含める準備ができたら、Window 構成デザイナーでプロビジョニング パッケージに追加できます。

Windows 構成デザイナーを使って、プロビジョニング パッケージ内の CommandLine 設定でスクリプトを実行する必要がある完全な詳細情報を指定します。 これには、通常コマンド ラインで入力するフラグや他のパラメーターが含まれます。 したがって、たとえばアプリ インストーラー (install.exe) とインストールの自動化に使用されるスクリプト (InstallMyApp.bat) がパッケージに含まれていた場合、以下の処理が実行されるように ProvisioningCommands/DeviceContext/CommandLine 設定を構成する必要があります。

cmd /c InstallMyApp.bat

Windows 構成デザイナーでは、次のようになります。

[選択されたカスタマイズ] でのコマンド ライン。

さらに、オーケストレータ スクリプトやオーケストレータ スクリプトが参照する他のアセット (インストーラーや .cab ファイルなど) など、そのコマンド ラインの関連するアセットも追加する必要があります。

Windows 構成デザイナーでは、ProvisioningCommands/DeviceContext/CommandFiles 設定にファイルを追加することで、これを行うことができます。

[選択されたカスタマイズ] でのコマンド ファイル。

完了したら、 パッケージをビルドします

注釈

  1. ProvisioningCommands 経由では、ユーザー操作やコンソール出力がサポートされません。 すべての作業をサイレント実行する必要があります。 スクリプトが次のいずれかを実行しようとすると、未定義の動作が発生し、セットアップ中または Out of Box エクスペリエンス中に実行された場合、デバイスが回復不可能な状態になる可能性があります。

    1. コンソールへのエコー
    2. 画面に何かを表示する
    3. ダイアログまたはインストール ウィザードによってユーザーにダイアログを表示する
  2. 初回起動時に適用されると、プロビジョニングはブート シーケンスの初期かつユーザー コンテキストが確立される前に実行されます。この時点で実行できるインストーラーのみ含めるように注意してください。 他のインストーラーは、管理ツールを使ってプロビジョニングすることができます。

  3. スクリプトが正しくないためにデバイスが回復不能な状態になった場合、Windows クライアントの回復オプションを使ってリセットできます。

  4. CommandFile アセットは、デバイス上の各パッケージに固有の一時フォルダーに展開されます。

    1. 既定のエクスペリエンス中に追加されたパッケージの場合、これは通常、 %WINDIR%\system32\config\systemprofile\appdata\local\Temp\ProvisioningPkgTmp\<{PackageIdGuid}>\Commands\0

      Commands\ 後の 0 は、インストール順を参照して、最初にインストールするアプリを示します。 パッケージの各アプリにより番号が上昇します。

    2. 既にデプロイされているデバイスをダブルクリックして追加されたパッケージの場合、これはプロビジョニング パッケージを実行しているユーザーの一時フォルダーに格納されます。 %TMP%\ProvisioningPkgTmp\<{PackageIdGuid}>\Commands\0

  5. コマンド ラインは、CommandFiles が展開されたディレクトリを作業ディレクトリとして使って実行されます。 つまり、コマンド ラインやスクリプト内でアセットの完全パスを指定する必要はありません。

  6. ランタイム プロビジョニング コンポーネントは、プロビジョニング パッケージが追加された段階に応じて、可能な限り早い時点で PPKG からスクリプトを実行しようとします。 たとえば、パッケージが Out-of-Box Experience 時に追加された場合、Out-of-Box Experience がまだ発生していても、パッケージが適用された直後に実行されます。 これは、ユーザー アカウント構成オプションがユーザーに表示される前です。 回転中の進行状況ダイアログが表示され、画面に「お待ちください」と表示されます。

    このとき、プロビジョニング プロセスは 30 秒でタイムアウトします。 すべてのスクリプトとインストールは、この時間以内に完了する必要があります。

  7. プロビジョニングの残りの部分が引き続き実行される間、スクリプトはバック グラウンドで実行されます。 ダブルクリックを使用して既存のシステムに追加されたパッケージをインストールする場合、プロビジョニングまたはスクリプトの実行が完了したことを示す通知はありません