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

