【bat】Windows標準コマンドでパケットキャプチャ取得

## これはなに？
windowsサーバでパケットキャプチャを取得するプログラムです。
採取時間、採取サイズ、対抗先IPアドレスを指定でき、自動でディレクトリを作成＆データを格納してくれます。
ついでに```etl2pcapng```を使ってwiresharkで読める形式にコンバートもしてくれます。(etl2pcapngは別途DL)

## 使い方
.batなので任意の場所に置いて実行してください。
私はタスクスケジューラに仕込んで使っています。
事前に```etl2pcapng```を```./tool```配下に設置してください。
[etl2pcapngの公式](https://github.com/microsoft/etl2pcapng)

## プログラム本体
```packetcap.bat
@echo off
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
rem ********************************************
rem ファイル名：packetcap.bat
rem 目的      ：Windowsサーバでパケットを採取する
rem ********************************************

rem ■カレントディレクトリ変更
set "CURRENT_DIR=%CD%"
cd /d %~dp0

rem ■現在時刻取得
set TIME2=%time: =0%
rem 例.)20201027_105710
set NOW_DATE=%date:~0,4%%date:~5,2%%date:~8,2%_%TIME2:~0,2%%TIME2:~3,2%%TIME2:~6,2%

rem ■パラメータ設定
rem --------------------------------------------
rem SIZE:採取するパケットの総サイズ(MB)
rem OUTPUT_DIR:採取したパケットの出力先
rem OUTPUT_FILENAME:出力ファイル名
rem DST_ADDR:対向先のIPアドレスを指定
rem EXEC_TIME:パケットの採取時間を指定(秒)
rem LOG_DIR:ログ出力ディレクトリ
rem LOG_NAME:ログファイル名
rem CONV_TOOL:wreshark用にコンバートするツールの格納先
rem --------------------------------------------
set SIZE=500
set OUTPUT_DIR=output\%NOW_DATE%\
set OUTPUT_FILENAME="%OUTPUT_DIR%%NOW_DATE%.etl"
set OUTPUT_CONVFILE="%OUTPUT_DIR%%NOW_DATE%.pcapng"
set DST_ADDR="xx.xx.xx.xx"
set EXEC_TIME=60
set LOG_DIR=log\
set LOG_NAME="%LOG_DIR%%NOW_DATE%.log"
set CONV_TOOL="tool\etl2pcapng\x86\etl2pcapng.exe"

rem ■出力先の確認
rem --------------------------------------------
rem [ディレクトリ構成]
rem バッチファイル本体.bat -> output -> 実行日時 -> .cab
rem                                             .etl
rem                                             .pcapng
rem                        -> log -> 実行日時.log
rem                        -> tool -> etl2pcapng
rem --------------------------------------------

rem パケット
if not exist %OUTPUT_DIR% (
 mkdir %OUTPUT_DIR%
)

rem ログ
if not exist %LOG_DIR% (
 mkdir %LOG_DIR%
)
echo %date% %time% info:バッチ起動 >> %LOG_NAME%

rem ■パケットキャプチャ処理
echo %date% %time% info:パケット採取開始 >> %LOG_NAME%
netsh trace start capture=yes maxsize=%SIZE% tracefile=%OUTPUT_FILENAME% IPv4.Address=%DST_ADDR% >> %LOG_NAME% 2>&1

if %errorlevel% == 0 (
  rem 正常系の処理
) else (
  rem 異常系の処理
  echo %date% %time% error:パケット採取開始が失敗しました 戻り値：%errorlevel% >> %LOG_NAME%
  endlocal
  exit /b %errorlevel%
)

rem テスト用の処理
rem ping %DST_ADDR% > nul 2>&1

netsh trace show status >> %LOG_NAME% 2>&1

echo %date% %time% info:パケット採取時間は %EXEC_TIME% 秒です >> %LOG_NAME%
timeout /t %EXEC_TIME% > nul

echo %date% %time% info:パケット採取を終了します >> %LOG_NAME%
netsh trace stop >> %LOG_NAME% 2>&1

if %errorlevel% == 0 (
  rem 正常系の処理
  echo %date% %time% info:パケット採取終了 >> %LOG_NAME%
) else (
  rem 異常系の処理
  echo %date% %time% error:パケット採取終了に失敗しました 戻り値：%errorlevel% >> %LOG_NAME%
  endlocal
  exit /b %errorlevel%
)

rem ■コンバート処理
rem 出力ファイルが.etlのため、wiresharkで確認できる形式に変換する
echo %date% %time% info:コンバート開始 >> %LOG_NAME%
%CONV_TOOL% %OUTPUT_FILENAME% %OUTPUT_CONVFILE%

if %errorlevel% == 0 (
  rem 正常系の処理
  echo %date% %time% info:コンバート終了 >> %LOG_NAME%
) else (
  rem 異常系の処理
  echo %date% %time% error:コンバート処理に失敗しました 戻り値：%errorlevel% >> %LOG_NAME%
  endlocal
  exit /b %errorlevel%
)

rem ■終了処理
endlocal
exit /b 0
```

## おわりに
powershell使うべきだったかしら。。