【问题标题】:How do I run Invoke-WebRequest cmdlet from third party program?如何从第三方程序运行 Invoke-WebRequest cmdlet?
【发布时间】:2018-01-16 15:19:47
【问题描述】:

我一直在尝试通过游戏控制面板 TCAdmin 使其工作。

$ModPg1 = Invoke-WebRequest "http://steamcommunity.com/sharedfiles/filedetails/?id=731604991"

$ModVer1 = ($ModPg1.ParsedHtml.getElementsByTagName('div') | Where{ $_.className -eq 'detailsStatRight' } ).innerText | Select -Last 1

如果我通过 TCAdmin(或任务调度程序)之类的程序运行此 cmdlet,我会收到以下错误......

Invoke-WebRequest :无法解析响应内容,因为 Internet Explorer 引擎不可用,或者 Internet Explorer 的首次启动配置不完整。指定 UseBasicParsing 参数,然后重试。

Explorer 已安装并设置。如果我手动运行该脚本,它就可以正常工作。

我的猜测是有一种方法可以让 TCAdmin 以与 Windows 用户相同的方式运行脚本。

无法找到几乎如此简单的方法来抓取正在寻找的信息。

【问题讨论】:

  • 如果您遵循错误消息中的建议并使用 -UseBasicParsing 开关参数会发生什么?
  • 如果我使用基本解析,“.ParsedHtml.getElementsByTagName”这将不再有效。

标签: powershell


【解决方案1】:

至于这个……

让 TCAdmin 以与 Windows 用户相同的方式运行脚本。

对于要以用户身份运行的任何应用,必须在要运行代码的主机上使用该用户配置文件。您不能在主机上作为另一个用户上下文本机运行 PoSH。这不是 PoSH 问题,而是 Windows 用户主体安全边界。有一些工具可以让你做到这一点。例如 SysInternal PSExec 和 AutoIT。然而,如前所述,错误是非常具体的。尚未创建 Internet Explorer 的用户配置文件,并且仅当您至少使用 IE 一次时才会发生这种情况。

因此,正如 Adam 指出的那样,使用设置错误消息状态来使用或使用您的代码来启动 IE 至少一次。

$SomeUrl = 'https://stackoverflow.com' 
$ie = New-Object -com internetexplorer.application
$ie.visible = $true
$ie.navigate($SomeUrl)
while ($ie.Busy -eq $true) { Start-Sleep -Seconds 1 } # Wait for IE to settle.

同样,如果尝试在另一个用户的上下文中运行它,上面的两个工具可以让你到达那里,但你仍然需要启动 IE 才能获得它的配置文件。

【讨论】:

  • 非常感谢您的快速回复!我试图对您的答案进行投票,但我仍处于 Noob 状态。此外,您 100% 正确,因为问题是 Windows 用户权限。尽管解决方案比我想象的要简单得多。我曾考虑尝试找到一种不使用“ParsedHtml”(使用 -usebasicparsing 参数)来解析该信息的方法,但我能够找到一种方法让 TCAdmin 在可以访问“ Internet Explorer 引擎”。它们现在可以在终端或 Web 面板上正常运行。再次感谢您的回复!
  • 不用担心。很高兴它成功了。即使您尚未加入投票队列,您也需要将其标记为已回答。 8}
猜你喜欢
  • 1970-01-01
  • 2020-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 2021-11-07
相关资源
最近更新 更多