You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何远程获取Windows Server 2012 R2与2016的最后更新日期?

远程获取Windows Server 2012/2016更新最后安装日期的可行方案

我明白你在远程批量检查Windows Server 2012和2016的更新安装日期时遇到的棘手问题——本地能用的Windows Update COM API没法远程调用,WMI查询又拿不到足够完整的信息。下面给你几个经过验证的统一实现思路,应该能解决你的困扰:

方案1:PowerShell远程会话+本地WU API调用

因为COM API只能本地执行,但我们可以通过PowerShell的远程会话(PSRemoting)在目标服务器上本地调用WU API,这样就能获取和本地执行一样完整的更新信息,完美绕开远程调用的限制。

示例代码:

$servers = "Server2012R01", "Server201601"
foreach ($server in $servers) {
    $lastUpdateDate = Invoke-Command -ComputerName $server -ScriptBlock {
        # 初始化Windows Update会话并获取更新历史
        $updateSession = New-Object -ComObject Microsoft.Update.Session
        $updateSearcher = $updateSession.CreateUpdateSearcher()
        $historyCount = $updateSearcher.GetTotalHistoryCount()
        
        if ($historyCount -gt 0) {
            # 筛选成功安装的更新,按日期倒序取最新一条
            $latestUpdate = $updateSearcher.QueryHistory(0, $historyCount) | 
                           Where-Object { $_.ResultCode -eq 2 } | 
                           Sort-Object Date -Descending | Select-Object -First 1
            $latestUpdate.Date
        } else {
            Write-Output "无更新历史记录"
        }
    }
    Write-Host "$server 最后安装更新日期: $lastUpdateDate"
}

注意事项:

  • 确保目标服务器已开启PSRemoting:在目标机上执行Enable-PSRemoting -Force;
  • 你需要拥有目标服务器的本地管理员或域管理员权限;
  • 防火墙需允许WinRM端口(默认HTTP 5985、HTTPS 5986)。

这个方法对2012和2016版本都完全适用,能拿到和本地调用一致的完整更新元数据。

方案2:优化WMI查询获取完整更新信息

你之前用WMI结合Windows Update Root的方式可能查询范围太窄,试试扩展WMI的查询条件,结合两个不同的WMI类来获取更全面的信息:

针对Windows Server 2012/2016的WMI查询示例

$servers = "Server2012R01", "Server201601"
foreach ($server in $servers) {
    $lastUpdateDate = Invoke-Command -ComputerName $server -ScriptBlock {
        # 从Win32_QuickFixEngineering获取KB补丁安装信息
        $latestQFE = Get-WmiObject -Class Win32_QuickFixEngineering | 
                     Sort-Object InstalledOn -Descending | Select-Object -First 1
        
        # 从MDM类获取完整Windows Update历史(2012 R2及以上支持)
        try {
            $latestWUHistory = Get-WmiObject -Namespace root\cimv2\mdm\dmmap -Class MDM_WindowsUpdateUpdateHistory -ErrorAction Stop |
                               Sort-Object LastModifiedTime -Descending | Select-Object -First 1
        } catch {
            $latestWUHistory = $null
        }

        # 优先取更准确的Windows Update历史日期
        if ($latestWUHistory) {
            $latestWUHistory.LastModifiedTime
        } elseif ($latestQFE) {
            $latestQFE.InstalledOn
        } else {
            Write-Output "无可用更新记录"
        }
    }
    Write-Host "$server 最后安装更新日期: $lastUpdateDate"
}
  • Win32_QuickFixEngineering:记录了大部分KB补丁的安装信息,但可能遗漏功能更新等非KB类更新;
  • MDM_WindowsUpdateUpdateHistory:在2012 R2及以上版本可用,能获取所有类型Windows更新的完整历史,包括功能更新、质量更新的安装时间。

方案3:使用PSWindowsUpdate模块简化查询

如果允许在目标服务器上部署PowerShell模块,PSWindowsUpdate模块能极大简化更新历史的查询工作,而且本质也是通过PSRemoting在目标机本地执行,兼容2012和2016版本。

你只需要手动将模块文件复制到目标服务器的C:\Program Files\WindowsPowerShell\Modules目录,然后执行以下代码:

$servers = "Server2012R01", "Server201601"
foreach ($server in $servers) {
    $lastUpdateDate = Invoke-Command -ComputerName $server -ScriptBlock {
        # 获取成功安装的更新历史,取最新一条的日期
        Get-WUHistory | Where-Object { $_.ResultCode -eq 2 } | 
        Sort-Object Date -Descending | Select-Object -First 1 -ExpandProperty Date
    }
    Write-Host "$server 最后安装更新日期: $lastUpdateDate"
}

这个模块封装了WU API的复杂调用,返回的信息更直观,还支持批量查询、筛选特定类型更新等扩展功能。


内容的提问来源于stack exchange,提问作者Brian Deragon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:45:46