使用Invoke-WebRequest从打印机获取XML

时间:2017-04-13 15:00:11

标签: xml powershell

我无法让Invoke-WebRequest遵循重定向的网址。

有问题的网址是Konica Bizhub打印机的管理页面,我正在尝试检索其状态信息。

据我所知,重定向流程如下:

access=SYS_INF使用具有只读访问权限的通用用户帐户记录Web会话(对我来说没问题)。

这是我现在正在使用的代码:

$userAgent = [Microsoft.PowerShell.Commands.PSUserAgent]::Chrome
$url = "http://1.1.1.1/wcd/index.html?access=SYS_INF"
$req = Invoke-WebRequest -Uri $url -UserAgent $userAgent
write-host $req

产生这个输出:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<HTML lang="en">
<HEAD>
<TITLE></TITLE>
<meta http-equiv="Expires" content="0">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<meta content="text/javascript" http-equiv="Content-Script-Type">
<link rel="stylesheet" type="text/css" href="/wcd/default.css">
<script type="text/javascript" src="/wcd/init.js"></script>
<noscript>
<meta http-equiv="refresh" content="0; URL=/wcd/js_error.xml">
</noscript>
</HEAD>
<BODY BGCOLOR="#ffffff" LINK="#000000" ALINK="#ff0000" VLINK="#000000" onload="init('/wcd/system_device.xml','wcd','usr=S_INF;','','param=;',0);">
</BODY>
</HTML>

init('/wcd/system_device.xml...表示该页面应该加载system_device.xml页面,但它不会发生。我怀疑这不是正常的重定向,但我不知道如何让PS跟随最终的URL。

我知道access=SYS_INF需要成为第一个网址,以便用户可以登录,然后可以呈现system_device.xml。所以你不能直接跳到http://1.1.1.1/wcd/system_device.xml并以这种方式加载XML。

我还尝试将会话保存到变量并再次使用其他webrequest调用它无效:

$userAgent = [Microsoft.PowerShell.Commands.PSUserAgent]::Chrome
$url = "http://1.1.1.1"
$req = Invoke-WebRequest -Uri $url -SessionVariable session -UserAgent $userAgent
$req2 = Invoke-WebRequest -Uri $url -WebSession $session
write-host $req2

与上述类似的输出除了这条线不同: <BODY BGCOLOR="#ffffff" LINK="#000000" ALINK="#ff0000" VLINK="#000000" onload="location.replace('/wcd/index.html');" >

任何建议都将不胜感激 - 谢谢!

1 个答案:

答案 0 :(得分:0)

像您一样,我无法使用 Invoke-WebRequest 从 Konica Minolta bizhub 获取我需要的信息,而是使用 InternetExplorer.Applcation ComObject 获取我需要的详细信息并重定向到 JavaScript init。

        # Create Internet Explorer ComObject
        $ie = New-Object -ComObject InternetExplorer.Application
        
        # Save the Window Handle for later use
        $IEWindowHandle = $ie.HWND

        # Navigate to our URL in this case
        # "http://1.1.1.1/wcd/index.html?access=SYS_INF"
        $ie.Navigate2($url)

此外,如果您收到 RPC_E_DISCONNECTED,您可能需要重新连接到 IE 窗口句柄

 $ShellApp = New-Object -ComObject Shell.Application

        try 
        {
            $EA = $ErrorActionPreference; $ErrorActionPreference = 'Stop'
            $RecoveredIE = $ShellApp.Windows() | Where-Object {$_.HWND -eq $IEWindowHandle}
        } 
        catch 
        {
            # Shell.Application may not find the window immediately, sleep 500ms 
            Write-debug "Window Handle not Found, Attempting reconnect in 500ms" 
            Start-Sleep -Milliseconds 500
            try 
            {
                $RecoveredIE = $ShellApp.Windows() | Where-Object {$_.HWND -eq $IEWindowHandle}
            } 
            catch 
            {
                Write-debug "Could not reconnect InternetExplorer.Application ComObject"
                $RecoveredIE = $null
            }     
        } 
        finally 
        { 
            $ErrorActionPreference = $EA
            $ShellApp = $null
        }