修复MS13-098的PowerShell脚本推送失败,咨询Windows安全设置
MS13-098漏洞修复脚本推送时注册表导入失败的问题分析与解决
问题背景
我编写了一个PowerShell脚本,通过修改注册表项修复MS13-098漏洞,脚本分为两步:创建注册表文件、导入注册表文件。脚本在本地运行正常,但通过Automox Worklet或Dameware推送执行时,仅第一步创建文件的操作生效,第二步注册表导入无法执行。想了解Windows中是否存在阻止PowerShell脚本修改注册表的安全设置,以及如何解决该问题。
用户提供的脚本如下:
$ScriptAlreadyRun = Test-Path "C:\Tempt\Reg\patch.reg" if (!($ScriptAlreadyRun)) { New-Item -ItemType Directory -Path C:\Tempt\Reg New-Item "C:\Tempt\Reg\patch.reg" -ItemType File -Value "" Add-Content "C:\Tempt\Reg\patch.reg" "Windows Registry Editor Version 5.00" Add-Content "C:\Tempt\Reg\patch.reg" "[HKEY_LOCAL_MACHINE\Software\Microsoft\Cryptography\Wintrust\Config]" Add-Content "C:\Tempt\Reg\patch.reg" "`\"EnableCertPaddingCheck`\"=`\"1`\"" Add-Content "C:\Tempt\Reg\patch.reg" "" Add-Content "C:\Tempt\Reg\patch.reg" "[HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Cryptography\Wintrust\Config]" Add-Content "C:\Tempt\Reg\patch.reg" "`\"EnableCertPaddingCheck`\"=`\"1`\"" regedit /s import C:\Tempt\Reg\patch.reg }
可能的原因分析
- regedit命令语法错误:脚本中使用的
regedit /s import C:\Tempt\Reg\patch.reg存在语法错误,import是多余参数,正确的静默导入命令应为regedit /s "C:\Tempt\Reg\patch.reg",这是导致导入失败的最直接原因。 - 权限不足:推送工具运行脚本时未获取管理员权限,修改
HKEY_LOCAL_MACHINE下的注册表项需要管理员权限,若脚本以普通用户权限执行,导入操作会被系统阻止。 - 32位/64位环境差异:如果推送工具在32位PowerShell环境下执行脚本,
regedit会自动重定向到32位注册表路径,可能导致导入逻辑混乱;同时,C:\Tempt目录在32位环境下的访问权限也可能存在差异。 - 安全软件拦截:Windows Defender或第三方杀毒软件可能将静默导入注册表的操作判定为恶意行为,从而拦截
regedit的执行或脚本生成的reg文件。 - 临时路径权限问题:虽然脚本创建了
C:\Tempt\Reg目录,但运行脚本的账户对该目录可能缺少读写权限,导致reg文件无法正常读取或执行。
解决方案
1. 修正regedit命令语法
将脚本中的导入命令修改为正确格式:
regedit /s "C:\Tempt\Reg\patch.reg"
2. 直接用PowerShell操作注册表(推荐)
避免依赖外部工具regedit,直接使用PowerShell的注册表操作命令,更稳定且不易被拦截:
$ScriptAlreadyRun = Test-Path "C:\Tempt\Reg\patch.reg" if (!($ScriptAlreadyRun)) { # 创建标记目录和文件(用于判断脚本是否已执行) New-Item -ItemType Directory -Path C:\Tempt\Reg -Force New-Item "C:\Tempt\Reg\patch.reg" -ItemType File -Value "" -Force # 处理64位注册表项 $regPath64 = "HKLM:\Software\Microsoft\Cryptography\Wintrust\Config" if (-not (Test-Path $regPath64)) { New-Item -Path $regPath64 -Force | Out-Null } Set-ItemProperty -Path $regPath64 -Name "EnableCertPaddingCheck" -Value "1" -Type String # 处理32位注册表项 $regPath32 = "HKLM:\Software\Wow6432Node\Microsoft\Cryptography\Wintrust\Config" if (-not (Test-Path $regPath32)) { New-Item -Path $regPath32 -Force | Out-Null } Set-ItemProperty -Path $regPath32 -Name "EnableCertPaddingCheck" -Value "1" -Type String }
3. 确保脚本以管理员权限执行
在Automox Worklet或Dameware的任务配置中,勾选“以管理员身份运行”选项,确保脚本拥有修改HKLM注册表的权限。
4. 排查安全软件拦截
- 临时关闭Windows Defender实时保护或第三方杀毒软件,测试脚本是否能正常执行。
- 若确认是安全软件拦截,将脚本路径、
C:\Tempt\Reg目录添加到安全软件的信任列表中。
5. 更换临时文件路径
改用系统默认的临时目录存放reg文件,避免自定义路径的权限问题:
$tempPath = Join-Path -Path $env:TEMP -ChildPath "Reg" $regFile = Join-Path -Path $tempPath -ChildPath "patch.reg" $ScriptAlreadyRun = Test-Path $regFile if (!($ScriptAlreadyRun)) { New-Item -ItemType Directory -Path $tempPath -Force # 后续操作使用$regFile路径替代原路径 }
内容的提问来源于stack exchange,提问作者Huy Than
相关产品推荐
相关产品推荐

