Windowsでパケットキャプチャ(備忘録)

 「netsh trace」は「Wireshark」のように,設定したファイルサイズに区切って出力することはできない*1ので,定期的にファイルサイズを量ってキャプチャを停止/開始するような仕掛けを考えました.
 停止から開始までの間はキャプチャできないのが最大の欠点です.
 それと,「c:\capture_bat」に置かないと使えません*2
 「c:\capture_bat\logs」もあらかじめ作成しておきます.
 

  • capture_start.bat

 タスクスケジューラで定期的に(10分毎とか)「SYSTEM」ユーザで実行します.
 「maxsize=100」「ago=4」「captureinterface="ワイヤレス ネットワーク接続"」は適宜調整します.

@set wDATE=%date:~-10,4%%date:~-5,2%%date:~-2,2%
@set wTIME2=%time: =0%
@set wTIME=%wTIME2:~0,2%%wTIME2:~3,2%%wTIME2:~6,2%
@set maxsize=100
@set /A max2=%maxsize%*1000*1000
@set ago=4

C:
cd C:\capture_bat

echo.   >>  capture_start.log
echo %date% %time%  >>  capture_start.log


  call :capture_start


FOR %%F IN ("logs\\%computername%.etl") DO set /A fsize=%%~zF

echo if %fsize% geq %max2%  >>  capture_start.log

if %fsize% geq %max2% (

  echo "STOP!!"    >>  capture_start.log

   netsh trace stop

   ren "logs\\%computername%.etl" "%computername%_%wDATE%%wTIME%.etl"
   ren "logs\\%computername%.cab" "%computername%_%wDATE%%wTIME%.cab"

   forfiles /P logs /D -%ago% /M "*.etl" /C "cmd /c del @file"
   forfiles /P logs /D -%ago% /M "*.cab" /C "cmd /c del @file"
   
   call :capture_start

) else (
   echo "Continue!!"    >>  capture_start.log
)

goto end

:capture_start

netsh trace start capture=yes captureinterface="ワイヤレス ネットワーク接続" maxsize=0 fileMode="append" traceFile="logs\\%computername%.etl"   >>  capture_start.log

exit /b


:end


 

  • netsh_show.bat

 「captureinterface="ワイヤレス ネットワーク接続"」に指定する文字列を探すバッチです.
 これは,ダブルクリックで実行でよいです.

netsh trace show interfaces

pause
    • 実行するとこんな感じ.ウチのPCだと,「ワイヤレス ネットワーク接続」ばかり使用ですが,複数指定も可能(「captureinterface=("ローカル エリア接続","ワイヤレス ネットワーク接続")」)とのこと. 
C:\capture_bat>netsh trace show interfaces

ワイヤレス LAN アダプター ワイヤレス ネットワーク接続:
    説明:                          Broadcom 802.11n ネットワーク アダプタ
    インターフェイス GUID:         {26BECD34-61E5-46D3-934B-C1C1E8D65C78}
    インターフェイス インデックス: 12
    インターフェイス LUID:         0x47000000000000

イーサネット アダプター ローカル エリア接続:
    説明:                          Broadcom NetLink (TM) Gigabit Ethernet
    インターフェイス GUID:         {8F864D88-47E9-413E-A02A-C7AB4105331A}
    インターフェイス インデックス: 11
    インターフェイス LUID:         0x6000006000000

トンネル アダプター isatap.airport:
    説明:                          Microsoft ISATAP Adapter
    インターフェイス GUID:         {10EC6274-46C7-4E78-9902-9E948ADAA10D}
    インターフェイス インデックス: 18
    インターフェイス LUID:         0x83000004000000

トンネル アダプター isatap.{8F864D88-47E9-413E-A02A-C7AB4105331A}:
    説明:                          Microsoft ISATAP Adapter #2
    インターフェイス GUID:         {A508FAC0-A032-40D9-A749-3996B1858C97}
    インターフェイス インデックス: 17
    インターフェイス LUID:         0x83000005000000

トンネル アダプター Teredo Tunneling Pseudo-Interface:
    説明:                          Teredo Tunneling Pseudo-Interface
    インターフェイス GUID:         {C7D5FE97-65A5-4065-A078-8A671220C870}
    インターフェイス インデックス: 14
    インターフェイス LUID:         0x8300000A000000


C:\capture_bat>pause
続行するには何かキーを押してください . . .
  • capture_stop.bat

 これもタスクスケジューラに「SYSTEM」ユーザで登録しておきます.
 繰り返しはしません. 登録するだけでスケジュールはしません.
 使い方は後述です.

netsh trace stop


 

  • キャプチャの止め方

 「capture_start.bat」のタスクを「無効」にした後、「capture_stop.bat」のタスクを実行します.
 「無効」にするのは,「繰り返し実行」だからです. 10分後とか翌日とかに実行されるとキャプチャがまた始まってしまいます.
 「無効」にしても,現在のキャプチャは実行中なので,「capture_stop.bat」を「タスクスケジューラ」から実行します. ダブルクリックで実行してもダメです.
 検証したところ,「capture_start.bat」「capture_stop.bat」は同じユーザでなければならないようで,面倒ですが両方を同じユーザでタスクスケジューラに登録することにしました.


 

*1:できるのかもしれませんが,okamotoyには解りませんでした (^^;

*2:理由はバッチ内を見ればすぐにわかります.