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

適用対象

  • Windows 10
  • Windows 10 Mobile

このチュートリアルでは、Windows 10 プロビジョニング パッケージにスクリプトを含めて Win32 アプリケーションをインストールする機能を利用する方法について説明します。 アプリのインストール以外のスクリプト操作も実行されますが、スクリプトの実行時に予期しない動作を防ぐため、同じ注意が必要です (以下の注釈をご覧ください)。

前提条件: Windows 10 バージョン 1511 以上用 Windows アセスメント & デプロイメント キット (ADK)

注意

このシナリオは、デスクトップ用 Windows 10 バージョン 1511 以上にアプリケーションをインストールする場合にのみ当てはまります。

アプリケーション アセットを作成する

  1. パッケージを作成するデバイスで、すべてのアセットを既知の場所に置きます。 すべてのファイルがデバイス上の同じ一時ディレクトリにコピーされるため、各アセットには一意の名前が必要です。 アプリに "install.exe" などの似た名前のインストーラーが使われていることがよくあるため、名前が重複する可能性があります。 これを解決するには、次の手順で説明されている手法を使ってディレクトリ構造全体を含め、デバイス上の一時ディレクトリに展開します。 最も一般的な使用方法は、各アプリケーションのサブディレクトリを含める方法です。

  2. ファイルのディレクトリ構造を含める必要がある場合、プロビジョニング パッケージに含めやすいようにアセットを cab 化する必要があります。

アプリケーション アセットを 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>
    

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

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

Windows 10 バージョン 1703 では、オーケストレータ スクリプトを作成する必要はありません。 アプリごとにコマンド ラインを 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%

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

Windows 10 バージョン 1703 では、プロビジョニング パッケージに複数の CommandLine を含むことができます。

Windows 10 バージョン 1607 以前では、プロビジョニング パッケージごとに 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 インストーラーを呼び出し、複数のアプリケーションをインストールする事例があります。 これらの各インストーラーは、ここにアセットとして含める必要があります。

プロビジョニング パッケージにスクリプトを追加します (Windows 10 バージョン 1607)。

バッチ ファイルを記述して、参照されるアセットを追加する準備ができたら、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 Experience 時に実行されるとデバイスが回復不能な状態になる可能性があります。a. コンソールにエコーする b. 画面に何かを表示する c. ダイアログまたはインストール ウィザードによってユーザーにダイアログを表示する
  2. 初回起動時に適用されると、プロビジョニングはブート シーケンスの初期かつユーザー コンテキストが確立される前に実行されます。この時点で実行できるインストーラーのみ含めるように注意してください。 他のインストーラーは、管理ツールを使ってプロビジョニングすることができます。
  3. スクリプトが正しくないためにデバイスが回復不能な状態になった場合、Windows 10 の回復オプションを使ってリセットできます。
  4. CommandFile アセットは、デバイス上の各パッケージに固有の一時フォルダーに展開されます。
    • Windows 10 バージョン 1607 以前: a. Out Of Box Experience 時に追加されたパッケージの場合、これは通常 %WINDIR%\system32\config\systemprofile\appdata\local\Temp\ProvisioningPkgTmp\<{PackageIdGuid}>\Commands にあります。b. 既に展開されたデバイスでダブルクリックして追加されたパッケージの場合、これは PPKG を実行するユーザーの一時フォルダーに置かれます。 %TMP%\ProvisioningPkgTmp\<{PackageIdGuid}>\Commands
    • Windows 10 バージョン 1703 では: a. Out Of Box Experience 時に追加されたパッケージの場合、これは通常 %WINDIR%\system32\config\systemprofile\appdata\local\Temp\ProvisioningPkgTmp\<{PackageIdGuid}>\Commands\0 にあります。Commands\ の後の 0 は、インストール順序を示し、最初にインストールするアプリであることを示します。 パッケージの各アプリで、番号がインクリメントされます。 b. 既に展開されたデバイスでダブルクリックして追加されたパッケージの場合、これはプロビジョニング パッケージを実行するユーザーの一時フォルダーに置かれます。 %TMP%\ProvisioningPkgTmp\<{PackageIdGuid}>\Commands\0
  5. コマンド ラインは、CommandFiles が展開されたディレクトリを作業ディレクトリとして使って実行されます。 つまり、コマンド ラインやスクリプト内でアセットの完全パスを指定する必要はありません。
  6. ランタイム プロビジョニング コンポーネントは、プロビジョニング パッケージが追加された段階に応じて、可能な限り早い時点で PPKG からスクリプトを実行しようとします。 たとえば、パッケージが Out-of-Box Experience 時に追加された場合、Out-of-Box Experience がまだ発生していても、パッケージが適用された直後に実行されます。 これは、ユーザー アカウント構成オプションがユーザーに表示される前です。 回転する進行状況ダイアログが表示され、画面に "お待ちください" と表示されます。

    注意

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

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

関連トピック