Engineering

Intuneでカスタム検出スクリプトを使ってアプリのインストールを確認する方法

カスタム検出スクリプトとは?

Intuneでは、アプリ配信後にインストール状況を確認するために「検出ルール」を設定します。検出ルールには以下の種類があります:

  • MSI/EXE の製品コード検出:MSI アプリであれば自動的にインストール状態を確認可能。
  • ファイルまたはフォルダの存在チェック:特定のパスにファイルやフォルダがあるかを確認。
  • レジストリ値の確認:特定のキーや値が存在するかを基準に検出。

これらの方法では対応できない場合や、複数の条件を組み合わせて柔軟に検出したい場合に使用するのが「カスタム検出スクリプト」です。検出規則の中でもここが一番の難関です。カスタム検出スクリプトによって返されたコードによってインストール済みか否か判断されます。下記がスクリプトに含める判断条件になります。

  • 終了コード 0 かつ STDOUT に文字列 → インストール済みと判断される
  • 終了コード 1 以上 → アプリ検出失敗
  • スクリプトは SYSTEM アカウントで実行される
  • ファイルは UTF-8 BOM で保存することを推奨

スクリプトを作成してみる

アプリケーションがインストールされているかをコンピューターから取得する場合、主に「レジストリ」またはストアアプリの一覧を取得する必要があります。

$regApps = Get-ItemProperty @(
    'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*',
    'HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
) -ErrorAction SilentlyContinue | Where-Object { $_.DisplayName -like "*C++ 2015-2022*" }

$storeApps = Get-AppxPackage -ErrorAction SilentlyContinue | Where-Object { $_.Name -like "*C++ 2015-2022*" }

if ($regApps -or $storeApps) {
    Write-Output "Detected"
    exit 0
} else {
    Write-Output "Not Detected"
    exit 1
}

まずレジストリを確認しインストールされたアプリケーションの一覧に対象のアプリケーションが存在するかを確認します。この例の場合「DisplayName -like “*C++ 2015-2022*”」の部分でアプリ一覧に「C++ 2015-2022」を含む名前のアプリが存在するかを確認し、存在すればレジストリの値を取得しますています。

$regApps = Get-ItemProperty @(
    'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*',
    'HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
) -ErrorAction SilentlyContinue | Where-Object { $_.DisplayName -like "*C++ 2015-2022*" }

念のためストアアプリの一覧からも同様に確認します。

$storeApps = Get-AppxPackage -ErrorAction SilentlyContinue | Where-Object { $_.Name -like "*C++ 2015-2022*" }

最後に、レジストリおよびストアアプリ一覧で確認した結果に値が含まれているか否かを確認し、値があればインストール済み、なければインストール失敗、未インストールという結果を返します。前者であれば0を、後者は1を返します。

if ($regApps -or $storeApps) {
    Write-Output "Detected"
    exit 0
} else {
    Write-Output "Not Detected"
    exit 1
}

ポイント

  • ErrorAction SilentlyContinue でエラーを抑制しスクリプトが意図せず停止しないように
  • 検出スクリプトはSYSTEM コンテキストで実行されるため HKCU: は参照できないため除外
  • Write-Output で文字列を出力し、STDOUT にデータを必ず残す

Intuneに設定してみる

  1. [アプリ] → [検出規則] → [カスタム検出スクリプトを使用する]
  2. スクリプトファイルで作成したps1ファイルをアップロードする
  3. 必要に応じて「64ビットクライアントで32ビットプロセスとして実行」を選択
  4. スクリプト署名チェックの設定を確認(はいにするとスクリプトに署名が必要になります)

最後にお知らせ

弊社ではAzure / Microsoft 365 関連の最新情報を日本語で分かりやすく、月1回(緊急時は都度)ご案内するメールマガジンを配信しています。
Azure管理者様必見です!ご興味お持ちいただけましたらぜひ下記よりご登録ください。

関連記事

コメント

この記事へのコメントはありません。

TOP