はじめに
自宅や小規模オフィスのネットワーク管理に役立つ、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
}
スクリプトの解説
主要な機能
- IEEE OUIデータベースの自動ダウンロードと処理
スクリプト初回実行時に、IEEEのウェブサイトからOUI(Organizationally Unique Identifier)データベースをダウンロードし、検索しやすい形式に変換します。 - ネットワークスキャン
指定したIPアドレス範囲に対してPingを送信し、応答のあったホストを検出します。 - MACアドレス収集
ARPテーブルから各デバイスのMACアドレスを取得します。 - ベンダー情報の照会
MACアドレスの先頭6桁(OUI部分)を使って、デバイスの製造元を特定します。 - 結果のエクスポート
収集した情報を見やすい表形式で表示し、CSVファイルとしても保存します。
パラメータ設定
スクリプトは以下のパラメータをカスタマイズできます。
- OutputPath: 結果を出力するCSVファイルのパス
- OuiDatabasePathOUI: データベースを保存するパス
- NetworkPrefix: スキャンするネットワークのプレフィックス(例:192.168.1.)
- StartIP: スキャンを開始するIPアドレスの最後の数字
- EndIP: スキャンを終了するIPアドレスの最後の数字
使用方法
基本的な実行方法
- スクリプトをダウンロードして任意の場所に保存します(例:
network_scanner.ps1
) - PowerShellを管理者権限で起動
- スクリプトのあるディレクトリに移動
- 以下のコマンドを実行
.\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"
実行結果
スクリプトを実行すると、以下のような結果が表示されます。
- まず、OUIデータベースのダウンロードと処理状況
- スキャンの進捗状況(パーセンテージ表示)
- 検出されたデバイスごとのIP、MAC、ベンダー、ホスト名
- 最後に、検出されたデバイスの総数と結果のサマリー
また、指定したパスに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インターフェイスの追加、既知のデバイスリストとの照合、などの機能を追加していきます。
以上です。
コメント