我正在尝试获取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"'

10-04 14:52