为什么不使用powershell/COM从UPnP GetExternalIPAddress查询返回外部IP?
我正在尝试使用powershell查询/控制UPnP设备 我研究并提出了使用UPnP.UPnPDeviceFinder对象来获取UPnP设备列表。 现在,作为学习如何使用powershell控制upnp设备的第一步,我想获取路由器的外部地址 使用路由器包含的upnp WAN连接设备。为什么不使用powershell/COM从UPnP GetExternalIPAddress查询返回外部IP?,powershell,com,upnp,Powershell,Com,Upnp,我正在尝试使用powershell查询/控制UPnP设备 我研究并提出了使用UPnP.UPnPDeviceFinder对象来获取UPnP设备列表。 现在,作为学习如何使用powershell控制upnp设备的第一步,我想获取路由器的外部地址 使用路由器包含的upnp WAN连接设备。 我能找到的最接近的例子是VBScript 请注意,目标是了解如何以这种方式控制upnp设备-我知道有更好的方式获得外部IP 获取所有UPnP设备 $finder = New-Object -ComObject UP
我能找到的最接近的例子是VBScript 请注意,目标是了解如何以这种方式控制upnp设备-我知道有更好的方式获得外部IP 获取所有UPnP设备
$finder = New-Object -ComObject UPnP.UPnPDeviceFinder
$devices = $finder.FindByType("upnp:rootdevice", 0)
从我之前的实验中,我知道UPnP WANConnectionDevice是router 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
WAN连接设备
$routergrandchild.FriendlyName
从中获取服务对象
$wanconnectservice = $routergrandchild | % {$_.services}
检查invokeaction方法
$wanconnectservice | gm -MemberType Method invokeaction
类型名称:系统.uu-ComObject{a295019c-dc65-47dd-90dc-7fe918a1ab44}
名称成员类型定义--------------------
InvokeAction方法变量InvokeAction(字符串、变量、变量) 从上面的get成员签名和我之前的实验中,我知道getExternalPaddress操作只有1个输出参数 并且没有输入参数。因此,为输入传递一个空数组,为1输出arg传递一个[ref]
$xip = @()
$wanconnectservice.InvokeAction('GetExternalIPAddress', @(), [ref]$xip)
其结果是一个请求被发送到路由器,路由器用externalip正确响应(由wireshark确认)
我还希望返回一个S_OK,并让$xip包含externalip字符串。
我得到的是没有响应(也没有错误),并且$xip保持不变。
我尝试设置$xip=@(“”),得到了相同的结果
我的语法错了还是我的期望错了?也许是因为外部IP没有改变,我在$xip中什么也得不到?
注意
$wanconnectservice.QueryStateVariable('ExternalIPAddress')
返回当前地址-但这是缓存的。没有wireshark活动,因为ExternalPaddress是一个事件
文件中注明的变量:
好吧,我很不好意思发表这篇文章,但解决方案非常简单:
$xip = **$null**
$wanconnectservice.InvokeAction('GetExternalIPAddress', @(), [ref]$xip)
$xip
好吧,我很不好意思发表这篇文章,但解决办法很简单:
$xip = **$null**
$wanconnectservice.InvokeAction('GetExternalIPAddress', @(), [ref]$xip)
$xip