IntuneとWingetを使ってデバイスにアプリケーションを配布する
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
を使う方法があります。
winget install
を使う方法
方法1. 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
winget import
を使う方法
方法2. winget import <JSONファイルパス>
コマンドでJSONに記述されているアプリをまとめてインストールできます。
JSONの作り方
winget export <JSONファイルパス>
で出力できます。
例えば下記 JSON は Slack, Adobe Acrobat Reader, Chrome をインストールした状態でexportしたJSONです。
配布したいアプリが後から増えても、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ファイルに変換します。
$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つでもインストールされていないものがあれば、アプリが配布されるという条件です。
[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