💻

IntuneとWingetを使ってデバイスにアプリケーションを配布する

2022/04/25に公開

Wingetとは

WingetはWindows標準のパッケージマネージャーです。
PowerShell上でWingetコマンドを実行することでアプリのインストール、アンインストール、アップグレードができます。
詳しくは公式ドキュメントを確認してみてください。

注意事項

Wingetを使用する際はアプリの提供元の規約に則って使用してください。
会社として使用する場合は、法務チェックなどを行ってから使用することが必要になるかと思います。何かしらに違反した場合、私はもちろんのこと、マイクロソフト社も責任をとってはくれないはずです。あくまでも自己責任でお願いします。

事前準備

Windows 11では、Wingetが既定でバンドルされています。Windows 10ではバンドルされていませんが、Microsoft Storeの更新とダウンロードを実施していれば勝手にインストールされています。

インストールされていない場合はMicrosoft Storeの「アプリ インストーラー」をリンク先からインストールすると使用可能になります。

使い方

PowerShellを立ち上げてWingetを実行してみると使用方法が出力されます

初回実行時

winget listコマンドを実行してみてください。
初めてWingetを使用する場合すべてのソース契約条件に同意しますか?と聞かれます。
Yを入力してEnterを押すとWingetが使用可能になります。次回以降は聞かれません。

wingetでアプリをインストールする際の動作について

下記のような動作をします。

  • すでにインストールされているアプリにinstallまたはimportコマンドを実行すると最新版のインストールが実行される(アプリが実行中の場合エラーとなる場合がある。)
  • 最新版のアプリがインストールされている状態でimportコマンドを実行すると、インストールが実行されずに次のアプリに移る。エラーにはならずに正常終了する。
  • 最新版のアプリがインストールされている状態でinstallコマンドを実行すると、再度インストールが実行される。アプリの仕様によってエラーとなる場合がある。
  • winget importでインストールするとJSONに記述されている順番に上からインストールされる

上記の通り、すでにアプリがインストールされてユーザーが使用している端末にinstallまたはimportコマンドを実行するとエラーが発生しIntuneからの配布も失敗する可能性があります。
アプリがインストールされていないことを確認してコマンドを実行するか、キッティング直後のクリーンな状態でinstallまたはimportコマンドを実行することを推奨します。
アプリバージョンのアップデートが目的であればupgradeコマンドを使用してください。こちらの場合はすでにアプリのバージョンが最新でもエラーにはなりません。


アプリをコマンドでインストールさせる

インストールにはwinget installコマンドを使います。
アプリのIDが必要になるのでwinget listコマンドでインストール済みアプリ一覧からID
を確認して使用するとよいです。

たとえばGoogle ChromeのIDはGoogle.Chromeだとわかります。

Chromeをインストールする際に実行するコマンドは下記です。ソース契約条件に同意していない場合は同意を求められます。なのでIntuneから下記コマンドを配布しても失敗してしまいます。

winget install Google.Chrome

<ソース契約条件に同意している状態>

<ソース契約条件に同意していない状態、Intuneで配布すると失敗する>

ソース契約条件を回避してインストールさせる

ソース契約条件を回避するためのオプションとして--accept-package-agreements, --accept-source-agreementsがあります。
このオプションを指定すると、Wingetさえインストールされていれば初めて実行するユーザーでもインストールさせることができます。

winget install Google.Chrome --accept-package-agreements --accept-source-agreements

IntuneからWingetを使用してアプリを配布する

これまではWingetコマンド単体での使用方法を紹介してきました。
それらをIntuneからデバイスに配布するための方法を下記で紹介していきます。

PowerShellスクリプトとして配布する

「このスクリプトをログオンしたユーザーの資格情報を使用して実行する」で「はい」を選択してください。(「いいえ」にすると失敗します)

成功すると「デバイスの状態」が「成功」になります。

まとめて複数のアプリをインストールさせる

複数のアプリをインストールさせるにはwinget installを使う方法とwinget importを使う方法があります。

方法1. winget installを使う方法

winget installコマンドを必要なアプリの数だけ列挙することで複数アプリをまとめてインストールさせることができます。
例えばChrome, Acrobat Reader, Slackをインストールさせる場合は下記のようになります。

