複数のIPアドレスをまとめて逆引きしたい
サーバのアクセスログ解析をするときに、ログにあるIPアドレスの逆引き結果がまとめて欲しいシーンがあったので作った。
搭載機能
- 指定したリスト(CSV)に存在するIPアドレスに対してPowershellの「Resolve-DnsName」を行う。
- サーバリストはフォーマット固定にする。第一カラムをIPaddressとする。
- 取得する情報は、Resolve-DnsNameで取得できる以下値とする。
QueryType
Server
NameHost
Name
Type
CharacterSet
Section
DataLength
TTL
また、「IPアドレスが存在しない」「そもそもホスト名がない」ようなエラー発生時にはPowershellで取得されるエラーログを対象IPの結果としてログ出力する。 - 結果はCSVファイルで出力する。ファイル名に実行年月日時分秒をつける。
- 対象数が多いと時間がかかるので、進捗状況が表示されるようにする。
- IPアドレスリストはテキストボックスで指定できるようにする。
- 後からエラーなどを終えるように実行ログを別ファイルとして吐き出す。
コード
絶対改善余地があるけどこんな感じ。
#
# リストにあるIPアドレスの逆引き結果をCSVに出力するスクリプト
#
# ファイル名:ReverseLookup.ps1
# 逆引き対象IPアドレス情報の初期化
$IPaddressList = $null
# CSVテーブルの用意
$CSVdatas = @()
# 日付の取得
$date = Get-Date -Format "yyyyMMdd";
# 時間の取得
$time = Get-Date -Format "HHmmss";
# 調査結果を出力するフォルダ
$scriptPath = $MyInvocation.MyCommand.Path
$scriptPath_split = Split-Path -Parent $scriptPath
$ResultFolder = ($scriptPath_split+"\結果")
# 調査結果出力結果フォルダがなかったら作成
if( -not (Test-Path $ResultFolder) ) {
New-Item $ResultFolder -Type Directory
}
# 実行結果出力ファイル名
$ExecuteLogFile = ( "\ExecuteLog_"+$date+"_"+$time+".log" )
#実行結果出力フォルダとファイル名のマージ
$ExecuteLog = Join-Path $ResultFolder $ExecuteLogFile
# アセンブリ読み込み
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
# フォーム作成
$Form = New-Object System.Windows.Forms.Form
$Form.Size = New-Object System.Drawing.Size(400,130)
$Form.Text = "逆引き調査ツール"
# ラベル作成
$LabelFilePath = New-Object System.Windows.Forms.Label
$LabelFilePath.Location = New-Object System.Drawing.Point(20,10)
$LabelFilePath.Size = New-Object System.Drawing.Size(300,20)
$LabelFilePath.Text = "IPアドレスリストのファイル(CSVのみ)を入力してください"
$Form.Controls.Add($LabelFilePath)
# 入力用テキストボックス
$TextBoxFilePath = New-Object System.Windows.Forms.TextBox
$TextBoxFilePath.Location = New-Object System.Drawing.Point(20,30)
$TextBoxFilePath.Size = New-Object System.Drawing.Size(300,20)
$Form.Controls.Add($TextBoxFilePath)
# 参照ボタン
$ButtonFilePath = New-Object System.Windows.Forms.Button
$ButtonFilePath.Location = New-Object System.Drawing.Point(320,30)
$ButtonFilePath.Size = New-Object System.Drawing.Size(40,20)
$ButtonFilePath.Text = "参照"
$Form.Controls.Add($ButtonFilePath)
# OKボタン
$ButtonOK = New-Object System.Windows.Forms.Button
$ButtonOK.Location = New-Object System.Drawing.Point(230,60)
$ButtonOK.Size = New-Object System.Drawing.Size(60,20)
$ButtonOK.Text = "OK"
$Form.Controls.Add($ButtonOK)
# Cancelボタン
$ButtonCancel = New-Object System.Windows.Forms.Button
$ButtonCancel.Location = New-Object System.Drawing.Point(300,60)
$ButtonCancel.Size = New-Object System.Drawing.Size(60,20)
$ButtonCancel.Text = "キャンセル"
$ButtonCancel.DialogResult = "Cancel"
$Form.Controls.Add($ButtonCancel)
# 参照ボタンをクリック時の動作
$ButtonFilePath.add_click{
#ダイアログを表示しファイルを選択する
$Dialog = New-Object System.Windows.Forms.OpenFileDialog
$Dialog.Filter = "CSVファイル(*.csv) | *.csv"
if($Dialog.ShowDialog() -eq "OK"){
$TextBoxFilePath.Text = $Dialog.FileName
}
}
# OKボタンをクリック時の動作
$ButtonOK.add_click{
#ファイルパスが入力されていないときは背景を黄色にする
if($TextBoxFilePath.text -eq ""){
$TextBoxFilePath.BackColor = "yellow"
}else{
$Form.DialogResult = "OK"
}
}
Start-Transcript $ExecuteLog
# フォームを表示し処理が完了したら結果を返す
$FormResult = $Form.ShowDialog()
if($FormResult -eq "OK"){
$IPaddressList = $TextBoxFilePath.Text
# 調査結果出力ファイル名
$ResultFile = ( "\Reverselookup_"+$date+"_"+$time+".csv" )
# 調査結果出力フォルダとファイル名のマージ
$Result = Join-Path $ResultFolder $ResultFile
echo $IPaddressList"の逆引きを開始します。この処理は数分ほどかかる場合があります。調査中にPowershellのウィンドウのサイズ変更をしないでください。"
###進捗表示用###
echo "IPアドレス数取得中"
$GetIPList = Import-CSV $IPaddressList
$IPCount = $GetIPList.Length
$counter = 0
echo ("ユーザ数="+$IPCount)
echo "調査開始"
echo ""
$denominator = "/"+[string]$IPCount
ForEach($a in $GetIPList){
$counter ++;
Write-Progress -activity "進捗状況" -status $counter$denominator -percentComplete ($counter / $IPCount * 100)
if( $a.IPaddress -eq ""){
} else {
$CSVdata = New-Object PSObject | Select-Object IPaddress,Result,QueryType,Server,NameHost,Name,Type,CharacterSet,Section,DataLength,TTL
try{
$Item = Resolve-DnsName $a.IPaddress -ErrorAction Stop
$CSVdata.IPaddress = $a.IPaddress
$CSVdata.Result = "OK"
$CSVdata.QueryType = $Item.QueryType
$CSVdata.Server = $Item.Server
$CSVdata.NameHost = $Item.NameHost
$CSVdata.Name = $Item.Name
$CSVdata.Type = $Item.Type
$CSVdata.CharacterSet = $Item.CharacterSet
$CSVdata.Section = $Item.Section
$CSVdata.DataLength = $Item.DataLength
$CSVdata.TTL = $Item.TTL
$CSVdatas += $CSVdata
}
catch{
$errorMSG = $error[0] | Select-Object -First 1
$CSVdata.IPaddress = $a.IPaddress
$CSVdata.Result = "NG:"+$errorMSG
$CSVdata.QueryType = ""
$CSVdata.Server = ""
$CSVdata.NameHost = ""
$CSVdata.Name = ""
$CSVdata.Type = ""
$CSVdata.CharacterSet = ""
$CSVdata.Section = ""
$CSVdata.DataLength = ""
$CSVdata.TTL = ""
$CSVdatas += $CSVdata
}
}
}
$CSVdatas | Export-CSV $Result -Encoding Default -NoTypeInformation
Invoke-item $Result
} else {
echo "操作はキャンセルされました"
}
Stop-Transcript
実行イメージ
注意点と補足
- PowerShellが実行可能な環境である必要があります。
- Windows 7 / Windows Server 2008 R2 以前の環境では、Resolve-DnsName が使えません。ので利用できません。
改版履歴
2021/02/09 初版公開
コメント