是否可以使用powershell中的QueryHistory查询远程计算机上的windows更新

是否可以使用powershell中的QueryHistory查询远程计算机上的windows更新,windows,powershell,updates,Windows,Powershell,Updates,在有人思考之前,嘿,这个问题很容易回答(=>是的…) 请继续阅读… 我知道,我们可以使用(例如)以下代码从远程计算机获取“Microsoft.Update.Session”的实例 [activator]::CreateInstance([type]::GetTypeFromProgID("Microsoft.Update.Session",$ComputerName)) 这适用于其他操作,如搜索已安装的更新IsInstalled=0 要获得所有更新的完整列表(也待定等),互联网上甚至在这里都有

在有人思考之前,嘿,这个问题很容易回答(=>是的…) 请继续阅读…

我知道,我们可以使用(例如)以下代码从远程计算机获取
“Microsoft.Update.Session
”的实例

[activator]::CreateInstance([type]::GetTypeFromProgID("Microsoft.Update.Session",$ComputerName))
这适用于其他操作,如搜索已安装的更新
IsInstalled=0

要获得所有更新的完整列表(也待定等),互联网上甚至在这里都有大量的示例

他们都写信来做下面的事情

$Session = [activator]::CreateInstance([type]::GetTypeFromProgID("Microsoft.Update.Session",$ComputerName))
$Searcher = $Session.CreateUpdateSearcher()
$TotalUpdatesCount = $Searcher.GetTotalHistoryCount()
$TotalUpdates = $Searcher.QueryHistory(0, $TotalUpdatesCount)
而且它似乎正在工作,因为没有错误。。。。我们有一个很好的更新列表

我的问题是,
QueryHistory(int,int)
返回的结果总是一样的。。。无论我在
CreateInstance(…GetTypeFromProgID(…,$ComputerName))
部分输入了什么
$ComputerName

在所有提供示例的站点上,没有人提到这一点,我相信他们都在本地使用了代码
,因为在该范围内,它返回了正确的值

在深入调查并阅读了MSDN之后,我在


总之呢,


我的问题是:是否可以在Powershell中使用QueryHistory来获取远程计算机上的更新列表
(无需调用…需要PSRemoting…/或psexec等工具)
,如果可以,如何实现?

这里也有同样的问题。我仍然无法理解,但我想出的最后一种方法是:

  • 用运行QueryHistory所需的代码编写ps1脚本
  • 编写另一个ps1脚本,使用

    Invoke-WmiMethod -class Win32_process -name Create -ArgumentList $cmd_command_string -Computername $computerName -erroraction Stop -Credential $credential
    
  • 这是
    $cmd\u command\u string
    :它基本上打开一个启动powershell的cmd

    $cmd_command_string="cmd /C powershell.exe -EncodedCommand " + $ps_command_stringEncoded + " >> C:\Windows\output.log"
    
  • 现在编写代码,读取您编写的第一个ps1,将其放入字符串并在base64中编码(这就是上面代码块中的
    $ps\u command\u stringEncoded
  • 等待进程结束,然后检索输出文件
  • 对我来说似乎是合法的,但不知怎么的,我不能让它工作。如果有人想尝试一下


    编辑:我在远程计算机上复制了一个VBS脚本,从该脚本调用QueryHistory,在文件中写入输出,然后检索回远程文件。脏,但它可以工作。

    您想在不使用PSRemoting的情况下远程运行PowerShell代码吗?这就像问如何不用锤子敲钉子一样。。。有很多选择,但如果你不想使用正确的工具来完成这项工作,它们将是丑陋的解决方案。我一直在寻找一种方法来做完全相同的事情。但在任何地方,Invoke命令似乎都是go-to方法。[一直在开发一个名为Windows Patching Assistant()的工具,它直接需要一个比这个更好的方法。]。无论您想在哪里配置WinRM(PSremoting所需的)并不总是可行或允许的(可能是出于安全原因)。我认为问题在于,
    QueryHistory
    没有使用
    CreateInstance(…GetTypeFromProgID(…,$ComputerName))中给出的附加参数
    这就是为什么方法
    QueryHistory
    总是为运行该方法的本地计算机返回值。。。当然,其他方法,如
    createUpdateSarcher().Search(“IsInstalled=0”)
    确实有效。。。(没有psremoting…)
    $cmd_command_string="cmd /C powershell.exe -EncodedCommand " + $ps_command_stringEncoded + " >> C:\Windows\output.log"