Windowsクライアント向けJavaアプリケーションをActive Directoryで配布する

Red Hat のソリューションアーキテクトの瀬戸です。

概要

以前jpackageを使ったクライアントアプリケーションのパッケージングの方法についてまとめました。

rheb.hatenablog.com

その時に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の管理画面を開くことができます。

ファイル名を指定して実行

MMCの初期画面

初期画面には何もないので、ファイルのスナップインの追加と削除を選択します。

GPOのファイルメニュー

引き続きグループポリシーの管理を選択して追加します。次のように選択すればOKです。

スナップインの追加と削除

ソフトウェアを配布したいドメインの中のグループポリシーオブジェクトのフォルダを選択します。

GPOの管理画面

右クリックから新規を選択します。

GPOの新規作成

新しいGPOの名前を指定します。今回はソフトウェア配布と付けています。

新しいGPOに名前を付ける

作成されました。

GPOの作成

作成したGPOを右クリックメニューから編集します。

ソフトウェア配布の編集

グループポリシー管理エディタが開くので、コンピューターの構成→ポリシー→ソフトウェアの設定→ソフトウェアインストールを選択します。

グループポリシー管理エディタ

右クリックからNew->Packageを指定してください。

ソフトウェアインストールの選択

ファイルのダイアログが開くのでそのまま指定したいところですが、ローカルディスクのファイルを指定するとエラーメッセージが表示されます。クライアントから表示できるネットワークドライブ上のファイルのUNC*3を指定する必要があります。ファイルダイアログからネットワークファイルを探して指定することでもUNCと解釈されます。

ローカルファイルの指定

ローカルファイルを指定したときのエラー

ネットワークフォルダの指定時のパス

引き続き、デプロイ方法を指定します。

デプロイ方法は詳細設定を指定します。ここで割り当てを選んでしまった場合はクライアントの状況によってインストールできないことがあります。

デプロイ方法の指定

詳細設定を選択してOKを押すと追加の設定画面が表示されます。割り当てを指定したあとにプロパティを開いても同じ画面を表示することができます。 こちらから、展開の詳細設定⇒詳細設定オプションのこのパッケージを展開するときは言語を無視するをチェックします。jpackageでは現時点では言語の指定が出来ないため、日本語Windowsにインストールしたい場合はこちらを有効にする必要があります。

詳細設定画面
詳細設定オプション

これでインストールするパッケージの指定が完了です。

完了後画面

今回は追加で、セキュリティーフィルターの処理で、インストールしたいPCを直接選択しています。実運用環境では対象となるPCのグループを指定することになるのではないかと思います。

インストールしたいPCの指定

GPO(グループポリシーオブジェクト)をドメインに割り当てる

ここまで出来たら、最後にインストール処理を行いたいドメインに対してGPOのリンクを行います。 ドメインを選択して、既存のGPOのリンクから作成したGPOを選択します。

GPOのリンク

これでクライアントへの配布が行われるようになります。 ただし、GPOはクライアントに即座に反映されるわけではなく、組織の設定により遅延して反映されます。十分な時間を置いた後にクライアントPCを再起動するとソフトウェアが配布されているはずです。*4

デスクトップ上にアイコンがでてくる

当然プログラムの追加と削除にもでてくる

まとめ

Active Directoryを使用したWindowsクライアントへのアプリケーションの配布方法の手順を説明してきました。

JavaはWindows/Linux/Macのどこでも動くということもあり、Windows固有の情報についてJava開発者は疎くなりがちです。そのため、Windows上でのクライアント開発を行っても配布方法がわからないなどで.net等に後れを取っているのではないかと感じます。

実際にはWindows Serverが標準的な配布の仕組みを持っており、msi形式のアプリケーションを配布できるので、特に問題は発生しないです。

Windows/Unix/Macで動作するアプリケーションが作れますので、ぜひ使用をご検討ください。

Windows インストーラー - Win32 apps | Microsoft Learn

Active Directory Domain Services の概要 | Microsoft Learn

*1:つまり、そこらへんに転がってた自宅のPC

*2:つまり、一般的な企業でPCが管理されている状態

*3:\\からはじまるやつ

*4:テスト目的などで強制的にGPOを適用したい場合はgpupdateというコマンドがあります。

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。