我正在尝试获取ACL并解析到数组reg_perms
,代码在没有Where-Object{($_.IdentityReference -eq "BUILTIN\Users")
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 |set, arr|
arr << set.split("\n").map do |f|
f.split(':').collect(&:strip)
end.to_h
end
答案 0 :(得分:0)
您对整个字符串使用单引号:'
。然后,当您的字符串被双引号括起时,BUILTIN\Users
字符串周围的双引号不会被转义,这意味着您需要绕过""BUILTIN\Users""
powershell方式的双引号或使用单引号{{1并以红宝石的方式逃脱它们。
这应该有效:
\'BUILTIN\Users\'
答案 1 :(得分:0)
您尝试在整个双引号命令字符串中嵌入"BUILTIN\Users"
- 双引号字符串 - 您将传递给PowerShell可执行文件(powershell "..."
),无效,因为在带引号的字符串中嵌入相同类型的引号需要转义 。
PowerShell,当通过其CLI(powershell.exe
)从外部调用它时,需要嵌入式 "
字符。被\"
- 转义(即使使用PowerShell- 内部,`"
或""
)。 [1]
由于您在Ruby(Chef)端(command = '...'
)上使用单 - 进行操作,因此转义内部嵌入式{{1} chars。 PowerShell 的"
就足够了。
因此,请将\"
替换为-eq "BUILTIN\Users"
;即:
-eq \"BUILTIN\Users\"
或者 - 假设您引用的字符串的内容是文字,您可以使用单在PowerShell命令中引用command ='powershell "(Get-Acl \'HKLM:\SOFTWARE\\Microsoft\Windows NT\CurrentVersion\Winlogon\').Access | Where-Object{($_.IdentityReference -eq \"BUILTIN\Users\")} | Format-List RegistryRights,AccessControlType,IdentityReference"'
;但是,在这种情况下,因为在Ruby方面,您使用单引号作为整体命令,您需要将嵌入式BUILTIN\Users
实例转义为 Ruby的'
的好处:
因此,请将\'
替换为-eq "BUILTIN\Users"
;即:
-eq \'BUILTIN\Users\'
[1]从command ='powershell "(Get-Acl \'HKLM:\SOFTWARE\\Microsoft\Windows NT\CurrentVersion\Winlogon\').Access | Where-Object{($_.IdentityReference -eq \'BUILTIN\Users\')} | Format-List RegistryRights,AccessControlType,IdentityReference"'
调用PowerShell CLI时 - 无论是从命令提示符,批处理文件还是通过Chef / Ruby - 将文字cmd.exe
转义为{{1} 有时候,但并不总是有效(试试)
"
直接来自""
命令提示符。)
相反,powershell -Command "'Nat ""King"" Cole'"
- 逃避是安全的选择
cmd.exe
- 转义,这是典型 PowerShell- 内部在\"
内转义`"
的方式,从不适用于这种情况。