このページの本文へ

前へ 1 2 次へ

Windows Info 第399回

Windowsではプロセスからプログラムに関するさまざまな情報が得られる

2023年10月01日 10時00分更新

文● 塩田紳二 編集● ASCII

  • この記事をはてなブックマークに追加
  • 本文印刷

プロセスが持つ情報は何?

 タスクマネージャーもプロセスから情報を得て動作しているが、プロセスが持つ情報は多く、またGUIプログラムであるため、表示できる情報が限定されている。

 これに対してWindows PowerShell(およびPowerShell 7.x)のGet-Processコマンドは、実行中のプロセスから多くの情報を得ることができる。

 その情報は、.NET Framework/.NETのProcessクラス(System.Diagnostics.Process)に準じているが、Get-Processコマンドは、さらに「便利」なプロパティが追加されている。以下の表に追加されている主なプロパティを示す。これらは、プロセス情報をProcessクラスから得たあと、そのプロパティを使って、さらにAPIで得られる情報のうち、比較的利用頻度が高そうなものだ。

プロセス

 たとえば、プロセスの親プロセスは、PowerShell 7ではParentプロパティに入る。この中身もプロセス情報なので、同じように親をたどっていくことができる。CommandLineプロパティは、プロセスを起動したときのコマンドラインが記録されている。これを見ることでプロセスがどのように起動されたのかを知ることが可能だ(ただし、CommandLineプロパティを持たないプロセスも存在する)。そのほかには、プログラムのバージョンを表すProductVersionなどがある。

 なお、ParentとCommandLineは、PowerShell 7では利用できるが、Windows PowerShellでは利用できない。ただし、Get-CIMInstanceコマンド経由でWMI/CIMから同等の情報を得ることは可能だ。

Get-CimInstance Win32_Process | select ProcessName,ParentProcessId, CommandLine

 基本となるProcessクラスで得られる情報に関しては、マイクロソフトのLearnページに記載がある。

●Process クラス
 https://learn.microsoft.com/ja-jp/dotnet/api/system.diagnostics.process?view=netframework-4.8.1

 このクラスには、たとえば、ウィンドウのタイトル文字列を示すMainWindowTitleや、関連付けられているDLLなどのプログラムを列挙できるModules、各種メモリ指標(ページメモリサイズやワーキングセットなど)、プロセスから起動されたスレッド(Threads)などがある。

 どんな情報があるのかを概観したければ、Get-Processの出力をOut-GridViewですべて表示可能。全体を眺めて見ることでどのような情報が出力されているのかを把握できる。

Get-Process | select * | Out-GridView

 Microsoftストアからインストールしたアプリの場合、プロセスのPathプロパティ(実行ファイルのパス)を使って、パッケージ情報を得ることも可能だ。Microsoftストアからインストールしたアプリは、「C:\Program Files\WindowsApps」のサブフォルダにインストールされ、このときのサブフォルダ名がパッケージのPackageFullNameに相当する。このことを使うと、Get-AppxPackageコマンドからパッケージ情報を得ることができる。

 たとえば、PowerShellの親プロセスのPathプロパティを見ることで、標準コンソール(conhost.exe)かWindowsターミナルなのか、ターミナルなら通常版かプレビュー版かを判断できる。

 インストール先サブフォルダは「Microsoft.WindowsTerminalPreview_1.18.1462.0_x64__8wekyb3d8bbwe」のようになり、Windowsターミナルなら"WindowsTerminal"の文字があり、さらにプレビュー版なら、は、“Preview”の文字が入る。情報を取り出すには、

(Get-Process -id $pid).Parent.Path

とする。“$pid”は、PowerShellのプロセスIDが自動的に入る変数である。

 PathプロパティからSplit-Pathコマンドで末尾の実行ファイル名を抜いたものと、Get-AppxPackageコマンドのInstallLocationプロパティが一致するものを探すことで、Get-AppxPackageコマンドで得られるパッケージ情報を見つけることができる。

Get-AppxPackage | ? InstallLocation -eq ((Get-Process -id $pid).Parent.path|Split-Path)

 このようにして、プロセスから得られる情報を起点に、プログラムに関するさまざまな情報にアクセスできる。プログラムの情報は、プログラムの実行ファイルや関連ファイルにあると考えがちだが、実際には、プログラムを起動させてプロセスから取得するほうが簡単である。

前へ 1 2 次へ

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン