当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 如何构建基本的 PowerShell Windows 更新报告

作者:精品下载站 日期:2024-12-14 20:49:16 浏览:15 分类:玩电脑

如何构建基本的 PowerShell Windows 更新报告


如果您曾经向网络上的客户端部署过 Windows 更新,您的经理可能会询问您部署了哪些 KB,以及工作站或服务器何时出现问题。不幸的是,有时内置的 WSUS 服务器报告工具可能会让您感到沮丧,并且没有强大的功能可以在 WSUS 管理 GUI 之外生成它们。你还有一个选择; PowerShell Windows 更新报告!

如何判断何时需要 PowerShell 报告

最近,一群正在验证安全漏洞扫描的经理向我寻求帮助。此漏洞扫描声称一组系统缺少特定的 Microsoft 知识库,这些知识库是最近批准、截止并在 WSUS 管理控制台中显示为已安装的知识库。

我发送了一些控制台状态的屏幕截图以及我的系统管理员回复。当时我没有多想,因为我忙于其他项目,这是一个例行要求。

大约一天过去了,又运行了另一次漏洞扫描,产生了相同的结果。管理层不相信已安装更新。由于 WSUS 时常出现问题,我开始不信任内置报告和管理控制台。我不知道更新 Windows 这么难!

为了谨慎起见,并且更加勤奋一点,我决定绕过 WSUS 管理控制台,直接进入安全漏洞扫描中显示的工作站和服务器。

集思广益 Windows 更新报告

幸运的是,安全漏洞扫描仅发现大约 4 个工作站和 12 个服务器存在这些据称缺失的 KB。因此,我使用每个主机的完全限定域名 (FQDN) 在文本文件中创建了一个简单列表。我还知道一个事实,缺失的知识库将在过去 30 天内安装,因为我刚刚完成了一个维护周期。

有了这些知识,我记下了一些伪代码来帮助我开始。这是我概述的内容:

  • 存储包含主机列表的文本文件。
  • 对于该文件中的每个主机,运行命令。
  • 该命令必须收集过去 30 天内安装的 KB。
  • 输出只需包含主机名、KB/HotFix ID 和安装日期。
  • 输出需要可读,并且只需是一个简单的文件。
  • 不需要花哨的编码,只需与 WSUS 报告显示的内容进行直观比较即可。

根据我的笔记,我很清楚我正在寻找什么以及我可能需要什么 cmdlet。主要关注点是 Get-HotFix cmdlet。此 cmdlet 查询已应用于 Windows 主机的所有修补程序(通常称为安全更新)。它可以查找 Windows 计算机上的所有或特定更新。您可以在此处阅读有关此 cmdlet 以及如何使用它的更多信息。

Get-HotFix 不支持隐式远程处理,因此我需要想出在需要报告的系统上运行此 cmdlet 的方法。 Invoke-Command 可以,并且您可以将多个值传递给 ComputerName 参数。

我已经保存了我的目标主机列表,因此我将节省一些打字时间并将这些主机存储为变量。为此,我必须分配一个变量名称并将值设为主机列表。

Get-Content 将逐行读取文本文件的内容,创建一个排序数组。我们将此数组称为$Hosts。现在我有一个命令,一些数据要提供给下一组命令,但我需要使结果数据可读且简洁。

我想在这里花点时间强调“首先过滤,最后格式化。” 。记住这一点将有助于您处理这些类型的脚本。打开 PowerShell 会话并单独运行 Get-Hotfix cmdlet 通常会生成一长串已应用于主机的更新。

PS51> Get-HotFix

Source        Description      HotFixID      InstalledBy          InstalledOn
------        -----------      --------      -----------          -----------
MACWINVM      Update           KB2693643     MACWINVM\Administ... 3/14/2019 12:00:00 AM
MACWINVM      Update           KB4100347     NT AUTHORITY\SYSTEM  2/17/2019 12:00:00 AM
MACWINVM      Update           KB4230204     NT AUTHORITY\SYSTEM  7/6/2018 12:00:00 AM
MACWINVM      Security Update  KB4287903     NT AUTHORITY\SYSTEM  7/8/2018 12:00:00 AM
MACWINVM      Security Update  KB4338832     NT AUTHORITY\SYSTEM  7/21/2018 12:00:00 AM
MACWINVM      Update           KB4338853     NT AUTHORITY\SYSTEM  7/6/2018 12:00:00 AM
MACWINVM      Update           KB4343669     NT AUTHORITY\SYSTEM  7/19/2018 12:00:00 AM
MACWINVM      Security Update  KB4343902     NT AUTHORITY\SYSTEM  8/15/2018 12:00:00 AM
MACWINVM      Update           KB4346084     NT AUTHORITY\SYSTEM  5/11/2019 12:00:00 AM
MACWINVM      Update           KB4456655     NT AUTHORITY\SYSTEM  9/12/2018 12:00:00 AM
--snip--

过滤有助于仅收集您需要的信息。

如果没有过滤数据,此时格式化是没有用的。将过滤视为您的数据类型要求,将格式化视为您希望数据显示的方式。就我的目的而言,我已经考虑好了需求。我需要在过去 30 天内安装更新。

为了进行过滤,我需要使用 Where-Object cmdlet,然后传递一些成员属性和比较运算符以及一些数学运算。为此,我将从 Get-HotFix 返回的每个对象 ($_) 并将其传递给 Where-Object 以查找所有更新安装日期大于 (-gt) 今天的日期(或每当我运行脚本时)减去 (-30) 天前的日期。这将获得我正在寻找的初始数据。

Get-HotFix | Where-Object { $_.InstalledOn -gt ((Get-Date).AddDays(-30)) }

但我想进一步过滤返回的对象及其属性。这就是 Select-Object 可以提供帮助的地方,它使我能够进一步修剪要显示的数据量,仅显示几个关键属性。

Get-HotFix | Where-Object { $_.InstalledOn -gt ((Get-Date).AddDays(-30)) } |
Select-Object -Property PSComputerName, Description, HotFixID, InstalledOn

现在我已经正确过滤了数据,现在我可以继续将结果格式化为可用的格式。为此,我会将之前的过滤结果通过管道 (|) 传输到 Format-Table -Autosize 并以我选择的文件类型输出。我需要使用 Append-ErrorAction SilentlyContinue 参数来确保每个结果都写入输出文件中的下一行,并且如果发生错误,它将不会'不会导致其他主机无法联系。

Format-Table -AutoSize |
Out-File -Encoding utf8 -FilePath '.\Recent_OS_Updates.txt' -Append -ErrorAction SilentlyContinue

我选择使用文本文件,因为我不需要任何花哨的东西。您可以更改输出以满足您的需要。我的输出看起来与此类似:

[玩转系统] 如何构建基本的 PowerShell Windows 更新报告

这是最终提出并使用的脚本:

$Hosts = Get-Content -Path '.\hosts.txt'
Invoke-Command -ComputerName $Hosts -ScriptBlock {
    Get-HotFix | Where-Object {
        $_.InstalledOn -gt ((Get-Date).AddDays(-30))
    } | Select-Object -Property PSComputerName, Description, HotFixID, InstalledOn
} | Format-Table -AutoSize |
Out-File -Encoding utf8 -FilePath '.\Recent_OS_Updates.txt' -Append -ErrorAction SilentlyContinue

对我来说,这很简单、简洁,并且提供了知识库确实已安装的证据。该报告受到管理团队的好评,且格式易于阅读。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