PSAppDeployToolkitの使い方 (入門編)

# はじめに

SCCMやIntuneでアプリケーションの配布を行う際には、アプリによりますが、インストールの際に追加で色々と行わないといけない事があります。
setup.exeなどのインストーラの実行のみならず、msiのインストール、ファイルコピーやレジストリの追加、環境変数の追加、事前にVC runtimeのインストールなども必要な場合があります。
すべて手動で実施するわけにはいかないので、スクリプト化して実行すると思いますが、一からスクリプトをすべてを記述するのはなかなか大変ですね。

上記のようなアクションが簡単に記述できるツール集がPSAppDeployToolkitです。少し複雑なインストールの手順でも、このツールを利用すると、簡単にインストールの記述が行えます。
また、インストール前にユーザにダイアログを表示したり、実行中のプログラムを終了したりと、ユーザ対話も可能とするツールになっています。
海外の有志の方が作成・メンテされているものです。

# 入手方法

以下のサイトから入手できます。
[PSAppDeployToolkit](https://psappdeploytoolkit.com/)
Downloadの箇所をクリックすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015969/a52daf4d-f1b9-439a-a046-9707a79ece5e.png)

GitHubのページが開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015969/2dc45622-5f25-8e3d-5bfc-acd5199d6042.png)

下のほうにスクロールし、Assetのところからダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015969/158b5183-6d9e-ec63-45de-6c8f10cd4470.png)

PSAppDeployToolkit_v3.9.3.zipをダウンロードし、解凍します。
Toolkitフォルダの中に一式配置されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015969/06d6fb45-7ded-9dc8-a4d9-154b71e30f8a.png)

# ファイル配置

まず、新規にフォルダを作成し、その中に上記でダウンロードしたToolkitフォルダの中身をコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015969/06d6fb45-7ded-9dc8-a4d9-154b71e30f8a.png)

インストールに使用するインストーラなどのファイルをFilesフォルダの中にコピーします。
そして、Deploy-Application.ps1の中に、インストールに必要となる情報・コマンドなどを記述することになります。

# 使い方

Deploy-Application.ps1の中身を見てみましょう。
いくつかのセクションに分かれています、セクションを一覧にしてみるとこんな感じです。

| セクション名 | 説明 |
|:-|:-|
| VARIABLE DECLARATION  |  変数の宣言 |
| PRE-INSTALLATION  | インストール前の処理  |
| INSTALLATION  | インストール処理  |
| POST-INSTALLATION  | インストール後の処理  |
| PRE-UNINSTALLATION  | アンインストール前の処理  |
| UNINSTALLATION  | アンインストール処理  |
| POST-UNINSTALLATION | アンインストール後の処理  |
| PRE-REPAIR  | 修復前の処理  |
| REPAIR  | 修復処理  |
| POST-REPAIR  | 修復後の処理  |

前処理、後処理のところでは、ユーザに事前、事後のダイアログを表示する機能の実行を想定しています。
インストール、アンインストール、修復のすべてをこの中に記述しておきます。
実際にどの処理を実行するかは、Deploy-Application.exeに対してパラメータを渡すことでどの処理を行うかを指定します。

Deploy-Application.exe -DeploymentType 'Install'
Deploy-Application.exe -DeploymentType 'Uninstall'
Deploy-Application.exe -DeploymentType 'Repair'

インストールとアンインストールだけでよければRepairのセクションを記述する必要はありません。

# MSIの例

一例として7ZipをPSAppDeployToolkitの色々な機能を使いながら設定してみたいと思います。

## 変数宣言

ZeroConfig MSIの都合、アプリそのものの情報は入れていません。スクリプトの情報のみ記載しています。

```powershell:Deploy-Application.ps1
    ##*===============================================
    ##* VARIABLE DECLARATION
    ##*===============================================
    ## Variables: Application
    [String]$appVendor = ''
    [String]$appName = ''
    [String]$appVersion = ''
    [String]$appArch = ''
    [String]$appLang = 'EN'
    [String]$appRevision = '01'
    [String]$appScriptVersion = '1.0.0'
    [String]$appScriptDate = '05/21/2023'
    [String]$appScriptAuthor = 'Device Manager'
    ##*===============================================
```

## インストール前のユーザ向けダイアログ表示
インストール実行前に、特定のアプリケーションが実行されている場合に、警告画面を表示します。
PRE-INSTALLATIONセクションの以下の部分になります。
今回7Zip File Manager 7zFM.exeが起動している場合に警告を表示します。
また、インストールするかどうかを3回まで延期可能としてユーザに確認します。
```powershell:Deploy-Application.ps1
## Show Welcome Message, close Internet Explorer if required, allow up to 3 deferrals, verify there is enough disk space to complete the install, and persist the prompt
Show-InstallationWelcome -CloseApps '7zFM' -AllowDefer -DeferTimes 3 -CheckDiskSpace -PersistPrompt
```

## インストール中の状況表示画面
ここは編集不要です。

```powershell:Deploy-Application.ps1
## Show Progress Message (with the default message)
Show-InstallationProgress
```

## Zero-Configuration MSI Deployment
インストールするアプリがMSIファイル一つであれば、ファイルを保管するだけで自動的にインストールを実行してくれます。
今回は7-ZIPのMSI版をダウンロードして、Filesフォルダにコピーしておきます。
注意点として、VARIABLE DECLARATIONの$appNameには何も入力しないようにする必要があるようです。
"## Handle Zero-Config MSI Installations"の箇所でMSIの自動インストールが行われます。編集は不要です。



## インストール完了時の通知機能

メッセージ部分のみカスタマイズしました。

```powershell:Deploy-Application.ps1
        ## Display a message at the end of the install
        If (-not $useDefaultMsi) {
            Show-InstallationPrompt -Message '7-Zip Installation Completed' -ButtonRightText 'OK' -Icon Information -NoWait
        }
```

# 実行画面

管理者権限のコマンドプロンプトから、以下のコマンドで実行してみます。

Deploy-Application.exe -DeploymentType 'Install'

実行前にすべてのウインドウが最小化され、以下の画面が中央に表示されます。
ユーザの注意を引く工夫ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015969/bcd3b1c2-d29b-dcc7-65f1-517fa5e45012.png)

今インストールしたくない場合、[後で]を押すと3回まで延期できます。
ちなみにこのインストール実行前に7Zip File Managerを起動した状態で実行すると、こちらの画面で起動しているアプリをクローズするように促されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015969/06f5a4e0-83fe-064d-184c-539022096031.png)

インストールを続行すると、いかにもインストールをやっている感のある画面が表示され、右下に通知も表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015969/6f2ef756-24d6-7426-0c3a-89eeca585e9b.png)

インストール完了時には右下にこちらの表示がされます。終わったことがはっきりわかりますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015969/9fa14e9d-b4fd-a060-fbef-710e1927e18d.png)

ちなみに、これらのユーザ対話画面を表示したくない場合には、以下のように実行するだけで一切表示されなくなります。強制的に配布する場合にはこちらのほうが便利な場合もありますね。

Deploy-Application.exe -DeploymentType 'install' -DeployMode 'Silent'

今回作成したファイルは[こちら](https://github.com/keitanak/IntuneWin32Sample/blob/main/MSI-Sample/Deploy-Application.ps1)に保管しました。