为什么要禁 PowerShell 2.0
Windows 自带的 PowerShell 2.0 引擎缺少现代版本的安全与审计能力:它的执行不产生 ScriptBlock 日志,攻击者用 powershell -version 2 就能降级调用,绕过大部分基于日志的检测。微软已在现代基线中把它列为应移除的组件。
基本信息
| 适用平台 | Windows 10 1803+ / Windows Server 2012 R2+(含更高版本) |
|---|---|
| 功能名称 | MicrosoftWindowsPowerShellV2 与 MicrosoftWindowsPowerShellV2Root |
| 生效方式 | 禁用后需重启 |
| 基线 | 两项功能 State 均为 Disabled |
典型使用场景
- 新建服务器与镜像模板:在模板阶段就移除,避免逐台补做
- 安全加固整改:CIS 与微软基线的常见条目,属于易落地项
- 检测能力提升:禁用后脚本活动统一走现代引擎日志,被绕过概率下降
- 迁移评估:确认老脚本是否依赖 -version 2,再决定禁用节奏
核查与禁用
核查与禁用
# 查看两项功能状态(部分版本只暴露其中一个)
Get-WindowsOptionalFeature -Online -FeatureName MicrosoftWindowsPowerShellV2 -ErrorAction SilentlyContinue | Select-Object FeatureName, State
Get-WindowsOptionalFeature -Online -FeatureName MicrosoftWindowsPowerShellV2Root -ErrorAction SilentlyContinue | Select-Object FeatureName, State
# 禁用(不自动重启,便于安排窗口)
Disable-WindowsOptionalFeature -Online -FeatureName MicrosoftWindowsPowerShellV2Root -NoRestart
# 重启后复核
Get-WindowsOptionalFeature -Online -FeatureName MicrosoftWindowsPowerShellV2Root | Select-Object State功能名称对照
| 功能名 | 含义 | 处理建议 |
|---|---|---|
| MicrosoftWindowsPowerShellV2 | 传统可选功能列表中的 PS2 引擎项 | 部分版本存在,需与 V2Root 一起核查 |
| MicrosoftWindowsPowerShellV2Root | DISM 列表中的 PS2 根功能 | 主改对象,禁用后重启生效 |
| Windows PowerShell 5.1 | 现代默认引擎 | 保留,日常运维依赖它 |
| PowerShell 7+ | 独立安装的新一代 | 按需,不受本项影响 |
依赖 powershell -version 2 的老脚本与部分安装程序会直接失败:先盘点脚本引用,迁移到 PowerShell 7 或改写后再禁用。
批量核查思路
批量核查思路
# 远程批量核查:逐台读取功能状态,挑出仍为 Enabled 的机器
$hosts = Get-Content .\hosts.txt
foreach ($h in $hosts) {
# 用 Invoke-Command 在目标机上执行,避免本地误读
Invoke-Command -ComputerName $h -ScriptBlock {
Get-WindowsOptionalFeature -Online -FeatureName MicrosoftWindowsPowerShellV2Root | Select-Object FeatureName, State
} | Select-Object PSComputerName, FeatureName, State
}禁用是重启后生效:验收要么重启后复核功能状态,要么在报告中注明生效时点,直接用命令回显当作已生效是不严谨的。
移除组件前确认备份软件与监控 agent 的脚本:部分老版本采集脚本显式调用 v2 引擎,移除后任务会静默失败,往往几天后才被业务发现。变更前建议把这类脚本清单同步给值班团队。