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
相关产品推荐
相关产品推荐

