PowerShell UPnPでデバイス検索を行うためのM-SEARCH例

PowerShell

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のコードブロック形式に変更しました。
  • 追加スクリプトの実行手順、前提条件、および期待される出力例を追加しました。

文書情報

記事タイトル
PowerShell UPnPでデバイス検索を行うためのM-SEARCH例
作成日
更新日
Source URL
https://papanda925.com/?p=2473

ライセンス: 本記事のうち、当サイトが権利を有する本文・自作図表は、特記なき限り CC BY 4.0 で利用できます。生成AIを活用して作成・編集した内容を含みます。コードについて、別途ライセンス表示またはリンク先GitHubリポジトリのライセンスがある場合は、その条件を優先します。引用・第三者資料・画像・商標等は本ライセンスの対象外です。 利用ポリシー

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