こんにちは。チェシャ男です。(-皿-)
今回は、
【PowerShell でプロセスの実行ユーザとファイルバージョンを確認する方法】
についてご紹介します。
Get-Process ではプロセスのリソース情報以外に「実行ユーザ」や実行ファイルの「バージョン」について確認することができます。
実行ユーザを確認する ”-IncludeUserName” オプションを使用するためには PowerShell v4.0 以降を使用している必要があります。
実行中プロセスの基本的な確認方法についてはこちら↓の記事をご参考ください。
[blogcard url=”https://cheshire-wara.com/powershell/ps-cmdlets/system-service/get-process/”]
もくじ
オプションを使ってプロセスの情報を確認する
実行中のプロセスを取得するコマンドレット
Get-Process
の使い方は以下をご覧ください。
【コマンドレット】
Get-Process
【オプション】
パターン1(プロセス名から取得)
-Name <プロセス名(複数可)>
-ComputerName <マシン名やIPアドレス>
-Module
-FileVersionInfoパターン2(プロセスIDから取得)
-Id <プロセスのID(複数可)>
-ComputerName <マシン名やIPアドレス>
-Module
-FileVersionInfoパターン3(プロセスオブジェクトから取得)
-InputObject <プロセスのオブジェクト>
-ComputerName <マシン名やIPアドレス>
-Module
-FileVersionInfo[v4,v5以降]
-IncludeUserName【入力】
System.String[] System.Int32[] System.Diagnostics.Process[]
【出力】
System.Diagnostics.ProcessModule
System.Diagnostics.FileVersionInfo
System.Diagnostics.Process【エイリアス】
ps
gps
今回は赤色で示した ”-IncludeUserName” と ”-FileVersionInfo” をメインに解説します。
-IncludeUserName オプションで実行ユーザを確認する
コマンドレットの説明にあるように Get-Process には “-IncludeUserName” オプションがあります。
この “-IncludeUserName” オプションは PowerShell v4.0 で新たに追加されたオプションであり、これまで取得できなかった「実行ユーザ」を取得することが可能となりました。
ただし、このオプションは「実行ユーザでフィルターする」のではなく「取得するプロセス一覧に実行ユーザ情報を付加する」という点に注意です。
実行方法は
Get-Process -IncludeUserName
という風にオプションを指定するだけです。
実行結果を見てみましょう。
PS C:\work> Get-Process -IncludeUserName Handles WS(K) VM(M) CPU(s) Id UserName ProcessName ------- ----- ----- ------ -- -------- ----------- 77 3648 35 0.00 1696 NT AUTHORITY\S... armsvc 150 12236 78 0.19 1936 CHESHIRE-PC\hoge conhost 634 5872 110 0.42 500 NT AUTHORITY\S... csrss 610 18768 178 25.60 552 NT AUTHORITY\S... csrss 103 5964 58 0.06 3520 CHESHIRE-PC\hoge dwm 1287 102972 422 128.37 3544 CHESHIRE-PC\hoge explorer 99 5092 42 0.03 1792 NT AUTHORITY\S... HeciServer 0 24 0 0 Idle 957 195476 494 120.85 5212 CHESHIRE-PC\hoge iexplore 637 41784 211 9.28 5696 CHESHIRE-PC\hoge iexplore 743 150352 377 8.36 5748 CHESHIRE-PC\hoge iexplore 271 12364 163 0.33 3672 CHESHIRE-PC\hoge IMECMNT 68 3472 20 0.02 1744 NT AUTHORITY\S... IMEDICTUPDATE 64 3800 26 0.00 1836 NT AUTHORITY\S... IPROSetMonitor 107 8388 76 0.05 3704 CHESHIRE-PC\hoge iusb3mon 86 4260 27 0.00 1872 NT AUTHORITY\S... Jhi_service 199 11548 74 0.20 3760 CHESHIRE-PC\hoge jusched 135 5660 37 0.08 1900 NT AUTHORITY\S... LMS 974 13000 40 11.33 644 NT AUTHORITY\S... lsass 215 5248 26 0.19 660 NT AUTHORITY\S... lsm 78 4488 45 0.03 5160 CHESHIRE-PC\hoge MsSpellCheckingFacility 140 12152 75 1.03 2328 CHESHIRE-PC\hoge notepad 435 50792 217 0.41 4256 CHESHIRE-PC\hoge powershell 113 13996 82 0.08 720 CHESHIRE-PC\hoge sakura 1383 28484 139 3.29 2816 NT AUTHORITY\S... SearchIndexer 239 7632 29 2.62 600 NT AUTHORITY\S... services 522 8196 125 8.13 2300 Smc 37 960 4 0.25 372 NT AUTHORITY\S... smss 387 12672 88 0.80 1560 NT AUTHORITY\S... spoolsv 251 33784 150 13.67 3032 CHESHIRE-PC\hoge StikyNot 389 7764 35 6.54 768 NT AUTHORITY\S... svchost 330 7444 33 1.00 848 NT AUTHORITY\N... svchost 569 16004 73 3.00 948 NT AUTHORITY\L... svchost 506 11756 67 1.12 1004 NT AUTHORITY\S... svchost 401 18044 70 1.62 1032 NT AUTHORITY\L... svchost 1099 27172 97 2.98 1068 NT AUTHORITY\S... svchost 632 15768 90 1.97 1420 NT AUTHORITY\N... svchost 324 14516 62 0.80 1588 NT AUTHORITY\L... svchost 161 4572 25 0.25 3772 NT AUTHORITY\L... svchost 775 744 3 36.24 4 System 320 20236 123 3.07 3476 CHESHIRE-PC\hoge taskhost 352 12060 67 0.36 2756 NT AUTHORITY\S... UNS 145 7012 52 0.05 1304 NT AUTHORITY\S... vmware-usbarbitrator 87 4696 43 0.14 560 NT AUTHORITY\S... wininit 134 7704 51 0.42 632 NT AUTHORITY\S... winlogon 303 5644 93 1.29 3284 NT AUTHORITY\N... wmpnetwk
このように「UserName」列が新たに追加されたことがわかります。
”-InputObject” の実行結果から特定の実行ユーザでフィルターしたい場合はひと工夫が必要です。
Get-Process コマンドレットから「Where-Object」コマンドレットに“| (パイプライン)”で渡し比較演算子で比較します。
これをコマンドレットで表すと
Get-Process -IncludeUserName | Where-Object -FilterScript {条件}
となります。
また条件が「○○と一致」でフィルターする場合は
{$_.UserName -eq “<絞り込むユーザ名>”}
とスクリプトブロックに入力します。
自動変数”$_” の UserName プロパティにアクセスし “-eq” (イコール)で絞り込むユーザと比較するという動きですね。
実際にフィルタリングしてみると以下のようになります。
PS C:\work> Get-Process -IncludeUserName | Where-Object -FilterScript {$_.UserName -eq "CHESHIRE-PC\hoge" } Handles WS(K) VM(M) CPU(s) Id UserName ProcessName ------- ----- ----- ------ -- -------- ----------- 188 18172 125 10.11 5812 CHESHIRE-PC\hoge conhost 110 7220 68 0.06 3656 CHESHIRE-PC\hoge dwm 650 92520 436 12.40 3292 CHESHIRE-PC\hoge EXCEL 1134 97496 400 169.43 3700 CHESHIRE-PC\hoge explorer 530 52440 255 0.75 448 CHESHIRE-PC\hoge iexplore 797 167072 408 204.17 4108 CHESHIRE-PC\hoge iexplore 691 44376 224 21.00 5452 CHESHIRE-PC\hoge iexplore 267 12284 162 0.30 3800 CHESHIRE-PC\hoge IMECMNT 154 12516 88 0.14 4040 CHESHIRE-PC\hoge ipmsg 118 9232 81 1.54 3928 CHESHIRE-PC\hoge iusb3mon 61 5512 57 0.03 3980 CHESHIRE-PC\hoge jusched 79 4472 45 0.03 4004 CHESHIRE-PC\hoge MsSpellCheckingFacility 1124 127084 400 14.31 704 CHESHIRE-PC\hoge powershell 113 14092 82 0.12 3468 CHESHIRE-PC\hoge sakura 222 20024 107 8.85 4024 CHESHIRE-PC\hoge StikyNot 323 17800 119 3.71 3564 CHESHIRE-PC\hoge taskhost
スクリプトブロックでは比較対象に””(ダブルクォーテーション)がついていないとエラーが出るので注意してください。
-FileVersionInfo オプションでバージョンを確認する
次に実行ファイルのバージョン確認方法について紹介します。
“-FileVersionInfo” オプションではプロセスで実行されるプログラムファイルのバージョン情報が取得できます。
自分が所有していないプロセスや実行ファイルにアクセスすることがあるため管理者モードで実行する事をお勧めします。
管理者として実行するにはスタートメニューから PowerShell を[管理者として実行する]から起動します。
上図のように PowerShell を、[管理者として実行]から起動します。
起動した PowerShell 画面に、「管理者」と記載があれば管理者として起動が成功しました。(※下図参照)
このオプションを使用した実行方法は
Get-Process -FileVersionInfo
という風にオプションを指定するだけです。
実際に実行してみると、
PS C:\work> Get-Process -FileVersionInfo ProductVersion FileVersion FileName -------------- ----------- -------- 6.1.7600.16385 6.1.7600.1638... C:\Windows\system32\conhost.exe 6.1.7600.16385 6.1.7600.1638... C:\Windows\system32\Dwm.exe 6.1.7600.16385 6.1.7600.1638... C:\Windows\Explorer.EXE 6.1.7600.16385 6.1.7600.1638... C:\Windows\Explorer.EXE 1,24,388,1 1.24.388.1 SY... C:\Program Files\Intel\iCLS Client\HeciServer.exe Get-Process : Cannot enumerate the file version information of the "Idle" process. At line:1 char:1 + Get-Process -FileVersionInfo + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : PermissionDenied: (System.Diagnostics.Process (Idle):Process) [Get-P rocess], ProcessCommandException + FullyQualifiedErrorId : CouldnotEnumerateFileVer,Microsoft.PowerShell.Commands.GetProcessCom mand 11.00.9600.16428 11.00.9600.16... C:\Program Files\Internet Explorer\iexplore.exe 11.00.9600.16428 11.00.9600.16... C:\Program Files\Internet Explorer\iexplore.exe 18, 7, 2, 0 18, 7, 2, 0 C:\Windows\system32\IProsetMonitor.exe 6.1.7600.16385 6.1.7600.1638... C:\Windows\system32\lsm.exe 6.3.9600.16428 6.3.9600.1642... C:\Windows\System32\MsSpellCheckingFacility.exe 10.0.10586.117 10.0.10586.11... C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe 6.1.7600.16385 6.1.7600.1638... C:\Windows\system32\services.exe 6.1.7600.16385 6.1.7600.1638... C:\Windows\system32\smss.exe 6.1.7600.16385 6.1.7600.1638... C:\Windows\system32\svchost.exe Get-Process : Cannot enumerate the file version information of the "System" process. At line:1 char:1 + Get-Process -FileVersionInfo + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : PermissionDenied: (System.Diagnostics.Process (System):Process) [Get-Process], ProcessCommandException + FullyQualifiedErrorId : CouldnotEnumerateFileVer,Microsoft.PowerShell.Commands.GetProcessCommand 6.1.7600.16385 6.1.7600.1638... C:\Windows\system32\taskhost.exe 6.1.7600.16385 6.1.7600.1638... C:\Windows\system32\taskhost.exe 8.1.0.1252 8.1.0.1252 C:\Program Files\Intel\Intel(R) Management Engine Components\U... e.x.p build-1... 11. 1.6.1261454 C:\Program Files\Common Files\VMware\USB\vmware-usbarbitrator.exe 6.1.7600.16385 6.1.7600.1638... C:\Windows\system32\wininit.exe 6.1.7601.17514 6.1.7601.1751... C:\Windows\system32\winlogon.exe 12.0.7600.16385 12.0.7600.163... C:\Program Files\Windows Media Player\wmpnetwk.exe
このように
- プロダクトのバージョン
- ファイルのバージョン
- プロセスが実行するファイル名
といった情報が表示されます。
他の Get-Process コマンドレットの実行結果とは表示が大きく違うことに気が付きましたか?
“-FileVersionInfo” で取得する情報は単純な Get-Process コマンドレットの実行結果とは型が違うんです。
試しに「メモ帳」を起動した状態で型を確認してみると、
# 通常の実行結果 PS C:\work> (Get-Process -Name notepad ).GetType().FullName System.Diagnostics.Process # ファイルバ―ジョンの取得結果 PS C:\work> (Get-Process -Name notepad -FileVersionInfo).GetType().FullName System.Diagnostics.FileVersionInfo
となり、
「System.Diagnostics.Process」に対して
「System.Diagnostics.FileVersionInfo」
の異なる型が返ってきました。
型が変わったのでメソッドやプロパティも大きく変わっているようです。気になる方はこちら↓にメソッドやプロパティを確認してみてください。
[blogcard url=”https://cheshire-wara.com/powershell/ps-cmdlets/object/get-member/”]ちなみに、”Idle” と “System” プロセスの FileVersionInfo を見ようとすると「PermissionDenied(アクセス拒否)」が発生するようですね。 ”Idle” にはそもそも実行ファイルなんてものが無いでしょうし、”System” はWindowsそのものでしょうからね。
エラーを回避するために、この2つのプロセスを除外してファイルバージョンを確認するなら Where-Object で一旦フィルタするのがよさそうですね。
PS C:\work> #systemとidleをフィルタする PS C:\work> Get-Process | Where-Object {$_.Name -ne "System" -and $_.Name -ne "idle"} | Get-Process -FileVersionInfo ProductVersion FileVersion FileName -------------- ----------- -------- 6.1.7600.16385 6.1.7600.1638... C:\Windows\system32\conhost.exe 6.1.7600.16385 6.1.7600.1638... C:\Windows\system32\Dwm.exe 6.1.7600.16385 6.1.7600.1638... C:\Windows\Explorer.EXE 6.1.7600.16385 6.1.7600.1638... C:\Windows\Explorer.EXE 1,24,388,1 1.24.388.1 SY... C:\Program Files\Intel\iCLS Client\HeciServer.exe 11.00.9600.16428 11.00.9600.16... C:\Program Files\Internet Explorer\iexplore.exe 11.00.9600.16428 11.00.9600.16... C:\Program Files\Internet Explorer\iexplore.exe 18, 7, 2, 0 18, 7, 2, 0 C:\Windows\system32\IProsetMonitor.exe 6.1.7600.16385 6.1.7600.1638... C:\Windows\system32\lsm.exe 6.3.9600.16428 6.3.9600.1642... C:\Windows\System32\MsSpellCheckingFacility.exe 10.0.10586.117 10.0.10586.11... C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe 6.1.7600.16385 6.1.7600.1638... C:\Windows\system32\services.exe 6.1.7600.16385 6.1.7600.1638... C:\Windows\system32\smss.exe 6.1.7600.16385 6.1.7600.1638... C:\Windows\system32\svchost.exe 6.1.7600.16385 6.1.7600.1638... C:\Windows\system32\taskhost.exe 6.1.7600.16385 6.1.7600.1638... C:\Windows\system32\taskhost.exe 8.1.0.1252 8.1.0.1252 C:\Program Files\Intel\Intel(R) Management Engine Components\U... e.x.p build-1... 11. 1.6.1261454 C:\Program Files\Common Files\VMware\USB\vmware-usbarbitrator.exe 6.1.7600.16385 6.1.7600.1638... C:\Windows\system32\wininit.exe 6.1.7601.17514 6.1.7601.1751... C:\Windows\system32\winlogon.exe 12.0.7600.16385 12.0.7600.163... C:\Program Files\Windows Media Player\wmpnetwk.exe
まとめ
実行中のプロセスについて実行ユーザを確認する場合は、
Get-Process -IncludeUserName
実行中のプロセスについて実行ファイルのバージョンを確認する場合は、
Get-Process -FileVersionInfo
を使用する。
ただし、”Idle” と “System” プロセスの FileVersionInfo は参照できない。