Windowsでのマネージド .NET インストール

部分的に削除された.NETインストールは、Microsoft Defender 脆弱性の管理などのソフトウェアをスキャンする脆弱性によってデバイスが報告される一般的な理由です。 .NETインストールのしくみを理解することは、管理者がレポートの調査や修復アクションを実行する場合に役立つ可能性があります。

Windowsでは、ランタイムや SDK などの.NETコンポーネントは複数の MSI で構成されます。 個々の MSI は直接配布されません。 代わりに、バンドルを作成するために連結されます。

Windowsでの.NETの取得

  • スタンドアロン バンドル (EXEs) は、.NET Web サイトからダウンロードできます。
  • WinGet には、.NET バンドルを含むパッケージが用意されています。
  • サービス更新プログラムは、自動更新、WSUS、Windows Update カタログを使用して、Microsoft Update を通じてバンドルを配布します。
  • 独立系ソフトウェア ベンダー (ISV) は、.NETバンドルをソフトウェアの一部として再配布する場合があります。
  • OEM は、新しいデバイスのファクトリ イメージに.NET バンドルのプレインストール されたコピーを含む場合があります。
  • Windowsの一部のAzureマーケットプレース イメージには、バンドルのプレインストールされたコピーが含まれています。
  • Chocolatey などのサード パーティのパッケージ マネージャーも、.NET バンドルを配布します。
  • 企業は、内部配布用の専用パッケージを使用してバンドルを再パッケージ化することがあります。
  • アプリケーション ホスト.NETによっては、不足しているランタイム バンドルをダウンロードしてインストールするようユーザーに指示する場合もあります。

Visual Studioを使用して.NETを取得し、スタンドアロン バンドルと同じ MSI を使用することもできます。

Note

.NET SDK バンドルは、16.2 まで Visual Studio に付属しています。 Visual Studio 16.3 の .NET Core 3.0 以降、SDK バンドルは個々の .NET MSI に置き換えられました。

Upgrades

.NETでは、メジャー/マイナー リリース内のパッチ バージョン間のアップグレードがサポートされます。 .NET 8.0.7 では、プレリリース バージョンを含め、8.0.4 や 8.0.0 などの以前のリリースがアップグレードされますが、.NET 7.0 などの以前のメジャー リリースはアップグレードされません。 .NET SDK では、機能バンド内のパッチ間のアップグレードがサポートされます。 8.0.100 SDK は 8.0.103 にアップグレードできますが、8.0.3xx SDK では 1xx または 2xx 機能バンドはアップグレードされません。

アップグレードの大部分はバンドル レベルで処理されます。 以前のバージョンは、新しいバージョンがインストールされた後にのみ削除されます。 2 つの例外があります。.NET ホストと ASP.NET Core モジュールの MSI が更新されます。

.NET 8 以降では、ユーザーは以前のバージョンのバンドルの削除を延期できます。

バンドル構成と参照カウント

バンドルは複数の MSI から構成され、その一部は複数のバンドル間で共有されます。

.NET インストーラーの構成

  • ランタイム バンドルには、デスクトップ ランタイムと SDK バンドルにも付属する 3 つの MSI が含まれています。
  • デスクトップ バンドルには、SDK バンドルと共有される追加の MSI が含まれています。
  • SDK には、アプリケーションの作成とビルドに使用される CLI、テンプレート、およびターゲット パックを含む追加の MIS .NET含まれています。

共有 MSI は、参照カウントを使用して管理されます。 すべての.NET MSI は、プロバイダー キーと呼ばれるレジストリ キーを作成し、バンドルが自身を依存として登録できるようにします。 MSI が既にインストールされている場合、バンドルは登録情報のみを更新します。 バンドルは、削除されると登録解除されます。 共有 MSI は、登録済みの依存ユーザーが存在しない場合にのみ削除されます。

以下のレジストリ情報は、.NET ホスト MSI プロバイダー キーの例です。 Visual Studioを含む 4 つの登録済み依存者があります。

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\Dependencies\Dotnet_CLI_SharedHost_10.0_x64
    (Default)   REG_SZ    {8A8CC49F-7D1E-45DC-B7B5-35FF61A2C25E}
    Version     REG_SZ    80.40.55332
    DisplayName REG_SZ    Microsoft .NET Host - 10.0.10 (x64)

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\Dependencies\Dotnet_CLI_SharedHost_10.0_x64\Dependents\VS.{AEF703B8-D2CC-4343-915C-F54A30B90937}

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\Dependencies\Dotnet_CLI_SharedHost_10.0_x64\Dependents\{609A456D-467D-4077-9BA2-B6404F1B1163}

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\Dependencies\Dotnet_CLI_SharedHost_10.0_x64\Dependents\{866BECDA-F284-473A-9E84-0CCE816BF06F}

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\Dependencies\Dotnet_CLI_SharedHost_10.0_x64\Dependents\{FD5EA214-C690-466F-B8FB-1741881913F9}

Note

バンドルが削除された後 (アンインストールが中断された場合など) に依存する MSI が登録されたままになると、個々の MSI が孤立します。

Note

Visual Studioは、既知の値 (VS.{AEF703B8-D2CC-4343-915C-F54A30B90937}) を使用して自身を依存として登録します。 実際の参照カウントは、各Visual Studio インスタンスのインストール マニフェストを確認することによって決定されます。

