PowerShellで作る簡易ネットワークスキャナー

Powershell

はじめに

自宅や小規模オフィスのネットワーク管理に役立つ、PowerShellスクリプトを紹介します。
このスクリプトを使えば、同一ネットワーク上の全デバイスのMACアドレスを収集し、各デバイスのベンダー(製造元)情報も自動で取得できます。

セキュリティ診断や、「知らないデバイスが接続されていないか」のチェックにも活用できるツールです。

スクリプト

# 同一ネットワークに接続している端末のMACアドレスを収集し、ベンダー情報を取得して
# CSVファイルに保存するPowerShellスクリプト

param (
    [string]$OutputPath = "$PSScriptRoot\network_devices.csv",
    [string]$OuiDatabasePath = "$PSScriptRoot\oui_database.csv",
    [string]$NetworkPrefix = "192.168.1.",
    [int]$StartIP = 1,
    [int]$EndIP = 254
)

# OUIデータベースの初期化と作成
function Initialize-OUIDatabase {
    param ([string]$DatabasePath)
    
    Write-Host "OUIデータベースをダウンロードしています..." -ForegroundColor Cyan
    
    # IEEE OUIデータベースをダウンロード
    $ouiUrl = "http://standards-oui.ieee.org/oui/oui.txt"
    $tempFile = "$env:TEMP\oui_temp.txt"
    
    try {
        Invoke-WebRequest -Uri $ouiUrl -OutFile $tempFile
        Write-Host "ダウンロード完了" -ForegroundColor Green
    }
    catch {
        Write-Host "ダウンロード失敗: $($_.Exception.Message)" -ForegroundColor Red
        return $null
    }
    
    # OUIデータを処理してCSVに変換
    $ouiData = @()
    
    Write-Host "OUIデータベースを処理しています..." -ForegroundColor Cyan
    Get-Content -Path $tempFile | ForEach-Object {
        if ($_ -match "([0-9A-F]{6})\s+\(hex\)\s+(.+)") {
            $ouiData += [PSCustomObject]@{
                OUI = $matches[1]
                Vendor = $matches[2].Trim()
            }
        }
    }
    
    # CSVとして保存
    $ouiData | Export-Csv -Path $DatabasePath -NoTypeInformation
    Remove-Item -Path $tempFile -ErrorAction SilentlyContinue
    
    Write-Host "OUIデータベースを作成しました: $DatabasePath" -ForegroundColor Green
    return $DatabasePath
}

# MACアドレスからベンダー情報を取得する関数
function Get-MACVendor {
    param (
        [string]$MACAddress,
        [string]$DatabasePath
    )
    
    $oui = ($MACAddress -replace '[-:]', '').Substring(0, 6).ToUpper()
    $vendor = Import-Csv -Path $DatabasePath | 
              Where-Object { $_.OUI -eq $oui } | 
              Select-Object -ExpandProperty Vendor -First 1
    
    if ($vendor) {
        return $vendor
    } else {
        return "不明"
    }
}

# メイン処理開始
Write-Host "ネットワークデバイス検出ツール" -ForegroundColor Cyan
Write-Host "----------------------------" -ForegroundColor Cyan

# OUIデータベースの確認
if (-not (Test-Path -Path $OuiDatabasePath)) {
    $OuiDatabasePath = Initialize-OUIDatabase -DatabasePath $OuiDatabasePath
    if ($null -eq $OuiDatabasePath) {
        Write-Host "OUIデータベースの作成に失敗しました。処理を終了します。" -ForegroundColor Red
        exit
    }
}

# ARPテーブルをクリア
Write-Host "ARPテーブルをクリアしています..." -ForegroundColor Cyan
arp -d

Write-Host "スキャンを開始: ${NetworkPrefix}${StartIP} から ${NetworkPrefix}${EndIP}" -ForegroundColor Cyan
$activeHosts = @()

# IPスキャン実行
for ($i = $StartIP; $i -le $EndIP; $i++) {
    $ip = "${NetworkPrefix}${i}"
    $progress = [math]::Round((($i - $StartIP) / ($EndIP - $StartIP + 1)) * 100)
    Write-Progress -Activity "ネットワークスキャン" -Status "IPアドレス: $ip" -PercentComplete $progress
    
    # Ping送信
    if (Test-Connection -ComputerName $ip -Count 1 -Quiet -ErrorAction SilentlyContinue) {
        Write-Host "${ip} は応答中..." -NoNewline
        
        # MACアドレス取得
        $arpResult = arp -a $ip | Select-String '([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})'
        
        if ($arpResult) {
            $arpResult -match '([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})' | Out-Null
            $macAddress = $matches[0] -replace ':', '-'
            
            # ベンダー取得
            $vendor = Get-MACVendor -MACAddress $macAddress -DatabasePath $OuiDatabasePath
            
            # ホスト名取得
            try {
                $hostname = [System.Net.Dns]::GetHostEntry($ip).HostName
            } catch {
                $hostname = "不明"
            }
            
            # 結果追加
            $activeHosts += [PSCustomObject]@{
                IPAddress = $ip
                MACAddress = $macAddress
                Vendor = $vendor
                HostName = $hostname
                DetectedTime = Get-Date -Format "yyyy/MM/dd HH:mm"
            }
            
            Write-Host " 完了" -ForegroundColor Green
            Write-Host "  MAC: $macAddress  ベンダー: $vendor" -ForegroundColor Gray
        } else {
            Write-Host " MAC取得失敗" -ForegroundColor Red
        }
    }
}

