代码之家  ›  专栏  ›  技术社区  ›  Sriram Gaddipati

chef powershell命令无效

  •  2
  • Sriram Gaddipati  · 技术社区  · 6 年前

    我正在尝试获取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
    
    2 回复  |  直到 6 年前
        1
  •  0
  •   jkdba    6 年前

    您正在对整个字符串使用单引号: ' 。然后,当使用双引号对字符串求值时 BUILTIN\Users 字符串未转义,这意味着您需要转义 ""BUILTIN\Users"" powershell方式或使用单引号 \'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"'
    
        2
  •  0
  •   mklement0    6 年前

    您正在尝试嵌入 "BUILTIN\Users" -双引号字符串-在传递给PowerShell可执行文件的整个双引号命令字符串中( powershell "..." ),无法工作,因为 在带引号的字符串中嵌入相同类型的引号需要 正在逃逸

    PowerShell,从调用时 外部 通过其CLI( powershell.exe ),要求 嵌入的 " 查尔斯。是 \" -逃脱 (即使PowerShell- 内部 ,则, `" "" 使用)。 [1]

    因为你正在使用 仅有一个的 -Ruby(厨师)方面的报价( command = '...' ),正在逃离 内部的 嵌入的 “” 查尔斯。像 \“” 为了 PowerShell 足够了。

    因此,更换 -eq "BUILTIN\Users" 具有 -eq \"BUILTIN\Users\" ;i、 e.:

    command ='powershell "(Get-Acl \'HKLM:\SOFTWARE\\Microsoft\Windows NT\CurrentVersion\Winlogon\').Access | Where-Object{($_.IdentityReference -eq \"BUILTIN\Users\")} | Format-List RegistryRights,AccessControlType,IdentityReference"'
    

    或者 -鉴于 所容纳之物 引用字符串的 字面意义的 ,则, 您可以使用 仅有一个的 周围的引号 BUILTIN\Users 在PowerShell命令中;然而,在这种情况下,因为在Ruby方面,您对整个命令使用单引号, 您需要避开嵌入式 ' 实例为 \' 对于 红宝石 的好处 :

    因此,更换 -eq“内置\用户” 具有 -eq \'BUILTIN\Users\' ;i、 e.:

    command ='powershell "(Get-Acl \'HKLM:\SOFTWARE\\Microsoft\Windows NT\CurrentVersion\Winlogon\').Access | Where-Object{($_.IdentityReference -eq \'BUILTIN\Users\')} | Format-List RegistryRights,AccessControlType,IdentityReference"'
    

    [1] 从调用PowerShell CLI时 cmd.exe -无论是从命令提示符、批处理文件还是通过Chef/Ruby转义文本 “” “” 有时 ,但并不总是有效(请尝试
    powershell -Command "'Nat ""King"" Cole'" 直接从a 命令。exe文件 命令提示符)。
    相反 \“” -逃跑是安全的选择。
    `“” -逃跑,这是 典型的 PowerShell- 内部的 逃生之路 “” 在…内 "..." ,则, 从不 在这种情况下有效。