PowerShellを使用して、UPnP(Universal Plug and Play)機器を探索するためのM-SEARCHメッセージをマルチキャスト送信し、レスポンスを受信するスクリプトの実行例です。
この記事でできること
同一ローカルネットワーク(セグメント)内に存在するUPnP対応機器(ルーター、ネットワークプリンター、NAS、スマート家電など)をPowerShellから検出し、デバイスから返される応答(IPアドレスやデバイス情報)を確認できます。
前提条件
- Windows PowerShell 5.1 または PowerShell 7以降
- ローカルネットワーク(同一サブネット)内でマルチキャスト通信(SSDP / ポート1900)がブロックされていないこと
M-SEARCH実行スクリプト
以下のスクリプトをPowerShellコンソールまたはスクリプトファイルとして実行します。
# Define the M-SEARCH message
$searchMessage = "M-SEARCH * HTTP/1.1`r`n" +
"Host: 239.255.255.250:1900`r`n" +
"ST: upnp:rootdevice`r`n" +
"Man: ssdp:discover`r`n" +
"MX: 3`r`n" +
"`r`n"
# Create a UDP client
$client = New-Object System.Net.Sockets.UdpClient
# Bind the client to the local endpoint
$localEP = New-Object System.Net.IPEndPoint([System.Net.IPAddress]::Any, 0)
$client.Client.Bind($localEP)
# Set the multicast TTL to 1 (for local network only)
$client.Client.SetSocketOption([System.Net.Sockets.SocketOptionLevel]::IP, [System.Net.Sockets.SocketOptionName]::MulticastTimeToLive, 1)
# Join the multicast group
$multicastAddress = [System.Net.IPAddress]::Parse("239.255.255.250")
$client.JoinMulticastGroup($multicastAddress)
# Send the M-SEARCH message to the multicast address
$remoteEP = New-Object System.Net.IPEndPoint($multicastAddress, 1900)
$bytes = [System.Text.Encoding]::ASCII.GetBytes($searchMessage)
$client.Send($bytes, $bytes.Length, $remoteEP)
# Receive responses from the UPnP devices
$timeout = 5000 # 5 seconds
$startTime = [System.DateTime]::Now
while (([System.DateTime]::Now - $startTime).TotalMilliseconds -lt $timeout) {
if ($client.Available -gt 0) {
$remoteEP = New-Object System.Net.IPEndPoint([System.Net.IPAddress]::Any, 0)
$responseBytes = $client.Receive([ref]$remoteEP)
$responseMessage = [System.Text.Encoding]::ASCII.GetString($responseBytes)
Write-Host "Response received from $($remoteEP.Address):`n$responseMessage`n"
}
}
# Close the UDP client
$client.Close()
実行手順と期待される結果
上記コードを実行すると、約5秒間ネットワークからのレスポンスを待機します。機器が存在する場合、以下のようなHTTPヘッダー形式の応答がコンソールに表示されます。
Response received from 192.168.1.1:
HTTP/1.1 200 OK
CACHE-CONTROL: max-age=1800
ST: upnp:rootdevice
USN: uuid:...::upnp:rootdevice
EXT:
SERVER: Linux/... UPnP/1.0 ...
LOCATION: http://192.168.1.1:49152/gatedesc.xml
トラブルシューティング・注意事項
- 何も応答がない場合: Windowsのファイアウォール(またはセキュリティ対策ソフト)がUDPポート1900のマルチキャスト通信をブロックしている可能性があります。プライベートネットワークプロファイルに変更するか、ルールを確認してください。
- 仮想環境・WSLの場合: ホストOSとブリッジ接続またはNAT接続の構成によっては、マルチキャストパケットが正しくルーティングされないことがあります。
この記事の更新履歴
この記事は、生成AIを活用した自動レビュー・更新フローにより内容を見直し、必要な修正を反映しています。
2026年9月12日
- 変更M-SEARCHスクリプトのプレーンテキスト表現を見やすいWordPressのコードブロック形式に変更しました。
- 追加スクリプトの実行手順、前提条件、および期待される出力例を追加しました。