Write-Progress -Activity "ネットワークスキャン" -Completed

# 結果表示
if ($activeHosts.Count -gt 0) {
    Write-Host "`n検出結果: $($activeHosts.Count)台" -ForegroundColor Cyan
    $activeHosts | Format-Table -AutoSize
    
    # CSV出力
    $activeHosts | Export-Csv -Path $OutputPath -NoTypeInformation -Encoding UTF8
    Write-Host "CSVファイル出力完了: $OutputPath" -ForegroundColor Green
} else {
    Write-Host "デバイスが検出されませんでした" -ForegroundColor Yellow
}

スクリプトの解説

主要な機能

  1. IEEE OUIデータベースの自動ダウンロードと処理
    スクリプト初回実行時に、IEEEのウェブサイトからOUI(Organizationally Unique Identifier)データベースをダウンロードし、検索しやすい形式に変換します。
  2. ネットワークスキャン
    指定したIPアドレス範囲に対してPingを送信し、応答のあったホストを検出します。
  3. MACアドレス収集
    ARPテーブルから各デバイスのMACアドレスを取得します。
  4. ベンダー情報の照会
    MACアドレスの先頭6桁(OUI部分)を使って、デバイスの製造元を特定します。
  5. 結果のエクスポート
    収集した情報を見やすい表形式で表示し、CSVファイルとしても保存します。

パラメータ設定

スクリプトは以下のパラメータをカスタマイズできます。

  • OutputPath: 結果を出力するCSVファイルのパス
  • OuiDatabasePathOUI: データベースを保存するパス
  • NetworkPrefix: スキャンするネットワークのプレフィックス(例:192.168.1.)
  • StartIP: スキャンを開始するIPアドレスの最後の数字
  • EndIP: スキャンを終了するIPアドレスの最後の数字

使用方法

基本的な実行方法

  1. スクリプトをダウンロードして任意の場所に保存します(例:network_scanner.ps1
  2. PowerShellを管理者権限で起動
  3. スクリプトのあるディレクトリに移動
  4. 以下のコマンドを実行
    .\network_scanner.ps1

パラメータを指定して実行

特定のIPアドレス範囲をスキャンする場合は、以下のようにパラメータを指定します。

.\network_scanner.ps1 -NetworkPrefix "10.0.0." -StartIP 1 -EndIP 100

結果の出力先を変更

.\network_scanner.ps1 -OutputPath "C:\Reports\network_scan_result.csv"

実行結果

スクリプトを実行すると、以下のような結果が表示されます。

  1. まず、OUIデータベースのダウンロードと処理状況
  2. スキャンの進捗状況(パーセンテージ表示)
  3. 検出されたデバイスごとのIP、MAC、ベンダー、ホスト名
  4. 最後に、検出されたデバイスの総数と結果のサマリー

また、指定したパスにCSVファイルが生成され、以下の情報が含まれます。

  • IPアドレス
  • MACアドレス
  • ベンダー名
  • ホスト名(取得できた場合)
  • 検出日時

<実行結果のサンプル>

技術的なポイント

arpコマンドの活用

このスクリプトでは、ネットワークデバイスのMACアドレスを取得するために、Windowsの 「arp」コマンドを利用しています。まず「arp -d」でARPテーブルをクリアし、その後Pingを送信することで、新しいARPエントリを生成させています。

arp -d
# Pingで応答を確認後
arp -a $ip | Select-String '([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})'

正規表現によるMACアドレス抽出

MACアドレスは正規表現を使って抽出しています。

$arpResult -match '([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})' | Out-Null
$macAddress = $matches[0] -replace ':', '-'

OUIデータベースの処理

IEEEのOUIデータベースは特殊な形式になっているため、以下のように正規表現を使って必要な情報を抽出します。

if ($_ -match "([0-9A-F]{6})\s+\(hex\)\s+(.+)") {
    $ouiData += [PSCustomObject]@{
        OUI = $matches[1]
        Vendor = $matches[2].Trim()
    }
}

最後に

特別なツールをインストールすることなく、Windows環境だけでネットワークデバイスの把握ができます。小規模ネットワークの管理やセキュリティチェックに使用してもらえたら幸いです。

今後は、ポートスキャン機能、GUIインターフェイスの追加、既知のデバイスリストとの照合、などの機能を追加していきます。

以上です。

コメント

タイトルとURLをコピーしました