You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell中如何向sc.exe的binPath参数传递双引号包裹的字符串

PowerShell调用sc.exe配置带空格服务路径的正确方案

可直接复用的动态传参代码

# 配置项,可替换为批量扫描得到的动态值
$serviceName = "OcaLogSvc"
$serviceFullPath = "C:\Program Files\AppRecovery\Agent\R3LogService\OcaLogSvc.exe"

# 构造符合两层转义要求的binPath参数
$binPathValue = '"\"' + $serviceFullPath + '\""'
# 执行配置,注意binPath=后必须保留一个半角空格
& sc.exe config $serviceName binPath= $binPathValue

# 校验配置结果
sc.exe qc $serviceName | Select-String "BINARY_PATH_NAME"

执行后查询到的二进制路径会是首尾带单个双引号的正确格式,符合漏洞修复要求,无多余引号。

转义逻辑说明

之前的写法始终无法得到正确结果,核心是需要同时满足两层独立的解析规则,任意一层不符合都会得到错误结果:

  • sc.exe自身的参数规则:sc.exe对binPath参数的解析逻辑和其他参数不同,要让最终写入服务注册表的路径首尾带双引号,传入的参数值必须满足"\"<实际服务路径>\""的格式:首尾各1个双引号,包裹的路径前后各用\"表示要保留的实际双引号。你在cmd中能正常运行的原命令,本质就是在cmd的转义规则下拼出了这个格式。
  • PowerShell的原生EXE传参规则:PowerShell调用外部exe时,会自动对传入的字符串参数做一层引号转义,因此不需要像cmd那样额外堆叠多层引号,直接通过字符串拼接构造上述格式的参数值即可,不需要硬编码复杂的多引号组合,也能完美支持动态变量传入。

注意事项

  • binPath=和后面的参数值之间必须保留一个半角空格,这是sc.exe的历史遗留参数解析要求,缺少空格会直接报参数无效错误。
  • 对于带启动参数的服务,只需要在包裹好的路径后面拼接空格和参数即可,例如$binPathValue = '"\"' + $serviceFullPath + '\"" /autostart',同样可以正常写入。
  • 该方案配置完成后立即生效,不需要重启服务,可直接通过漏洞扫描校验,不需要绕路实现bat中转、直接修改注册表等兼容性更差的方案。

内容的提问来源于stack exchange,提问作者Matt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.17 16:16:01