Windows Serverの DHCP Server サービスには、GUIベースの管理コンソールに動作ログを閲覧する機能が実装されていないので、DHCPに関するトラブルシューティングの際は、ログファイルを開いて確認するしかありません。DHCPログをリモートからリアルタイムで継続的に監視する簡易的な方法を考察します。
Windows ServerのDHCPサーバサービスはそのログファイルを今も昔も変わらず、
1 |
%WINDIR%\System32\dhcp\ |
に過去一週間分のログが日毎のテキストファイル形式で保存していて、そのファイル名には日付ではなく曜日が使われており、バッチ処理時など、自動化の際は「今日の曜日文字列」を取得する手間を要します。
こうしたログのモニタリングはLinuxサーバであればtail -fコマンドが定番ですが、Windows Server 2003ではこれに相当するコマンドtail.exeが当時、Windows Server 2003 Resource Kit Toolsに同梱されていたので、これを使い次のようなバッチを組みました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
:: MONITOR DHCP LOG :: WINDOWS 2003 SERVER RECOURCE KIT TOOL REQUIRED @echo off set logpath=C:\WINDOWS\system32\dhcp\ cscript /b C:\bats\wday.vbs if errorlevel 1 set WDAY=Sun if errorlevel 2 set WDAY=Mon if errorlevel 3 set WDAY=Tue if errorlevel 4 set WDAY=Wed if errorlevel 5 set WDAY=Thu if errorlevel 6 set WDAY=Fri if errorlevel 7 set WDAY=Sat set logfile=DhcpSrvLog-%WDAY%.log tail -f %logpath%%logfile% |
1 |
WScript.Quit(WeekDay(Date)) |
これをローカルであればDOSプロンプトより、リモートであればtelnetを介してUbuntuから実行し、DHCPサーバサービスの挙動をリアルタイムで監視していました。
OpenSSHをインストールしてリモート監視
現在、OSはWindows Server 2012 にリプレースされても、DHCPサーバサービスの仕様はこれまで同様。しかしながら、telnetが標準で未インストール状態で非推奨、さらにWindows Server 2003 Resource Kit Toolsの tail.exeはもう使えません。
前者の問題については、Microsoft謹製のOpenSSHバイナリを導入してみます。導入手順はWinSCPのこちらの記事に沿って進めました、GreatTnx!
まず公式GitHubよりダウンロードしたZipをProgram Filesに解凍し、そのパスを環境変数Pathに追記します(半角セミコロン区切り)。
次に解凍したバイナリに同梱されている「install-sshd.ps1」を使い、SSHサーバサービスをシステムに登録します。
1 |
powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1 |
登録されたサービスを管理コンソールで確認し、自動起動にします。
最後にファイヤウォールの内向きTCP22番ポートに穴を開ければ、SSHサーバの設定は終わりです。
1 |
New-NetFirewallRule -DisplayName 'OpenSSH' -Enabled True -Direction Inbound -Protocol TCP -LocalPort 22 -Action Allow -Program "C:\Program Files\OpenSSH-Win64\sshd.exe" |
リモートアクセスの際に使われる公開鍵は、sshログインするユーザのプロファイル配下にあるファイル「authorized_keys」に列記します。
1 |
%USERPROFILE%\.ssh\authorized_keys |
これでUbuntu自機から鍵認証でssh接続出来るようになりました。
Powershell版tailを試す
次に前述の後者の問題、tail.exe代替については、PowerShellにその機能が実装されたようなので詳しく調べてみると、バージョンによって微妙に違いがあることが判りました。インストールされているPowershellのバージョン情報を得るには、Powershellコンソールから次のように。
1 2 3 4 5 |
Get-Host | Select-Object Version Version ------- 5.1.14409.1018 |
まず、現行のver.5系では次のように使うことで、Linux系のtail同等の振る舞いをしてくれるので、問題はありません。
1 |
Get-Content -Path LOGFILENAME -Wait -Tail 20 |
Get-ContentコマンドレットにTailオプションが実装されたver.3以降〜ver.5未満では、Waitオプションが未実装なので、いくら待っても再帰的に取得してはくれません。その場合の解決策について、こちらのフォーラムに良い方法が紹介されていました、GreatTnx!!
1 2 3 4 5 |
while(1){ Get-Content -Path LOGFILENAME -Tail 20 Start-Sleep -Seconds 10 Clear } |
挙動は再取得の際に画面クリアがかかる仕様なので、全く同じとは言えませんがログ監視には十分有用です。使用環境に合わせ使い分けることにします。
以上より、Powershell版のログ監視バッチは次のように完成しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# DHCP Server Log Monitor # # Check your PSVersion: PS> Get-Host | Select-Object Version # Set Regional Setting to English $dLog=$Env:WinDir+"\System32\dhcp\DhcpSrvLog-"+(Get-Date -Format "ddd")+".log" $res=(Test-Path $dLog) if($res){ # FOR PSVersion5 Get-Content -Path $dLog -Wait -Tail 20 # FOR PSVersion3 #while(1){ # Get-Content -Path $dLog -Tail 20 # Start-Sleep -Seconds 10 # Clear #} }else{ echo "Log File Not Found." } |
sshでサーバに繋いだ後、Powershell.exeにこのバッチを渡せば、DHCPサーバログのリアルタイム監視が可能になります。