我正在尝试获取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
最佳答案
您正在对整个字符串使用单引号:'
。然后,当您的字符串用双引号引起来时,BUILTIN\Users
字符串周围的双引号不会转义,这意味着您需要以强力 shell 方式对""BUILTIN\Users""
周围的双引号进行转义,或者使用单引号\'BUILTIN\Users\'
并将其转为ruby方式。
这应该工作:
command ='powershell "(Get-Acl \'HKLM:\SOFTWARE\\Microsoft\Windows NT\CurrentVersion\Winlogon\').Access | Where-Object{
($_.IdentityReference -eq \'BUILTIN\Users\')
} | Format-List RegistryRights,AccessControlType,IdentityReference"'