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

Chef中含Where-Object的PowerShell ACL命令无法运行问题

这个问题的核心是引号嵌套的语法冲突——你在Ruby的Mixlib::ShellOut里用双引号包裹PowerShell命令,而PowerShell的Where-Object条件里又用了双引号,导致Ruby解析时提前截断了PowerShell命令,最终传递给PowerShell的是语法错误的代码。

下面是几种可行的修复方案:

方案1:转义PowerShell中的双引号

在Ruby字符串里,把PowerShell条件里的"BUILTIN\Users"改成\"BUILTIN\Users\",让Ruby把双引号原样传递给PowerShell:

command = 'powershell "(Get-Acl \'HKLM:\SOFTWARE\\Microsoft\Windows NT\CurrentVersion\Winlogon\').Access | Where-Object{($_.IdentityReference -eq \"BUILTIN\Users\")} | Format-List RegistryRights,AccessControlType,IdentityReference"'
data = Mixlib::ShellOut.new(command).run_command.stdout.strip.gsub(/\r\n?/, "\n")
reg_perms = data.split("\n\n").each_with_object([]) do |block, arr|
  # 在这里编写你的文本解析逻辑
end

方案2:改用单引号包裹PowerShell的字符串

PowerShell里单引号表示字面量字符串,不会解析转义字符,而且在Ruby的双引号字符串里,单引号不需要转义,写法更简洁:

command = 'powershell "(Get-Acl \'HKLM:\SOFTWARE\\Microsoft\Windows NT\CurrentVersion\Winlogon\').Access | Where-Object{($_.IdentityReference -eq \'BUILTIN\Users\')} | Format-List RegistryRights,AccessControlType,IdentityReference"'
data = Mixlib::ShellOut.new(command).run_command.stdout.strip.gsub(/\r\n?/, "\n")
reg_perms = data.split("\n\n").each_with_object([]) do |block, arr|
  # 在这里编写你的文本解析逻辑
end

更优雅的进阶方案:用结构化数据替代文本解析

如果你的目标是把权限信息解析到Ruby数组里,用Format-List生成的纯文本分割解析很容易出错。建议让PowerShell输出结构化的JSON数据,然后Ruby直接解析:

command = 'powershell "(Get-Acl \'HKLM:\SOFTWARE\\Microsoft\Windows NT\CurrentVersion\Winlogon\').Access | Where-Object{($_.IdentityReference -eq \'BUILTIN\Users\')} | Select-Object RegistryRights,AccessControlType,IdentityReference | ConvertTo-Json"'
data = Mixlib::ShellOut.new(command).run_command.stdout.strip
require 'json'
reg_perms = JSON.parse(data)

这样得到的reg_perms直接是包含权限哈希的数组,不需要手动处理文本分割,可靠性和可读性都高很多。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:10:21