我有大约 100 台服务器需要确保它们能够缓解 Spectre 和 Meltdown 的影响。好消息是,微软已经创建了一个方便的 PowerShell 命令行程序,可以检查任何 Windows 计算机的缓解状态。坏消息是,他们没有为其包含任何自定义参数,它只有通用参数。
get-speculationcontrolsettings
真正的坏消息是输出非常冗长,而且无法真正进行过滤。以下是仅来自一台服务器的输出示例:
CVE-2017-5715 的推测控制设置 [分支目标注入] 存在对分支目标注入缓解的硬件支持:错误 Windows 操作系统支持分支目标注入缓解:True Windows 操作系统对分支目标注入缓解的支持已启用:False 系统策略已禁用 Windows 操作系统对分支目标注入缓解的支持:True 由于缺乏硬件支持,Windows 操作系统对分支目标注入缓解的支持被禁用:True CVE-2017-5754 的推测控制设置 [恶意数据缓存加载] 硬件需要内核 VA 阴影:True Windows 操作系统支持内核 VA 影子:True Windows 操作系统对内核 VA 影子的支持已启用:False 建议采取的措施 * 安装设备 OEM 提供的 BIOS/固件更新,以便为分支目标注入缓解提供硬件支持。 * 按照 https://support.microsoft.com/help/4072698 中所述的指南启用 Windows Server 对推测控制缓解的支持
我真正想要做的是拥有一个漂亮的表格,可以将其导出到 CSV,其中仅在一列中显示服务器名称,在其他列中显示 True/False 值。
什么做有点帮助的是,我可以通过管道将输出传输到select
,它会在上面所有输出垃圾的末尾创建一个表行,但是当我get-speculationcontrolsettings
针对整个服务器阵列运行时,它会输出所有垃圾的副本,然后输出一个服务器的表行,然后输出垃圾再次以及下一个服务器的表行等等。
我可以将所有内容发送到文本文件,然后搜索和替换以摆脱所有垃圾,然后将文本转换为表格,然后复制粘贴到 Excel。
但如果 PowerShell 中有某种方法可以……那就太酷了。我不知道。只输出表格数据?也许以某种方式填充数组,然后回显该数组?
有什么好主意吗?
编辑-其他人的注意事项
我正在使用的命令的最终版本(按照接受的答案中的建议注释掉write-host
模块本身中的所有语句之后)如下所示:
Invoke-Command -ComputerName $servernamess ${function:Get-SpeculationControlSettings} -ErrorAction SilentlyContinue | 选择 PSComputerName、BTIHardwarePresent、BTIWindowsSupportPresent、BTIDisabledBySystemPolicy、BTIDisabledByNoHardwareSupport、KVAShadowWindowsSupportPresent、KVAShadowWindowsSupportEnabled | ft
如果您$servernames
用计算机名称列表填充变量,无论您想怎么做,此命令都会在所有以此命名的服务器上远程执行 get-speculationcontrolsettings 命令。如果您编辑了 psm1 文件,则不会看到详细输出。此外,如果变量中包含任何无法访问的计算机名称,您将收到有关这些计算机的错误,因此这就是该参数-ErrorAction SilentlyContinue
存在的原因。最后,该命令选择服务器的名称和有关缓解措施的重要发现,并将它们格式化为表格。
通过一些快速查找和替换将空格变成逗号,您将得到一个 CSV,您可以在 Excel 中打开它并应用一些条件格式,以便管理层查看您在 Windows 环境中的 Spectre 和 Meltdown 情况,而无需等待合规性再进行一次 Nessus 扫描。
答案1
如果您对 PowerShell 有一定了解,那么您还可以复制该文件:
C:\Program Files\WindowsPowerShell\Modules\SpeculationControl\1.0.x\SpeculationControl.psm1
将输出更改为您喜欢的内容,然后运行新脚本。
答案2
我决定尝试一种困难的方法,结果却偶然找到了答案。
通过运行以下命令:
$服务器=Get-ADComputer-Filter * $服务器名称 = $服务器.名称 开始记录-路径“C:\SpecControlStatus.txt” 调用命令 -ComputerName $servernames ${function:Get-SpeculationControlSettings} | 选择 PSComputerName、KVAShadowWindowsSupportPresent 停止转录
记录中并不包含每次调用的所有“垃圾”输出Get-SpeculationControlSettings
,它只包含由语句创建的表select
。
我猜“垃圾”输出仅仅是控制台而已。
请注意,我正在处理的 Windows 域中只有应用程序服务器,因此获取域中所有计算机的名称也是我需要缓解的所有服务器的名称。