winget install Google.Chrome --accept-package-agreements --accept-source-agreements
winget install Adobe.Acrobat.Reader.64-bit --accept-package-agreements --accept-source-agreements
winget install SlackTechnologies.Slack --accept-package-agreements --accept-source-agreements

方法2. winget importを使う方法

winget import <JSONファイルパス>コマンドでJSONに記述されているアプリをまとめてインストールできます。

JSONの作り方

winget export <JSONファイルパス>で出力できます。
例えば下記 JSON は Slack, Adobe Acrobat Reader, Chrome をインストールした状態でexportしたJSONです。
配布したいアプリが後から増えても、JSONに追記することですぐに対応が可能です。テキストなのでバージョン管理もしやすいです。

winget_export.json
{
	"$schema" : "https://aka.ms/winget-packages.schema.2.0.json",
	"CreationDate" : "2022-04-20T00:51:28.181-00:00",
	"Sources" : 
	[
		{
			"Packages" : 
			[
				{
					"PackageIdentifier" : "Microsoft.Edge"
				},
				{
					"PackageIdentifier" : "Microsoft.OneDrive"
				},
				{
					"PackageIdentifier" : "SlackTechnologies.Slack"
				},
				{
					"PackageIdentifier" : "Adobe.Acrobat.Reader.64-bit"
				},
				{
					"PackageIdentifier" : "Google.Chrome"
				}
			],
			"SourceDetails" : 
			{
				"Argument" : "https://winget.azureedge.net/cache",
				"Identifier" : "Microsoft.Winget.Source_8wekyb3d8bbwe",
				"Name" : "winget",
				"Type" : "Microsoft.PreIndexed.Package"
			}
		}
	],
	"WinGetVersion" : "1.2.10271"
}

WingetコマンドをWin32アプリとして配布する

Intuneでは様々なデータをintunewinファイルに変換して、Win32アプリとして配布することができます。intunewinファイルの作成方法や配布方法はわかりやすい記事がありますので、参考にしてください。

  • PowerShellスクリプトと上の手順で作成したJSON(winget_export.json)をフォルダに格納してintunewinファイルに変換します。
winget-import.ps1
$json = Join-Path $PSScriptRoot "winget_export.json"
winget import $json --accept-package-agreements --accept-source-agreements
  • ツールを利用してフォルダをIntunewinファイルに変換
  • IntuneでWin32アプリを新規作成し、Intunewinファイルをアップロード
  • 「インストールコマンド」に下記を指定(アンインストールコマンドも同様で構いません)
    powershell.exe -executionpolicy remotesigned -file "winget-import.ps1"
  • 「インストールの処理」は必ず「ユーザー」を選択
  • 「デバイスの再起動」は任意の値を選択。今回は「何もしない」を選択
  • 「必要条件」任意の値を選択。今回は「windows 10 21H1」を選択
  • 「規則の形式」で「カスタム検出スクリプトを使用する」を選択

    例として、下記スクリプト「wiget_list.ps1」を使用しています。
    リストのアプリに1つでもインストールされていないものがあれば、アプリが配布されるという条件です。
wiget_list.ps1
[String[]]$id_list = @(
    "Microsoft.Edge",
    "Microsoft.OneDrive",
    "SlackTechnologies.Slack",
    "Adobe.Acrobat.Reader.64-bit",
    "Google.Chrome"
)
foreach ($id in $id_list) {
    winget list --exact $id --accept-source-agreements
    if ($LASTEXITCODE -ne 0) {
        exit $LASTEXITCODE
    }
}
  • 他の値は任意で選択し、対象のデバイスが含まれるグループを割り当てて「作成」します
  • デバイスとIntune間で同期が成功すれば、JSONに記載してあるすべてのアプリが配布されます。

終わりに

wingetは非常に便利なツールですが、Intuneでの使用がまだ広がっていない感じがするので記事を書きました。
Windows 11では標準でバンドルされており、将来的にはWindowsにおけるパッケージ管理のデファクトスタンダードになると思います。Windowsでもコマンド一発でアプリをインストールしたりアンインストールできるのは気持ちが良いですし、今後Intuneと統合していくことも考えられるのでより重要な技術になっていくのではないでしょうか。

以上です、本記事が何かのお役に立てれば幸いです。

Discussion