# ssdpscan.ps1 - Multicast SSDP-Discovery # [CmdletBinding()] param ( $mcastip = "192.168.178.255", $sourceudpport = 0, $remoteudpport = 1900, $timeout = 5000 ) Write-Verbose "Multicast SSDP-Discovery Start" Write-Verbose "Create UDP-Client" $udpClient = new-Object system.Net.Sockets.Udpclient($sourceudpport) Write-Host "using UDP SourcePort: $($udpclient.client.localendpoint.port)" Write-Verbose "Prepare Payload" [string]$buffer = "M-SEARCH * HTTP/1.1`r`nHost: 239.255.255.250:1900`r`nST: upnp:rootdevice`r`nMan: ""ssdp:discover""`r`nMX: 3`r`n`r`n" $byteBuffer = [System.Text.Encoding]::ASCII.GetBytes($Buffer) Write-Verbose "Send Multicast SSDP-Discovery Paket to $($mcastip):$($remoteudpport)" $sendbytes = $udpClient.Send($byteBuffer, $byteBuffer.length, $mcastip, $remoteudpport) if ($sendbytes -eq $byteBuffer.length) { Write-Verbose " SSDP-Discovery Paket sent" } else { Write-Error "Error sending SSDP-Discovery Paket" } Write-Verbose "Receive Multicast SSDP-Discovery Answers with ($Timeout) Sec timeout" $udpclient.Client.ReceiveTimeout = $timeout $IPEndpoint = new-object net.ipendpoint([net.ipaddress]::any, 0) do { Write-Verbose "Reading pending packets" try { $data = $udpclient.receive([ref]$IPEndpoint) } catch { Write-Verbose "No more SSDP-Discovery Pakets to process" break } Write-Verbose "Received SSDP-Discovery Paket from $($IPEndpoint.Address):$($IPEndpoint.Port)" $ssdpanswer = ([system.text.encoding]::ASCII.GetString($data)) #$result = @{} $result = New-Object PSObject $result | Add-Member -Membertype NoteProperty -Name "RemoteIPAddress" -Value $IPEndpoint.Address $result | Add-Member -Membertype NoteProperty -Name "RemotePort" -Value $IPEndpoint.Port foreach ($line in ($ssdpanswer -split "`r`n")) { Write-Verbose "Parsing Line: $($line)" $firstcolon = $line.IndexOf(":") if ($firstcolon -gt 0) { $result | Add-Member ` -Membertype NoteProperty ` -Name $line.Substring(0,$firstcolon).trim() ` -Value $line.Substring($firstcolon+1).trim() } } $result } while ($true) Write-Verbose "Close UDP-Client" $Udpclient.Close() Write-Verbose "Multicast SSDP-Discovery End"