Red Hat のソリューションアーキテクトの瀬戸です。
概要
以前jpackageを使ったクライアントアプリケーションのパッケージングの方法についてまとめました。
その時にmsi形式でパッケージングをしましたが、このmsiという拡張子のついたファイルは何なのでしょうか? msiはWindows上で実行できるファイルの中で、ソフトウェアのインストールに使えるファイルにつけられる拡張子です。Microsoft Windows Installerの略となっています。 特別な拡張子が割り当てられているだけではなく、中に含まれるファイルの実行時のオプションや内容が仕様で決められており、Windows ServerのActive Directoryを使用することでクライアントサイドのWindowsに自動的にソフトウェアをインストールすることに使う事ができます。
なぜmsi形式のファイルが作れると嬉しいかというと、この形式であればWindowsのアプリケーション管理機能に乗せて一元管理ができるからですね。 クライアントPCが数千台あったとしても1台ずつインストールをしていく必要はなくなります。
普段から企業内でIT管理者をやっておりActive Directoryを触っている人からは常識なのですが、一般的な開発者はなかなかActive Directoryに触れる機会がないので、機能の紹介を兼ねて設定方法を説明していきます。
環境の説明
今回はWindows Server 2022を使って試していきます。
サーバー、クライアントの準備
AWS上のWindows Server 2022 Data Center Editionと、オンプレのWindows 11 Professional Editionを利用しました。*1Home EditionではActive Directory(ドメイン)に参加できないのでご注意ください。 また、Active Directoryについては設定済みとし、クライアントPCはすでにActive Directory(ドメイン)に参加しているものとしています。*2
使用するアプリケーション(msiファイル)の準備
jpackageを使用して準備しました。オプションは次の通りです。
> jpackage --type msi --icon shadowman.ico --vendor "red hat" --app-version 1.0 --win-menu --win-shortcut --input .\target --win-upgrade-uuid 2bc2b28e-5b34-45e3-9e4f-11e87d88f7cb --name clientexample --main-class com.redhat.clientexample.App --main-jar clientexample.jar
自動インストール用を想定しているため、デフォルトでサイレントインストールになるように指定をしています。どういう意味を持つのかの詳細は前回までの記事を参照してください。
rheb.hatenablog.com rheb.hatenablog.com
実際に設定をする
次のような手順で行っていきます。
- 共有フォルダにmsiファイルを設置する
- GPO(グループポリシーオブジェクト)でソフトウェアのインストールの設定を行う
- GPO(グループポリシーオブジェクト)をドメインに割り当てる
共有フォルダにmsiファイルを設置する
サーバーのフォルダを共有します。このフォルダはクライアント側からアクセスできるように設定されている必要があります。クライアント側からアクセスできれば良いので、NAS等を使って別途構築してある場所でも大丈夫です。
今回はEveryone向けに読み取り権限を付けて共有します。
ネットワーク越しに参照できることを確認します。
これでインストールするmsiファイルの設置は終わりました。
GPO(グループポリシーオブジェクト)でソフトウェアのインストールの設定を行う
ファイル名を指定して実行から mmcを実行することでMMC(Microsoft Management Console)が起動します。
MMCのファイルメニューからスナップインの追加と削除を選択することでGPOの管理画面を開くことができます。
初期画面には何もないので、ファイルのスナップインの追加と削除を選択します。
引き続きグループポリシーの管理を選択して追加します。次のように選択すればOKです。
ソフトウェアを配布したいドメインの中のグループポリシーオブジェクトのフォルダを選択します。
右クリックから新規を選択します。
新しいGPOの名前を指定します。今回はソフトウェア配布と付けています。
作成されました。
作成したGPOを右クリックメニューから編集します。
グループポリシー管理エディタが開くので、コンピューターの構成→ポリシー→ソフトウェアの設定→ソフトウェアインストールを選択します。
右クリックからNew->Packageを指定してください。
ファイルのダイアログが開くのでそのまま指定したいところですが、ローカルディスクのファイルを指定するとエラーメッセージが表示されます。クライアントから表示できるネットワークドライブ上のファイルのUNC*3を指定する必要があります。ファイルダイアログからネットワークファイルを探して指定することでもUNCと解釈されます。
引き続き、デプロイ方法を指定します。
デプロイ方法は詳細設定を指定します。ここで割り当てを選んでしまった場合はクライアントの状況によってインストールできないことがあります。
詳細設定を選択してOKを押すと追加の設定画面が表示されます。割り当てを指定したあとにプロパティを開いても同じ画面を表示することができます。 こちらから、展開の詳細設定⇒詳細設定オプションのこのパッケージを展開するときは言語を無視するをチェックします。jpackageでは現時点では言語の指定が出来ないため、日本語Windowsにインストールしたい場合はこちらを有効にする必要があります。
これでインストールするパッケージの指定が完了です。
今回は追加で、セキュリティーフィルターの処理で、インストールしたいPCを直接選択しています。実運用環境では対象となるPCのグループを指定することになるのではないかと思います。
GPO(グループポリシーオブジェクト)をドメインに割り当てる
ここまで出来たら、最後にインストール処理を行いたいドメインに対してGPOのリンクを行います。 ドメインを選択して、既存のGPOのリンクから作成したGPOを選択します。
これでクライアントへの配布が行われるようになります。 ただし、GPOはクライアントに即座に反映されるわけではなく、組織の設定により遅延して反映されます。十分な時間を置いた後にクライアントPCを再起動するとソフトウェアが配布されているはずです。*4
まとめ
Active Directoryを使用したWindowsクライアントへのアプリケーションの配布方法の手順を説明してきました。
JavaはWindows/Linux/Macのどこでも動くということもあり、Windows固有の情報についてJava開発者は疎くなりがちです。そのため、Windows上でのクライアント開発を行っても配布方法がわからないなどで.net等に後れを取っているのではないかと感じます。
実際にはWindows Serverが標準的な配布の仕組みを持っており、msi形式のアプリケーションを配布できるので、特に問題は発生しないです。
Windows/Unix/Macで動作するアプリケーションが作れますので、ぜひ使用をご検討ください。