Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么不使用powershell/COM从UPnP GetExternalIPAddress查询返回外部IP?_Powershell_Com_Upnp - Fatal编程技术网

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

为什么不使用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

我正在尝试使用powershell查询/控制UPnP设备

我研究并提出了使用UPnP.UPnPDeviceFinder对象来获取UPnP设备列表。 现在,作为学习如何使用powershell控制upnp设备的第一步,我想获取路由器的外部地址 使用路由器包含的upnp WAN连接设备。
我能找到的最接近的例子是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