プロセス名でnetstat?
netstat -a -o -n
を使ってポートのリストと PID
を取得した後、タスクマネージャに行って PID を追加して誰がそれをやっているのかを確認する必要があります。(かなりイライラします)
全てを行うCMDコマンドがあるかどうか疑問に思いました( find
, for
, powershell
を使用)
そうすればプロセス名を取得できます。
netstat -a -o -n
を使ってポートのリストと PID
を取得した後、タスクマネージャに行って PID を追加して誰がそれをやっているのかを確認する必要があります。(かなりイライラします)
全てを行うCMDコマンドがあるかどうか疑問に思いました( find
, for
, powershell
を使用)
そうすればプロセス名を取得できます。
-b Displays the executable involved in creating each connection or
listening port. In some cases well-known executables host
multiple independent components, and in these cases the
sequence of components involved in creating the connection
or listening port is displayed. In this case the executable
name is in [] at the bottom, on top is the component it called,
and so forth until TCP/IP was reached. Note that this option
can be time-consuming and will fail unless you have sufficient
permissions.
注意 -b
コマンドは、昇格したコマンドプロンプトから実行しないと失敗します。
tasklist | findstr /c:"PID"
プロセスリストをフィルタリングして、興味のある PID を見つけてください。
Usage: tcpvcon [-a] [-c] [-n] [process name or PID]
-a Show all endpoints (default is to show established TCP connections).
-c Print output as CSV.
-n Don't resolve addresses.
代わりに netstat -b
を使用することができます。管理者権限は必要ありません。
Tcpvcon の使用方法は Windows 組み込みの
Tcpvcon.exe
ユーティリティに似ています。
0x1&
SysInternalsの TCPView を探していると思います。
Windows の例は、FOR
を使って netstat
の出力を解析し、DO
tasklist
の出力を /fi
tasklist
にして、pid に netstat
フィルタをかけてプロセス名を表示しています。
最後の発見は、0x6& ヘッダを削除することです。
FOR /F "usebackq tokens=5 delims= " %i IN (`netstat -ano ^|find "443"`) DO @tasklist /fi "pid eq %i" | find "%i"
は、
tomcat8.exe.x64 4240 Services 0 931,864 K
のようにレコードを出力します。
PS を使うのが好きなら、このコードをフォークすることができます (注意: 超基本的なコードです)
$nets = netstat -ano | select-string LISTENING
foreach($n in $nets){
# make split easier PLUS make it a string instead of a match object:
$p = $n -replace ' +',' '
# make it an array:
$nar = $p.Split(' ')
# pick last item:
$pname = $(Get-Process -id $nar[-1]).ProcessName
$ppath = $(Get-Process -id $nar[-1]).Path
# print the modified line with processname instead of PID:
$n -replace "$($nar[-1])","$($ppath) $($pname)"
}
完全な実行パスを得るために、Path
の代わりに ProcessName
を試すことができることに注意してください - ただし、システムサービスでは動作しません。また、PID値を置き換える代わりに、行の最後にProcessName
を追加した方が良いかもしれません。
お楽しみください ;)
これを使ってみて
タイムスタンプ付きのプロセス名 :) を oneliner で指定してみた。
非常に素晴らしいErik Bitemo! 私はパスの変数を追加しようと考えていましたが、それが定義されていないにもかかわらず、あなたはすでにそれを持っていることに気づきました。
$nets = netstat -ano |select-string LISTENING;
foreach ($n in $nets)
{
# make split easier PLUS make it a string instead of a match object
$p = $n -replace ' +',' ';
# make it an array
$nar = $p.Split(' ')
# pick last item...
$pname = $(Get-Process -id $nar[-1]).ProcessName
$ppath = $(Get-Process -id $nar[-1]).Path;
# print the modified line with processname instead of PID
$n -replace "$($nar[-1])","$($ppath) $($pname)" | where {$pname -like "*GMSVP*"}
}
私はアプリケーションのプロセスとサービスを見つけようとしていたので、私が再利用したコードは次のとおりです。
Get-Service | select status,name,displayname,servicename | where {($_.DisplayName -like "myserv*") -or ($_.servicename -like "post*")} | ft -auto
Get-Process | select id, processname,cpu,path,description | where {$_.path -like "*myserv*"} | ft -auto