为什么不使用PowerShell / COM从UPnP GetExternalIPAddress查询返回外部IP?

时间:2015-12-13 03:42:49

标签: powershell com upnp

我正在尝试使用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 = @('')并得到相同的结果。

我的语法错了还是我的期望错了?也许是因为外部IP没有改变,我在$ xip中什么都没得到?

请注意

$wanconnectservice.QueryStateVariable('ExternalIPAddress')

确实返回当前地址 - 但这是缓存的。由于ExternalIPAddress是一个偶数,因此没有wireshark活动 如以下文档中所述的变量: https://msdn.microsoft.com/en-us/library/windows/desktop/aa382244(v=vs.85).aspx

1 个答案:

答案 0 :(得分:1)

好吧,我很尴尬发布这个,但解决方案非常简单:

$xip = **$null**
$wanconnectservice.InvokeAction('GetExternalIPAddress', @(), [ref]$xip)
$xip