是否可以使用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"