.NETを利用しているアプリケーションの特定方法
.NETのサポートライフサイクルは長期サポートが提供されるバージョンでも3年と短いため、サポートライフサイクルを終了したバージョンの.NETをアンインストールする必要が生じることがあります。しかし、まだ.NETを利用しているアプリケーションがある場合、アンインストールするとそのアプリケーションが動作しなくなる可能性があります。そのため、.NETを利用しているアプリケーションを事前に特定して新しい.NETのバージョンに移行する等の対応が必要になります。
すべてのアプリケーションの依存関係が管理できていれば問題とならないのですが、そうでない場合、.NETを利用しているアプリケーションを特定することは意外と面倒です。以下に、.NETを利用しているアプリケーションを特定する方法をいくつか紹介します。なお、1, 2は実行中のアプリケーションの有無を確認する方法、3, 4, 5, 6はアプリケーションを監視する方法になります。いずれの方法も静的に解析するものではないため、アプリケーションが実行されることがない場合は特定することができません。とはいえ、特に3, 4, 5, 6の方法でしばらくの期間監視していてもアプリケーションが実行されない場合、もし.NETを利用してるアプリケーションがあったとしても、現在は使用されていない可能性が高いと考えられますので、大きな問題にはならないでしょう。
なお、アプローチとしては、.NETを利用しているアプリケーションがcoreclr.dll
を読み込んでいる点を踏まえて、当該モジュールを読み込んでいるプロセスを調べることによって特定する方法が一般的です。以下に、いくつかの方法を紹介します。
1. tasklistコマンド
Windowsに付属するtasklist
コマンドを使用して、実行中のプロセスの一覧を取得し、.NETを利用しているアプリケーションを特定することができます。tasklist
コマンドは実行中のプロセスの情報を表示するためのコマンドで、/m
オプションを指定することで特定のモジュールを読み込んでいるプロセスに絞り込むことが可能です。.NETを利用しているアプリケーションを特定するには、管理者としてコマンドプロンプトを実行し、以下のコマンドを入力します。
tasklist /m coreclr.dll
このコマンドを実行すると、coreclr.dll
を読み込んでいるプロセスの一覧が表示されます。以下は、コマンドの実行例です。
なお、この方法ではモジュールの完全なパスを確認することができないため、複数のバージョンの.NETがインストールされている場合、どのバージョンの.NETを利用しているかを特定することはできません。また、実行中のプロセスのみを対象とするため、アプリケーションが実行されていない場合は特定できません。
2. Process Explorer
Process Explorerは、Sysinternals Suiteの一部であり、Windowsのプロセスやスレッド、モジュールの詳細な情報を表示するツールです。Process Explorerを使用すると、特定のモジュール(例:coreclr.dll
)を読み込んでいるプロセスを簡単に特定できます。Process Explorerを使用するには、以下の手順を実行します。
-
https://live.sysinternals.com/procexp.exe から
procexp.exe
をダウンロードします。 -
procexp.exe
を管理者権限で実行します。 -
Process Explorerが起動したら、メニューから
Find
>Find Handle or DLL...
を選択します。 -
Handle or DLL substring
の欄にcoreclr.dll
と入力し、[Search]ボタンをクリックします。 -
検索結果が表示され、
coreclr.dll
を読み込んでいるプロセスの一覧が表示されます。以下は、検索結果の例です。
ここで注意が必要な点を挙げておくと、上図のように複数のパスのcoreclr.dll
が表示される場合がありますが、アプリケーションフォルダーに含まれているcoreclr.dll
は、アプリケーションが独自にバンドルしているものであり、通常はコンピューター全体にインストールされている.NETランタイムのバージョンとは関係ありません。したがって、アプリケーションフォルダーに含まれるcoreclr.dll
は無視して問題ありません。
3. 監査ログ
Windowsのファイルシステムの監査を有効にすることで、特定のファイルやフォルダに対するアクセスを記録することができます。これを利用して、.NETのランタイムファイル(例:coreclr.dll
)へのアクセスを監視し、どのアプリケーションがこれらのファイルを使用しているかを特定することが可能です。なお、この方法はVisual C++ランタイムの監査にも利用することができ、ドキュメントでも詳細な手順が公開されています。Visual C++ランタイムの監査手順に倣い、.NETランタイムの監査手順を以下に示します。
1. 監査ポリシーの設定
-
Windows
+R
キーを押してファイル名を指定して実行
ダイアログを開きます。 -
gpedit.msc
と入力してEnter
キーを押します。 -
ローカルグループポリシーエディター
が起動しますので、コンピューターの構成>Windowsの設定>セキュリティの設定>監査ポリシーの詳細な構成>システム監査ポリシー>オブジェクトアクセスに移動します。 -
ファイルシステムの監査
をダブルクリックします。 -
ファイルシステムの監査のプロパティ
ダイアログが表示されますので、次の監査イベントを構成する
と成功
にチェックを入れて[OK]ボタンをクリックします。 -
ローカルグループポリシーエディター
を閉じます。
2. ファイルの監査設定
-
エクスプローラーから監査を行いたいファイルやフォルダを右クリックし、
プロパティ
を選択します。例えば.NET 8のバージョン8.0.16を監査する場合、ランタイムファイルは以下のパスにあります。C:\Program Files\dotnet\shared\Microsoft.NETCore.App\8.0.16\coreclr.dll
C:\Program Files (x86)\dotnet\shared\Microsoft.NETCore.App\8.0.16\coreclr.dll
C:\Program Files (Arm)\dotnet\shared\Microsoft.WindowsDesktop.App\8.0.16\coreclr.dll
-
coreclr.dllのプロパティ
ダイアログが表示されますので、セキュリティ
タブを選択し、詳細設定
ボタンをクリックします。 -
coreclr.dllのセキュリティの詳細設定
ダイアログが表示されますので、監査
タブを選択して続行
ボタンをクリックします。 -
追加
ボタンをクリックします。 -
coreclr.dllの監査エントリ
ダイアログが表示されますので、プリンシパルの選択
のリンクをクリックします。 -
ユーザーまたはグループの選択
ダイアログが表示されますので、選択するオブジェクト名を入力してください
の欄にEveryone
と入力し、名前の確認
ボタンをクリックします。確認ができたらOK
ボタンをクリックします。 -
種類
の欄で成功
を選択し、高度なアクセス許可を表示する
のリンクをクリックします。 -
フォルダーのスキャン/ファイルの実行
のみにチェックが入っている状態にしてOK
ボタンをクリックします。 -
coreclr.dllのセキュリティの詳細設定
ダイアログに戻りますので、OK
ボタンをクリックします。 -
coreclr.dllのプロパティ
ダイアログに戻りますので、OK
ボタンをクリックします。
3. 監査ログの確認
-
Windows
+R
キーを押してファイル名を指定して実行
ダイアログを開きます。 -
eventvwr.msc
と入力してEnter
キーを押します。 -
イベントビューアー
が起動しますので、Windowsログ
>セキュリティ
を選択します。 -
ソース'Microsoft Windows security auditing'のイベントを確認します。イベントID4663が表示されている場合、
coreclr.dll
へのアクセスとその操作を行ったプロセス名が記録されています。以下は、イベントの例です。オブジェクトへのアクセスが試行されました。
サブジェクト:
セキュリティ ID: win24h2\user1
アカウント名: user1
アカウント ドメイン: win24h2
ログオン ID: 0x283EF
オブジェクト:
オブジェクト サーバー: Security
オブジェクトの種類: File
オブジェクト名: C:\Program Files\dotnet\shared\Microsoft.NETCore.App\8.0.16\coreclr.dll
ハンドル ID: 0x174
リソース属性: S:AI
プロセス情報:
プロセス ID: 0x1ac4
プロセス名: C:\source\WinFormsApp1\WinFormsApp1\bin\Debug\net8.0-windows\WinFormsApp1.exe
アクセス要求情報:
アクセス: 実行/スキャン
アクセス マスク: 0x20
Visual C++ランタイムの監査に関する記事ではコマンドで自動化する方法も記載されていますので、そちらも参考にするとよいでしょう。
4. Process Monitor
Process Monitorは、Sysinternals Suiteの一部であり、リアルタイムでファイルシステム、レジストリ、プロセス、スレッドのアクティビティを監視するツールです。Process Monitorを使用すると、特定のモジュール(例:coreclr.dll
)の読み込みを監視し、どのアプリケーションがこれらのファイルを使用しているかを特定することが可能です。以下に手順を示します。
-
https://live.sysinternals.com/procmon.exe から
procmon.exe
をダウンロードします。 -
procmon.exe
を管理者権限で実行します。 -
Process Monitorが起動したら、メニューから
Filter
>Filter...
を選択します。 -
Process Monitorフィルター
ダイアログが表示されますので、Path
とends with
を選択し、coreclr.dll
と入力して[Add]ボタンをクリックします。 -
Operation
を選択し、is
にLoad Image
と入力してAdd
ボタンをクリックします。 -
OK
ボタンをクリックしてフィルターを適用します。 -
Filter
>Drop Filtered Events
メニューを選択してフィルターで除外されたイベントを破棄するようにしておきます。なお、この操作を忘れるとフィルターで除外されたイベントも保持されるため、監視期間によってはシステムリソースを枯渇させる可能性があり危険です。 -
File
>Backing Files...
メニューを選択します。 -
Process Monitor Backing Files
ダイアログが表示されますので、Use file named
にチェックを入れ、記録されたイベントの保存先を指定します。既定では仮想メモリに記録されるため長期間のログ取得でメモリリソースを多く消費する可能性がありますが、これにより監視結果がファイルに保存されるようになります。 -
一旦
Edit
>Clear Display
メニューを選択して、監視結果をクリアします。これにより、監視開始時点からのイベントのみが記録されます。 -
Process Monitorがリアルタイムで
coreclr.dll
の読み込みを監視し始めます。以下は、監視結果の例です。 -
監視を終了するには、
File
>Save...
メニューを選択して、監視結果をファイルに保存します。PML形式で保存しておけば、後に他のコンピューターでProcess Monitorからファイルを読み込むことができるので便利です。
5. Sysmon
SysmonはSysinternals Suiteの一部であり、Windowsのシステムイベントを詳細に監視するツールです。Sysmonを使用すると、特定のモジュールの読み込みを監視し、どのアプリケーションがこれらのファイルを使用しているかを特定することが可能です。Sysmonを使用してcoreclr.dll
の読み込みを監視するには、以下の手順を実行します。なお、ドキュメントに詳細な手順は公開されていないため、sysmon.exe -? config
コマンドでヘルプを確認するか、開発者による解説書かその日本語版を参考にするとよいと思います。
-
Sysmonを公式ページからダウンロードして任意のフォルダーに展開します。
-
後述の
sysmonconfig.xml
をSysmonのフォルダーに配置します。Sysmonの設定ファイルは、Sysmonが監視するイベントの種類や詳細を定義するためのXMLファイルです。 -
管理者権限でコマンドプロンプトを起動し、Sysmonのフォルダーに移動します。例えば、Sysmonを
C:\Sysmon
に展開した場合、cd C:\Sysmon
コマンドを実行します。 -
sysmon.exe -i sysmonconfig.xml
コマンドを実行し、構成ファイルを使用してSysmonをインストールします。
-
Sysmonがインストールされると、
sysmonconfig.xml
で指定されたイベントの監視が開始されます。Sysmonは、WindowsイベントログのMicrosoft-Windows-Sysmon/Operational
でログを記録します。イベントビューアーから確認する場合は、Windowsログ
>アプリケーションとサービスログ
>Microsoft
>Windows
>Sysmon
>Operational
を表示します。イベントID:7がDLL読み込みのイベントになります。 -
不要になったら
sysmon.exe -u
コマンドを実行してSysmonをアンインストールします。
sysmonconfig.xmlの例
以下は、Sysmonの設定ファイルの例です。onmatch="include"を指定して何も指定しない場合、そのイベントの種類のログ記録は無効化されます。つまり、以下ではcoreclr.dll
で終わるイメージの読み込み以外のみを有効化し、他はすべて無効化しています。
<Sysmon schemaversion="4.90">
<EventFiltering>
<ProcessCreate onmatch="include" />
<ProcessTerminate onmatch="include" />
<DriverLoad onmatch="include" />
<ImageLoad onmatch="include">
<ImageLoaded name=".NET Runtime" condition="end with">coreclr.dll</ImageLoaded>
</ImageLoad>
<FileCreateTime onmatch="include" />
<NetworkConnect onmatch="include" />
<CreateRemoteThread onmatch="include" />
<RawAccessRead onmatch="include" />
</EventFiltering>
</Sysmon>
記録されるイベントログの例
Image loaded:
RuleName: .NET Runtime
UtcTime: 2025-07-06 15:22:41.224
ProcessGuid: {669b6810-94c1-686a-da02-000000001600}
ProcessId: 1624
Image: C:\source\WinFormsApp1\WinFormsApp1\bin\Debug\net8.0-windows\WinFormsApp1.exe
ImageLoaded: C:\Program Files\dotnet\shared\Microsoft.NETCore.App\8.0.16\coreclr.dll
FileVersion: 8,0,1625,21506 @Commit: efd5742bb5dd1677fbbbeb277bcfb5c9025548e5
Description: .NET Runtime
Product: Microsoft® .NET
Company: Microsoft Corporation
OriginalFileName: CoreCLR.dll
Hashes: SHA256=C95B64848C998000F1C5CF01E2E6154222930AC90190679A47AC49C6EF0AFD3C
Signed: true
Signature: .NET
SignatureStatus: Valid
User: win24h2\user1
6. .NETホストログ
.NETアプリケーションは環境変数の設定によってホストログを生成することができます。これにより、アプリケーションの起動時に使用されている.NETランタイムのバージョンやその他の詳細情報を確認することができます。大量のログが出力されるため、他の.NETバージョンがインストールされアプリが稼働している状態で古いバージョンを利用しているアプリを特定するようなケースでは不向きですが、.NETを使用しているアプリが存在している可能性は低いが念のため確認するようなケースでは利用できるかもしれません。参考情報として載せておきます。
ホストログの有効化は.NETのドキュメントに記載されています。
なお、ログのサイズはかなり大きくなりますので、必要な場合のみ有効化することをお勧めします。また、多数アプリケーションが同時に実行されている環境では、ログの出力が競合する可能性があるため注意が必要です。
記録されるログの例を以下に記載します。
Tracing enabled @ Sun Jul 6 14:42:59 2025 GMT
--- Invoked apphost [version: 8.0.16 @Commit: efd5742bb5dd1677fbbbeb277bcfb5c9025548e5] main = {
C:\source\WinFormsApp1\WinFormsApp1\bin\Debug\net8.0-windows\WinFormsApp1.exe
}
Redirecting errors to custom writer.
The managed DLL bound to this executable is: 'WinFormsApp1.dll'
Looking for architecture-specific registry value in 'HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\x64\InstallLocation'.
Found registered install location 'C:\Program Files\dotnet\'.
Using global installation location [C:\Program Files\dotnet\] as runtime location.
Reading fx resolver directory=[C:\Program Files\dotnet\host\fxr]
Considering fxr version=[9.0.5]...
Detected latest fxr version=[C:\Program Files\dotnet\host\fxr\9.0.5]...
Resolved fxr [C:\Program Files\dotnet\host\fxr\9.0.5\hostfxr.dll]...
Loaded library from C:\Program Files\dotnet\host\fxr\9.0.5\hostfxr.dll
Invoking fx resolver [C:\Program Files\dotnet\host\fxr\9.0.5\hostfxr.dll] hostfxr_main_startupinfo
Host path: [C:\source\WinFormsApp1\WinFormsApp1\bin\Debug\net8.0-windows\WinFormsApp1.exe]
Dotnet path: [C:\Program Files\dotnet\]
App path: [C:\source\WinFormsApp1\WinFormsApp1\bin\Debug\net8.0-windows\WinFormsApp1.dll]