Bin の展開済みインストール

Bin 展開済みインストールは、MSI に関連付けられていない.NETのコピーを指します。 これを実現するには、管理者としてインストール スクリプトを実行し、インストール ディレクトリを "Program Files\dotnet" に設定します。 Bin でデプロイされたインストールは、修復を複雑にする可能性があります。 スキャナーは脆弱性を報告しますが、管理者はアンインストールする MSI を見つけることができません。 DNIM は、bin によってデプロイされたインストールを検出できます。

検出

DNIM は、多数のヒューリスティックに依存して、.NETに関連付けられているバンドルと MSI を識別します。 インストールを正確に検出することは、苦情のないデバイスを正常に修復するために重要です。

バンドル

バンドルは、レジストリに格納されている表示名とファイル情報を使用して識別されます。 実行可能ファイルが有効なインストーラーであることを確認するために、追加のチェックが実行されます。 このインフォーマットは、リリースごとに発行.NET JSON データと比較されます。

MSI 検出

DNIM は、HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Componentsの下のレジスタに格納されているインストーラー コンポーネント データに対して完全な検索を実行して、.NETの MSI を識別します。

各サブキーは、異なるコンポーネント ID を表します。 各キーの下の値は、製品コードを表します。 コンポーネント ID と製品コードの両方がパック GUID として格納されます。 次の例は、 dotnet.exeに関連付けられているコンポーネントです。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\BBB993545ADD68342A9E16F83B5CA481
    40A3E8A8CB38EDC4299598B366C6A11B    REG_SZ    C:\Program Files\dotnet\dotnet.exe
    A75437C333A10ED46B2CF6AB78E7F1FC    REG_SZ    C:\Program Files (x86)\dotnet\dotnet.exe
    79D2396D1F638B04C9CDAC38562B0100    REG_SZ    C:\Program Files\dotnet\dotnet.exe
    EA6D9CBF69367CF4CB81005882631FD6    REG_SZ    C:\Program Files (x86)\dotnet\dotnet.exe
    872D9C61B8AA60F47A4CDF137C8523A3    REG_SZ    C:\Program Files (x86)\dotnet\dotnet.exe
    6235DF10DB18AED4F910D396BBDD7AE5    REG_SZ    C:\Program Files\dotnet\dotnet.exe
    0370151E43A53FE48B564853D1B81FAB    REG_SZ    C:\Program Files\dotnet\dotnet.exe
    F6D22817F79056B46B45655C7495EE9A    REG_SZ    C:\Program Files (x86)\dotnet\dotnet.exe
    D512842CB6C6A404BAE605D564042E50    REG_SZ    C:\Program Files\dotnet\dotnet.exe

Bin の展開済みインストール

DNIM はインストーラー コンポーネントの完全な検索を実行するため、MSI に関連付けられていない Program Files\dotnet ファイルは、bin 展開インストールとして分類されます。

Classification

インストールの分類が正しくないと、間違ったインストールが削除または保持されたり、アプリケーションが破損したり、デバイスが非準拠状態のままになることがあります。

製品 (たとえば、NET 10) が特定されると、リリース (10.0.4 など) やサポート フェーズ (アクティブなど) などの追加情報を特定できます。 これにより、管理者は柔軟なデプロイを作成できます。

インストールは、.NET コンポーネント (ASP.NET Core、SDK など)、アーキテクチャ、インストールの種類 (バンドル、MSI、または展開されたビン) に従ってさらに分類されます。

言及する価値のある特別なケースがいくつかあります。

.NET Standard 2.1

一貫性のある動作を確保するには、インストールで製品、リリース、サポートのフェーズを定義する必要があります。 .NET Standard 2.1 のターゲット 設定パックには、興味深い課題があります。 実行可能コードは含まれません。また、標準で定義されている API の参照アセンブリのみを提供します。 ターゲット パックは、最初に .NET Core 3.0.100 SDK の一部として出荷されましたが、10 .NETまで後続のすべての SDK に含まれていました。 DNIM は .NET Core 3.0 のリリースと製品を分類しますが、アクティブなサポート対象の SDK に含まれる可能性があるため、サポート フェーズは常にアクティブとして報告されます。

Note

.NET Standard 2.1 ターゲット パックは、.NET 10 の SDK インストールから削除されました。 SDK は、アプリケーションのビルド時に NuGet パッケージを使用して、不足しているターゲット パックを自動的にダウンロードします。

.NET SDK 機能バンド

.NET Core 1.0 および 1.1 では、SDK は runime と同様のバージョン管理スキームを使用しました。 .NET Core 1.1 の最後の SDK は 1.1.14 としてバージョン管理され、1.1.13 ランタイムが含まれていました。

SDK 機能バンドは、Visual Studioでサポートされている機能を区別するために 2.1.100 SDK で導入されました。 SDK は、.NET Core 2.0.5 リリースの一部として出荷されました。 最後の 2.0 SDK は 2.1.202 としてバージョン管理され、2.0.9 リリースに含まれています。 .NET Core 2.1 に付属する最初の SDK は、2.1.300 としてバージョン管理されました。 以降のリリースでは、SDK 機能バンドは常に 100 から始まります (例: 2.2.100、3.0.100 など)。