treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

.NET Framework4.8の有無をバッチファイルで判定する

アプリケーションをインストールする時に、インストール条件としてそのアプリ以外の動作環境が定められている場合があります。.NETアプリの.NET Frameworkがそれです。
.NET Frameworkのバージョンを判定条件にするために調べたこととテストバッチファイルをご報告です。

動機

前回<Paint.netの無人インストールを試してみる - treedown’s Report>をやってみて、.NET Frameworkのバージョン判定をしつつ、(依存する.NET Frameworkのバージョン次第で)インストールの可否を決定するようなバッチファイルを作ってみようと思いました。

Paint.netはインストール時に動作要件となる.NET Frameworkのバージョンチェックが動作するので、Paint.netのバージョンによって必要とされる.NET Frameworkのバージョンを判定しようという試みです。

また、Paint.netのインストーラは優秀なので通常のインストールでは.NET Frameworkがなければ勝手に更新(必要なバージョンをインストール)してくれます。
しかし、WindowsのUsersグループ(ユーザ権限、管理者権限がない)のPCにサイレントインストールで旧バージョンのバージョンアップを実施するとなると、権限不足でUNCが動作してしまうので、PCユーザの手を掛けずにサイレントで既存のインストール済Paint.netのバージョンアップをすることが目的です。

.NETのバージョンを確認するのに役立つ情報

Microsoft Docsに役立つ記事がありました。

■方法: インストールされている .NET Framework バージョンを確認する
https://docs.microsoft.com/ja-jp/dotnet/framework/migration-guide/how-to-determine-which-versions-are-installed

ここを確認すると、
"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full"
にある「Release」キーを確認することでインストール済の.NET Frameworkバージョンを取得できそうです。

ただ、同じWindows10でもいくつか数値に幅があるらしく、本記事現時点での.NET Framework 4.8の最新が「528372」、LTSC(LTSB)では「528049」うーん…、IF文とかで「=>」(leq )とか「=<」(geq)とかで判定することになりそうですが、バッチファイルでこれ全部判定するとなると複雑になりそう。

実際に確認してみる

ひとまず、手持ちのWindows10 Proのレジストリを覗いて確認してみることにします。

対象のWindows10はバージョン21H2(ビルド19044.1889)なので、レジストリに表記された.NET FrameworkのReleaseキーの値は「528372」と表記されていました。(Windows10なら)最新の状況。

LTSBのWindows だとちょっと値は違って、

「528049」となっていました。

しかし、実際に見てみると、Releaseキーに並んで「Version」キーもあるのが気になりました。このキーの値を取ればもうそれでいいんじゃないか?

バージョン情報を示すキー

結局、実際に見てみるとバージョン情報を示すキーは二つありました。それがReleaseキーとVersionキーの二つ。

今回バージョン情報として利用するのは、インストール対象となるバージョンのPaint.netが動作するために必要な(前提条件となる).NET FrameworkがWindows10内にインストールされているかを判定する、という結構狭い判定で事足りるので、.NET Framework 4.8がインストール済かどうかが重要になってきます。

.NET Frameworkのバージョン判定をしたいわけではなかったのを思い出して、素直にこの.NET Frameworkのレジストリキーである「Version」キーで4.8がインストール済かどうかの判定だけやってみることにしました。

.NET Framework 4.8がインストール済かどうか判定

レジストリキーを表示させるのは、reg queryコマンドを使います。
試しに対象となる"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full"をreg queryコマンドで表示してみました。


「Release    REG_DWORD    0x80ff4」とか「Version    REG_SZ    4.8.04084」とか欲しい情報は取れているようです。ただReleaseキー、そういや16進数ですね。てっきり10進数の「528372」が表示されると思っていました。

とはいえ、Versionキーの4.8.04084が情報取得できているので、これを使えば.NET Framework 4.8インストールの有無は判断できそうです。ただ、バージョン情報の後半(例えば4.8.04084の"04084"の部分)は微妙に変わることもありそうなので、判定条件として使うのはメジャーバージョンといえそうな"4.8"の部分だけの方がよさそう。

バッチファイル

さっそく、.NET Framework 4.8がインストールされているかどうかを判定するバッチを用意して実行を確認してみました。

--------------------------------------------------------------
CHK_dot-net.bat
--------------------------------------------------------------
@echo off

rem レジストリ確認
rem 今回は「.NET Framework」のバージョン確認

reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" | find "Version" | find "4.8."
if %ERRORLEVEL% == 0 goto NXdetermination
if %ERRORLEVEL% == 1 goto NoExistDNF48

:NXdetermination
echo dot-NET-Framework4.8がインストールされています。
goto end

:NoExistDNF48
echo dot-NET-Framework4.8はインストールされていません。
goto end

:end
--------------------------------------------------------------

単純にレジストリキーを表示させて、findコマンドで"Version"と"4.8."を絞り込み、両方の表示条件を満たすなら.NET Framework 4.8はインストールされているはずなので


このようにメッセージを表示します。

実行するWindows環境が.NET Framework 4.8以前(4.6や4.7)ならreg queryで表示されないので条件を満たさず、


このようにインストールされていない趣旨のメッセージを画面に表示します。

今後の課題

Paint.netのインストーラを動作させるために.NET Frameworkのバージョン判定をしようという考えから始めたのですが、想定よりも進化は早く、現行バージョン(記事日付現在)となるバージョン4.3.11では.NET6(64ビットベースの.NET 6.0.5)が動作要件となっています。

ひとまず、4.8ベースのPaint.netのバージョンアップを進めて、頃合いをみて.NET6の判定やバージョンアップを進めていく必要がありそう。