ポートを開いているプロセスを特定する

使いたいと思ったポートが何者かに使われていたとき、どのプロセスが使ってるのか知りたいってことありますよね。そんなときは、netstatに-oオプションをつけるとプロセスIDを表示してくれるようになるらしいです。例えば、以下のようにして調べられます。ちなみに-aは全部表示、-nはアドレスとポートを数値形式表示のオプションです。

一番右側のPIDのところに出てくるのがプロセスIDになります。

C:\>netstat -nao

Active Connections

  Proto  Local Address          Foreign Address        State           PID
  TCP    0.0.0.0:135            0.0.0.0:0              LISTENING       1064
  TCP    0.0.0.0:389            0.0.0.0:0              LISTENING       124
  TCP    0.0.0.0:445            0.0.0.0:0              LISTENING       4
  TCP    0.0.0.0:515            0.0.0.0:0              LISTENING       1404
  TCP    0.0.0.0:2030           0.0.0.0:0              LISTENING       292
  TCP    0.0.0.0:3306           0.0.0.0:0              LISTENING       2008
  TCP    0.0.0.0:3389           0.0.0.0:0              LISTENING       996
  TCP    0.0.0.0:10002          0.0.0.0:0              LISTENING       624
  TCP    0.0.0.0:10005          0.0.0.0:0              LISTENING       624
  TCP    0.0.0.0:10006          0.0.0.0:0              LISTENING       624
  TCP    0.0.0.0:11039          0.0.0.0:0              LISTENING       1900
  TCP    127.0.0.1:1067         0.0.0.0:0              LISTENING       2392
  TCP    127.0.0.1:4403         127.0.0.1:4404         ESTABLISHED     2464
  TCP    127.0.0.1:4404         127.0.0.1:4403         ESTABLISHED     2464
  TCP    127.0.0.1:4405         127.0.0.1:4406         ESTABLISHED     2464
  TCP    127.0.0.1:4406         127.0.0.1:4405         ESTABLISHED     2464

で、プロセスIDが分かったら、tasklistコマンドで実行ファイルとぶつけるです。これで分かれば、問題ないけど、svchost.exeとかだと、どのサービスか分からないですね。

C:\>tasklist

イメージ名                   PID セッション名     セッション# メモリ使用量
========================= ====== ================ ======== ============
System Idle Process            0 Console                 0         16 K
System                         4 Console                 0        236 K
smss.exe                     688 Console                 0        388 K
csrss.exe                    736 Console                 0     14,296 K
winlogon.exe                 760 Console                 0      3,876 K
services.exe                 804 Console                 0      5,632 K
lsass.exe                    816 Console                 0     35,456 K
svchost.exe                  996 Console                 0     37,860 K
svchost.exe                 1064 Console                 0     34,064 K
svchost.exe                 1152 Console                 0     75,356 K
svchost.exe                 1272 Console                 0     26,200 K

そこで、/svcオプションの登場。これを使えば、svchost.exeでも中身が分かるってことです。

C:\>tasklist /svc

イメージ名                   PID サービス
========================= ====== =============================================
System Idle Process            0 N/A
System                         4 N/A
smss.exe                     688 N/A
csrss.exe                    736 N/A
winlogon.exe                 760 N/A
services.exe                 804 Eventlog, PlugPlay
lsass.exe                    816 Netlogon, PolicyAgent, ProtectedStorage,
                                 SamSs
svchost.exe                  996 DcomLaunch, TermService
svchost.exe                 1064 RpcSs
svchost.exe                 1152 AudioSrv, Browser, CryptSvc, Dhcp, dmserver,
                                 ERSvc, EventSystem, helpsvc, HidServ,
                                 lanmanserver, lanmanworkstation, Netman,
                                 Nla, RasMan, Schedule, seclogon, SENS,
                                 SharedAccess, ShellHWDetection, srservice,
                                 TapiSrv, Themes, W32Time, winmgmt, wuauserv,
                                 WZCSVC
svchost.exe                 1272 Dnscache
svchost.exe                 1308 LmHosts, RemoteRegistry, SSDPSRV, WebClient

この手順はWindows XPWindows Server 2003で使えるらしいので、私はこれだけで十分そうです。似たようなことをやるために、WindowsではfportやActivePortsってソフトウェアがあるらしいです。ちなみにUnixの場合はlsofって外部コマンドが使えるらしいです。入れてないから試せませんでしたが。。。

なお、今回の手順はこちらの情報に基づいてます。というか、そのままです。

http://www.atmarkit.co.jp/fwin2k/win2ktips/236portcheck/portcheck.html