タスクマネージャで見るのが面倒
実行中のプロセスを確認する場合、通常はタスクマネージャを利用します。
タスクマネージャは「Ctrl + Shift + ESC」キーで起動します。
用途として多いのは固まったアプリケーションを強制終了させる場合ですが、実際に稼働中のプロセスを確認したい場合もあります。
ところが、タスクマネージャはプロセス名など検索が出来ないOSがあったり、必要な情報(例えばコマンドラインなど)の確認が初期状態では出来ないなどで使い勝手が悪く、データを探すのに時間が掛かります。
他の方法では、コマンドプロンプトで「tasklist」を実行したり、PowerShellで「Get-Process」を実行する方法もありますが、出力される内容が少ないため用途は限定されます。
そこで、VBAを使ってExcelに実行中のプロセスを一覧でシートに出力してしまう方法を紹介します。Excelに出力してしまえば検索などはラクに出来ます。
プロセス一覧の詳細をシートに出力するコード
以下のコードは、Excelに新規シート(シート名=プロセス詳細yyyymmdd-hhmmss)を作成し、そこにプロセス一覧を出力する関数です。
OutputProcessDetailsToSheet()を実行すると出力されます。
WMI(Windows Management Instrumentation)を使って実現しています。WMIとはWindowsのOSの管理系のデータにアクセスする仕組みです。
Win32APIのCreateToolhelp32Snapshot()を使う方法もありますが、コードが長く面倒なのでWMIを使っています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
Sub OutputProcessDetailsToSheet() Dim objWMI As Object '// WMI Dim colProcs As Object '// プロセス一覧 Dim proc As Object '// プロセス Dim ws As Worksheet '// シート Dim row As Long '// 行位置 '// "プロセス詳細yyyymmdd-hhmmss"シートを新規追加 Set ws = Worksheets.Add ws.Name = "プロセス詳細" & Format(Now, "yyyymmdd-hhmmss") '// 1行目をヘッダ行として固定出力 ws.Cells(1, 1).Value = "プロセス名" ws.Cells(1, 2).Value = "実行パス" ws.Cells(1, 3).Value = "プロセスID" ws.Cells(1, 4).Value = "親プロセスID" ws.Cells(1, 5).Value = "コマンドライン" ws.Cells(1, 6).Value = "起動日時" '// プロセス一覧をWMIを使って取得 Set objWMI = GetObject("winmgmts:\\.\root\cimv2") Set colProcs = objWMI.ExecQuery("SELECT * FROM Win32_Process") '// ヘッダ行が1行目のため2行目以降をデータ行とする row = 2 '// プロセス一覧のプロセスを1つずつ処理 For Each proc In colProcs '// プロセス名 ws.Cells(row, 1).Value = proc.Name '// パスを取得できた場合 If Not IsNull(proc.ExecutablePath) Then '// アプリケーションのパスを出力 ws.Cells(row, 2).Value = proc.ExecutablePath Else ws.Cells(row, 2).Value = "(取得不可)" End If '// プロセスID ws.Cells(row, 3).Value = proc.ProcessId '// 親プロセスID ws.Cells(row, 4).Value = proc.ParentProcessId '// コマンドラインがある場合 If Not IsNull(proc.CommandLine) Then '// コマンドライン ws.Cells(row, 5).Value = proc.CommandLine End If '// 作成日時がセットされている場合 If Not IsNull(proc.CreationDate) Then '// WMIの日時をVBAのDate型に変換 ws.Cells(row, 6).Value = WMIDateStringToDate(proc.CreationDate) End If row = row + 1 Next ws.Columns("A:F").AutoFit MsgBox "プロセス詳細を出力しました。", vbInformation End Sub '// WMI日時をVBAのDateに変換する関数 Function WMIDateStringToDate(dtmWMI As String) As Date WMIDateStringToDate = DateSerial(Left(dtmWMI, 4), Mid(dtmWMI, 5, 2), Mid(dtmWMI, 7, 2)) + _ TimeSerial(Mid(dtmWMI, 9, 2), Mid(dtmWMI, 11, 2), Mid(dtmWMI, 13, 2)) End Function |
実行結果
以下のようにExcelシートに新規シートを追加して出力します。