如何远程获取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
相关产品推荐
相关产品推荐

