我正在尝试使用powershell来查询/控制UPnP设备。
我研究并想出使用UPnP.UPnPDeviceFinder对象来获取upnp设备列表。 现在,作为学习如何使用PowerShell控制upnp设备的第一步,我想获得路由器的外部地址 使用我的路由器包含的upnp WANConnectionDevice 我能找到的最接近的例子是https://msdn.microsoft.com/en-us/library/windows/desktop/aa381230(v=vs.85).aspx的VBScript 请注意,目标是了解如何以这种方式控制upnp设备 - 我知道有更好的方法来获取外部IP。
获取所有UPnP设备
$finder = New-Object -ComObject UPnP.UPnPDeviceFinder
$devices = $finder.FindByType("upnp:rootdevice", 0)
从我之前的实验中我知道UPnP WANConnectionDevice是路由器COM对象的孙子
$router = $devices | where friendlyname -eq RT-N66U
$routerchild = $router | % {$_.Children} # simple $router.Children syntax does not work, methods and properties are not available.
$routergrandchild = $routerchild | % {$_.Children}
这表明$ routergrandchild是WANConnectionDevice
$routergrandchild.FriendlyName
WANConnectionDevice
从此
获取服务对象$wanconnectservice = $routergrandchild | % {$_.services}
检查invokeaction方法
$wanconnectservice | gm -MemberType Method invokeaction
TypeName:System .__ ComObject#{a295019c-dc65-47dd-90dc-7fe918a1ab44}
名称成员类型定义
---- ---------- ----------
InvokeAction方法变体InvokeAction(string,Variant,Variant)
从上面的get-member签名和我之前的实验中我知道GetExternalIPAddress操作只有1个输出arg 没有输入参数。因此传递一个空数组用于输入,对于1输出arg传递一个[ref]
$xip = @()
$wanconnectservice.InvokeAction('GetExternalIPAddress', @(), [ref]$xip)
结果是请求被发送到路由器并且它与externalip正确响应(由wireshark确认) 我还希望返回一个S_OK并让$ xip包含externalip字符串。 我得到的是没有响应(也没有错误)和$ xip没有变化。 我尝试设置$ xip = @('')并得到相同的结果。
请注意
$wanconnectservice.QueryStateVariable('ExternalIPAddress')
确实返回当前地址 - 但这是缓存的。由于ExternalIPAddress是一个偶数,因此没有wireshark活动 如以下文档中所述的变量: https://msdn.microsoft.com/en-us/library/windows/desktop/aa382244(v=vs.85).aspx
答案 0 :(得分:1)
好吧,我很尴尬发布这个,但解决方案非常简单:
$xip = **$null**
$wanconnectservice.InvokeAction('GetExternalIPAddress', @(), [ref]$xip)
$xip