Intuneでアプリ登録がﾅﾝﾓﾜｶﾗﾝ時に読むもの

最近、Intuneで管理下のWindows PCにいろいろ流し込む設定を、へーしゃ顧客に向けて[PowerShell](https://learn.microsoft.com/ja-jp/powershell/scripting/developer/windows-powershell-reference)でひたすら作っています。例えばこんなもの

- アプリ（MSI, exe, Store）の配布
- ショートカットの配布
- プリンタのインストールと設定　などなど

尚「投下したものは、正常性を検証したいし、削除もしたい」ということで、全部アプリとして作成し、登録しています。
つまり、こんなプロセスが必要になるわけですね。

　

1. [前提](#1-前提)
2. [インストーラーモジュールの仕様を知る](#2-インストーラーモジュールの仕様を知る)
3. [アプリの立ち振る舞いを知る](#3-アプリの立ち振る舞いを知る)
4. [ぬっこ○す](#4-ぬっこ○す)
5. [2～4.をPowerShellスクリプト化する](#5-2～4.をPowerShellスクリプト化する)
6. [ローカルで検証する](#6-ローカルで検証する)
7. [intunewinに固めて、再検証する](#7-intunewinに固めて、再検証する)

　

ﾅﾝﾓﾜｶﾗﾝなりに、この辺りのプロセスのポイントをサクッとまとめました。
尚、クソザコの言うことなので参考になるかはわかりません。

# 1. 前提

汝、「[Win32アプリ `*.intunewin`](https://learn.microsoft.com/ja-jp/mem/intune/apps/apps-win32-prepare)」と「[基幹業務アプリ `*.msi`](https://learn.microsoft.com/ja-jp/mem/intune/apps/lob-apps-windows)」は同時に登録してはならない。
（なんでかわからんけどクライアントで処理がしぬ←）

なので「基幹業務アプリ `*.msi`」は、一つたりとも登録しません。
まずは Store、無ければ intunewin というプロセスで考えます。
msi は問答無用で intunewin にて、[`msiexec`](https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/msiexec) コマンドでぶっ叩きます。

また、[Winget](https://learn.microsoft.com/ja-jp/windows/package-manager/winget/) とか [Chocolatey](https://chocolatey.org/) を使いたい方も居るでしょう。
実はその辺も同時実行不具合を内包してたりするので、過信は禁物です。

# 2. インストーラーモジュールの仕様を知る

大まかに、ポイントは以下です。
…細かいノウハウ？　そんなん追加料金だよ！←

- Webで一般公開されているか、[管理コンソールからダウンロード](https://helpx.adobe.com/jp/download-install/using/download-creative-cloud-apps.html)が要るか
- Web公開の場合、URLはバージョンで変わるか
- exe なら、サイレントインストールができるか
- msi なら、設定引数が公開されているか
- システム権限とユーザー権限で振る舞いが変わるか
- 配布されているモジュールは[アプリ](https://www.microsoft.com/ja-jp/microsoft-teams/download-app)[そのもの](https://slack.com/intl/ja-jp/downloads/windows)か、[デプロイメ](https://learn.microsoft.com/ja-jp/MicrosoftTeams/msi-deployment)[ントツール](https://slack.com/intl/ja-jp/help/articles/212475728)か
- インストール後に再起動が要るか

これだけ押さえたら楽勝ですね！！（簡単に言う←

>「ねぇ、知ってる～？　サイレントインストールコマンドの[まとめサイト](https://silentinstallhq.com/)があるんだよ～」

# 3. アプリの立ち振る舞いを知る

次に、インストールしたアプリや設定がどうなるかを押さえます。

- どこにインストールされるか／できるか（権限で変わる場合も）
- レジストリは書かれるのか
- アップデートはユーザーでもできるか
- ユーザーインストールの場合、複数ユーザーに入れられるか
- インストールした以外のユーザーでも動くか（動かんのがある）

これを元に検知ロジックをスクリプトで書きます。
…MSI の[パッケージコード](https://learn.microsoft.com/ja-jp/windows/win32/msi/package-codes)？　アップデートで変わるとかゴミやん←

# 4. ぬっこ○す

アンインストールの仕方と、後腐れを押さえます。

- アンインストーラーはインストールフォルダにあるか
- インストーラーでアンインストールできるか
- 消した後に何が残るか
- アンインストール後に再起動が要るか
- プリインと見せかけて [Store アプリ扱い (UWP) ](https://learn.microsoft.com/en-us/powershell/module/appx/get-appxpackage)だったりしないか
- システムに入ってると見せかけて、各ユーザーだったりしないか

たまに「アンインストール後に再起動しないと、再インストールできない」とかいう偏屈な子も居ますよね（検証だるいんじゃボケ←）。
割とこの辺でも、検知ロジックに修正が入りがちですね。

# 5. 2～4.をPowerShellスクリプト化する

ノリと気合で書きます。可能であれば汎用化しましょう。
汎用化のポイントとしては、たとえば以下などを[実行引数](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_functions_advanced_parameters)で外出しすると、Intuneのインストールコマンド欄でメンテができるようになります。
（設定ファイルにしてもいいんだけど、その場合はメンテ時にintunewinを再作成して再登録が必要になってしまうので…）

- アプリ名（他のアプリでも使えるように）
- 権限（システム／ユーザーで権限切替えができるように）
- URL等の可変外部参照値（バージョンアップ、URL変更対応）

まぁ、ぼくもプログラムほぼ未経験に近いマンですが、基本は2週間もあればなんとかなりました。
なので（作って動かすだけなら）楽勝です。

>「ねぇ、知ってる～？　msiexec って、ローカルパスだけじゃなくて、実はURLも直接叩けるんだよ～」

# 6. ローカルで検証する

いきなりIntuneに登録しても、十中八九動かないのでやめましょう。
ここで大まかやるべきことを固めます。
ログアウトプットもここで作りこみましょう。

>「ねぇ、知ってる～？　Intuneの[ログフォルダ](https://learn.microsoft.com/ja-jp/mem/intune/remote-actions/collect-diagnostics)って、 `*:\ProgramData\Microsoft\IntuneManagementExtension\Logs` にあるんだよ～」

# 7. intunewinに固めて、再検証する

鬼門です。
ポイントは、「実行権限」と「[環境変数](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_environment_variables)」ですかね。
それさえ注意すれば、大体何とかなります。
（といいつつそこでハマると膨大な時間を喰うハメに←）

>「ねぇ、知ってる～？　アプリの検出ルールって、必ずシステム権限で実行されるんだよ～」

　

**以上です！**
簡単でしたね！！（そうでもない←）

　

えっ、もっと具体的なノウハウが知りたい？
…むしろ作ってほしい？　スクリプト寄越せ？

…流石にそんなとこまではタダとは言わないので、[へーしゃ](https://www.zunda.co.jp/)（または、[ぼく個人](https://www.axw-p.com/)）までご相談ください。

（ぶっちゃけこの大して中身が無さそうに見えるサマリ記事に辿り着くまでに結構苦労したのよ…　ここまでわかるだけでだいぶ解決早いで）

というわけで、よろしくお願いします！
（何とは言わんけどいろいろと）