【问题标题】:Get the last Windows Update install date using PowerShell使用 PowerShell 获取上次 Windows 更新安装日期
【发布时间】:2014-07-25 05:09:25
【问题描述】:

我正在尝试编写一个 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

【问题讨论】:

  • 我看不出 VBS 代码在多大程度上与 PowerShell 代码相媲美? VBS 遍历 csv 文件的行,每行只调用一次 QueryHistory,而 Powershell 版本获取包含在排序列表中的每台计算机的历史记录,该排序列表由包含 LIKE 的排序属性查询返回,按日期排序。那是一个嵌套的子查询。当然,这需要更多时间。如果你在 VBS 中做同样的事情,我猜它会和 PowerShell 版本一样慢。
  • @TheBlastOne PowerShell 脚本的缓慢来自 PS 模块。在 ISE 中运行,我可以看到读取服务器更新历史的模块的进度条,这需要很长时间。
  • 我的工作代码看起来可以工作,但它只输出有连接错误的主机。其他结果去哪儿了?我没有看到它们在任何地方输出。

标签: powershell vbscript windows-update


【解决方案1】:

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

【讨论】:

  • 嗯。我会看看这个
【解决方案2】:

Get-HotFix 是否满足您的需求?

Get-HotFix -ComputerName $_.Name | Measure-Object InstalledOn -Maximum

您的性能问题可能来自Get-ADComputer。我会做一些故障排除,看看是哪一块给你带来了问题。

【讨论】:

  • 如果您的意思是 Get-ADComputer,那么很快。缓慢肯定来自Get-WUHistory。我现在正在尝试获取修补程序。
  • 是的,那个。我把那杯咖啡放在哪里了?
  • 这以合理的速度运行。将我修改后的脚本放入问题中。
  • Get-Hotfix 确实需要 Powershell 3.0 或更高版本,但这是一个足够公平的权衡,并且作为奖励,它满足了许多场景的要求,其中粗略的单线就足够了。
【解决方案3】:
(get-hotfix -computername SERVERNAME | sort installedon)[-1] >> c:\file.txt

这将为您提供上次安装的日期。在您针对所有服务器名称运行输出后,我只是使用一些 excel 工作来清理输出。

从“get-help get-hotfix -full”获得该命令

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多