足の甲を骨折してみたり、世間的に新型コロナウイルス (COVID-19) 感染症対策とか不要不急の外出を避ける雰囲気だったりもして、比較的家にこもっているからちょっと思い付きで作りました。
かしこい人はうまくやるんでしょうけども。
Windows Server とかになんかソフトウェアを入れようとしたとき、
そのソフトウェアが何らかの通信ポートをリッスンするとき、既にインストール済みの何かがそのポートにバインド済みでインストールできない! とか発生した場合。
netstat -a とかで 確かに何かがポートリッスンしているのは分かった。
・・・
netstat -b とかやって何がポートを握っているのか見ようとしたら管理者権限必要でできなかったりとか。
管理者権限を運よく使えるようになった場合であっても、表示されるのは「HostedAgent.exe」みたいな実行ファイルだけだったりして、これどこの誰やねんてのは追加調査が必要だったりするわけです。
これはつまるところこの邪魔になっているやつを止めたいけど突き止めるまでが大変なわけです。
こんな時、PowerShell なら一発解決してくれるんじゃないかね?! と期待するじゃないですか。
netstat コマンドに代わるものは NetTCPIP モジュールに含まれる、
Get-NetTCPConnection
Get-NetTCPEndpoint
かなぁ、と思うのだけれども。この人たちはプロセス名とか表示されないわけですよ。
$a = Get-NetTCPconnection ; $a[0] | fl *
とか見ていたら OwningProcess とかプロセス ID はありそうなのだけど。
あ、ポートを見てるプロセスだからサービスって可能性もあるよねぇ。
プロセス名だけわかっても svchost だらけだったりして結局なんやねんこれだったりすることもあるんじゃないかね。
そんなこんなで作ってみました。
Get-NetProcess
お勧めポイント
・管理者権限なくてもおおよそ netstat -b に類する情報拾える。
一部実体ファイル情報が管理者権限でないと拾えてない場合アリ。
管理者権限を利用可能で且つ万全を期したい場合は管理者モードで起動した PowerShell 上での実行を推奨。
・対象ポートを利用しているのがサービスだった時、該当するサービス名を主に表示する。
※ プロセス名 (Get-Process でとれる情報)か、
サービス表示名 (Get-CimInstance (Get-Service)) で見えるわかりやすい名前で表示。
※ サービス管理ツールとかで表示されるわかりやすい名前。
しかも「このサービスなんだっけ?」てならないように説明情報ももちろん含んで取得済み。
・netstat と違って、Get-NetProcess はオプション指定で情報抽出対象をローカルまたはリモートのアドレス
やポート番号、あるいは名前で絞り込みが可能。
例) Get-NetProcess -Name firefox
・Get-NetProcess | Export-Clixml -path CapturedInfo.xml
などとして詳細情報を保存可能。
気にしてはいけないこと
・netstat -abn とか n オプション付きの netstat 爆速感を思うと遅くないですか?
・netstat コマンドだとローカルとリモートの情報が1画面に出てくるのに Binding Information て
ローカル側情報しかなくないですか?
→ 基本的にローカルポートの使いたいポート先に使ってるやつ誰なんや?!を探したかったので
基本はローカル情報を主に出してるのであります。
リモートは? て人は -SelectRemote オプション付けてみて。
リモートしか出てねぇじゃねぇかって突っ込みしたい人は -Summary にしてw
・netstat -a だとリモートアドレスのホスト名が出てるんですけど?
→ -CheckPTR オプション使ってみて。逆引きDNS はゾーン登録なしでできない場合が多くて
この場合に Resolve-DnsName のタイムアウトが時間かかるので遅くなりますけれども。
また、netstat はリモートアドレスの長いホスト名途中で切れているし、FQDN 出てないから
情報不完全やぞw その点 Get-NetProcess には全部の情報が含まれているから、、、、
・「実はほかのこのツール使うともっと早いし情報とれるんですけど?」
知らん、そんなツールは知らん。あったなら教えてくだされw
名前
Get-NetProcess
概要
ネットワーク通信などのプロセス名を調べます。
構文
Get-NetProcess [[-LocalAddress] <String>] [[-LocalPort] <String>] [[-RemoteAddress] <String>]
[[-RemotePort] <String>] [[-State] <String>] [[-Protocol] <String>] [[-SelectRemote]]
[[-SelectLocal]] [[-Summary]] [[-NoProgress]] [[-CheckPTR]] [[-Name] <String>]
[[-ProcessName] <String>] [[-ServiceName] <String>] [<CommonParameters>]
説明
ネットワーク通信などのプロセス名を調べます。
-------------------------- 例 1 --------------------------
PS C:\>Get-NetProcess
ネットワーク通信ポート番号とプロセス情報を列挙します。
-------------------------- 例 2 --------------------------
PS C:\>$Results = Get-NetProcess
ネットワーク通信ポート番号とプロセス情報を変数に格納します。
$Results
変数に保持した情報のサマリが表示されます。
$Results[0] | fl *
特定行の詳細を確認するには、パイプ接続して Format-List -Property * などで非表示のプロパティ値を
確認できます
詳細情報には以下の情報も含まれています。
$Results[0].ProcessName = Get-Process で確認できるプロセス名です。例:"spoolsv"
$Results[0].ServiceName = Get-Service で確認できるサービス名です。例:"Spooler"
$Results[0].ServiceDisplayName = Get-Service で確認できるサービスの表示名です。
例: "Print Spooler"
$Results[0].Name = サービスの場合は ServiceDisplayName、そうでない場合は ProcessName を
返します。
$Results[0].FileName = この通信を利用している実体のファイル名。
サービスの場合は $Results[0].ServiceDescription にどのようなサービス化の説明が含まれます。
-------------------------- 例 3 --------------------------
PS C:\>Get-NetProcess -LocalPort 8080
Get-NetProcess -LocalAddress 192.168.10.10
Get-NetProcess -LocalAddress 192.168.10.10 -LocalPort 8080
指定した条件でフィルターした結果が表示されます。
-------------------------- 例 4 --------------------------
PS C:\>Get-NetProcess -RemotePort 443
Get-NetProcess -RemoteAddress 192.168.10.10
Get-NetProcess -RemoteAddress 192.168.10.10 -RemotePort 443
指定した条件でフィルターした結果が表示されます。
暗黙的に -SelectRemote -Protocol TCP オプションが指定された時と同じ挙動になります。
-------------------------- 例 5 --------------------------
PS C:\>Get-NetProcess -State Listen
指定したステートの通信情報が表示されます。
暗黙的に -Protocol TCP オプションが指定された時と同じ挙動になります。
-------------------------- 例 6 --------------------------
PS C:\>Get-NetProcess -Protocol TCP
Get-NetProcess -Protocol UDP
それぞれ指定したプロトコルの情報のみ列挙されます。
既定値は TCP+UDP で両方表示されます。
-------------------------- 例 7 --------------------------
PS C:\>Get-NetProcess -RemotePort 443 -CheckPTR
RemoteAddress について Resolve-DnsName で逆引き検索を行います。
名前解決できない通信先の場合、タイムアウトするまで処理が停止したように見えるようになるため、
処理完了までに時間を要するようになります。
-------------------------- 例 8 --------------------------
PS C:\>Get-NetProcess -NoProgress
通常時 netstat コマンドの様に1件ずつ順次表示しますが、このオプションを指定すると
表示すべき情報が全部そろってから出力します。
-------------------------- 例 9 --------------------------
PS C:\>Get-NetProcess -Summary
通常時 Local Address + Local Port を組み合わせた "Binding Information" または
Remote Address + Remote Port を組み合わせた "Remote Information" のいずれかを表示しますが
-Summary オプションを付けると netstat コマンドの出力のように
Local Address + Local Port + Remote Address + Remote Port をまとめて表示します。
-------------------------- 例 10 --------------------------
PS C:\>Get-NetProcess -Name spooler
Get-NetProcess -ProcessName spoolsv
Get-NetProcess -ServiceName spooler
Get-NetProcess -ServiceName "Print Spooler"
これらはいずれも"Print Spooler" サービスの情報を表示します。
-Name オプションで指定した場合は、-ProcessName と -ServiceName に同じ値を指定したのと同じ検索を行い
結果はマージされて一緒に表示されます。
-ProcessName オプションは Get-Process コマンドで確認できる ProcessName と比較されます。
-ServiceName オプションは Get-Service コマンドで確認できる Name および DisplayName と比較されます。
-------------------------- 例 11 --------------------------
PS C:\>Get-NetProcess -Name *cl*
Get-NetProcess -ProcessName *cl*
Get-NetProcess -ServiceName *cl*
名前を指定して抽出対象を指定するパラメーターはワイルドカードが使えます。