powershell - 使用 PowerShell 获取上次 Windows 更新安装日期

标签 powershell vbscript windows-update

我正在尝试编写一个 PowerShell 脚本,该脚本将查询 Active Directory 中的所有服务器并查看应用 Windows 更新的最后日期。

我遇到了一些麻烦,所以为了完成它,我创建了两个脚本,一个在 Powershell 中用于获取服务器,另一个在 VBScript 中用于查询最后日期。我发现了一个这个 Powershell module这允许我查询上次安装日期,但速度非常慢,尤其是在远程服务器上。

这是PS代码:

Get-ADComputer -Filter 'OperatingSystem -like "*Server*"' -Properties * |
Select-Object Name | Sort-Object Name |
ForEach-Object {
    Get-WUHistory -ComputerName $_.Name | Sort-Object Date,ComputerName -Descending |
    Select-Object -First 1
}

它太慢了,几乎无法使用。

我有一些 VBScript,我拼凑在一起,速度要快得多。见下文:
On Error Resume Next
Set fso = CreateObject("Scripting.FileSystemObject")
Set file = fso.OpenTextFile ("servers.csv", 1)
server = ""

Do Until file.AtEndOfStream
  line = file.Readline
  server = line
  'wscript.echo server
  Set objSession = CreateObject("Microsoft.Update.Session", server)
  If Err.Number <> 0 Then
    'WScript.Echo server & " Error: " & Err.Number & " Error (Hex): " & Hex(Err.Number) & " Source: " &  Err.Source & " Description: " &  Err.Description
    WScript.Echo server & " Communications Error"
    Err.Clear
  Else
      Set objSearcher = objSession.CreateUpdateSearcher
      Set colHistory = objSearcher.QueryHistory(1, 1)
      For Each objEntry in colHistory
        Wscript.Echo server & " " & objEntry.Date
      Next
  End If
Loop

file.Close

有没有一种简单的方法可以将 VBScript 的速度提升到 Powershell 代码中?

如果有人感兴趣,这是有效的 Powershell 代码(再次修改):
$ErrorActionPreference= 'silentlycontinue'
Get-ADComputer -Filter 'OperatingSystem -like "*Server*"' -Properties * | Select-Object Name |
ForEach-Object {
    If (Test-Connection $_.Name -Count 1){
        Get-HotFix -ComputerName $_.Name | Sort-Object InstalledOn -Descending | Select-Object -First 1 
    }
    else {
        Write-host $_.Name " Connection Error"
    }
} |
Sort-Object InstalledOn

最佳答案

Tim Ferrill 已经为您提供了答案,但为了记录,您可以做这样的事情

$ScriptBlock = {
    $hash=@{}
    $Session = New-Object -ComObject Microsoft.Update.Session
    $Searcher = $Session.CreateUpdateSearcher()
    $hash[$env:Computername] = $Searcher.QueryHistory(1,1) | select -ExpandProperty Date
    $hash
}

Invoke-Command -ComputerName $serverlist -ScriptBlock $ScriptBlock

这会让你像
Name                    Value
----                    -----
Server1                 5/16/2014 2:11:42 PM
Server2                 4/14/2014 1:55:03 PM
Server3                 5/6/2014 5:36:51 PM

关于powershell - 使用 PowerShell 获取上次 Windows 更新安装日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24039325/

相关文章:

html - Powershell 更改 RTF 文档并另存为 RTF 文档

amazon-web-services - 在后台作业完成之前,带有Powershell的SSM发送命令不会完成

vbscript - 如何在 vbscript 中使用剪贴板?

Windows 更新后 Tomcat 无法启动

powershell - 外主机 - 寻呼错误 "The method or operation is not implemented. "(ISE)

windows - Get-ScheduledTask 命令在 Windows Server 2008 R2 中不起作用

internet-explorer - Css 在 IE 兼容性 View 中不工作

vbscript - vbscript删除包含带有进度条的多个文件的文件夹

c++ - 应用程序不再加载 Windows 10 Build 1803(2018 年 4 月更新)

android - Windows 10 中的 Genymotion 问题