PowerShell设置注册表键值时出现原有键被意外覆盖问题
PowerShell设置注册表值旧值意外消失问题解决方案
根因分析
- 首要原因是注册表路径未显式指定注册表提供器前缀,PowerShell路径解析异常,可能出现操作节点偏移、逻辑错误等问题
- 64位操作系统中若使用32位PowerShell执行脚本,操作
HKEY_LOCAL_MACHINE\SOFTWARE路径会自动重定向到HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\下,可能出现两次操作实际写入不同节点的情况 - QualysAgent运行时会自动校验自身关联注册表项配置,非预期的新增值会被服务主动清理,也会导致旧值看似被覆盖消失
修复操作步骤
1. 修正注册表路径与命令参数
显式添加注册表提供器前缀Registry::,同时指定值类型避免自动推断异常,修正后脚本如下:
# 显式指定注册表提供器前缀,避免路径解析错误 $registryKey = "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Qualys\QualysAgent\ScanOnDemand\Vulnerability" $valuedata = '1' # 第一次设置Scanondemand值 $valuename = "Scanondemand" Set-ItemProperty -Path $registryKey -Name $valuename -Value $valuedata -Type DWord # 第二次设置ScanOnstartup值 $valuename = 'ScanOnstartup' Set-ItemProperty -Path $registryKey -Name $valuename -Value $valuedata -Type DWord
注:
Set-ItemProperty本身逻辑为「值不存在则新增,存在则修改」,正常不会删除同路径下其他无关值
2. 适配64位系统运行环境
如果是64位操作系统,需要操作原生64位注册表路径时,请运行C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe(64位PowerShell)执行脚本,不要使用SysWOW64目录下的32位PowerShell。
3. 操作前暂停QualysAgent服务
避免QualysAgent主动清理自定义注册表值,修改前先停止服务:Stop-Service QualysAgent -Force
修改完成验证无误后再启动服务:Start-Service QualysAgent
4. 结果校验
设置完成后执行以下命令,确认两个值均已正确写入:Get-ItemProperty -Path $registryKey | Select-Object Scanondemand, ScanOnstartup
内容的提问来源于stack exchange,提问作者timmyver
相关产品推荐
相关产品推荐

