【问题标题】:How to read PowerShell .PSD1 files safely如何安全读取 PowerShell .PSD1 文件
【发布时间】:2014-10-14 01:16:04
【问题描述】:

PowerShell 模块清单文件格式 (.psd1) 本质上是带有特定键的 Hashtable 文字。这是 PowerShell 脚本的配置文件的理想选择。我最终想要做的是读取一个 .psd1 文件,其中包含一组特定于脚本的键。

例如(MyScriptConfig.psd1):

@{
    FTPHost = "ftp.blah.com"
    FTPUserName = "blah"
    FTPPassword = "blah"
}

没有理由我不能使用 XML、INI、JSON 或其他任何东西来获取这些信息,但我宁愿它使用与 PowerShell 的模块清单相同的基本数据格式。

显然,最简单的方法是读取文本并将其传递给Invoke-Expression,这将返回一个哈希表,但随后它会调用文件中的任何内容,这容易出错并且可能不安全。

我想我想起了一个使用 PowerShell cmdlet 的“安全”子集读取这些数据的 cmdlet,但我想到了 ConvertFrom-StringDataDATA 部分,这两个部分都不允许我读取包含 Hashtable 文字的任意文件.

PowerShell 中是否有内置的东西可以让我这样做?如果没有内置任何东西,那么我可能会使用ConvertFrom-StringData 走 JSON 或 Key=Value 的路线。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    Powershell 版本 5 添加了用于安全解析 PSD1 文件的 Cmdlet Import-PowershellDataFile

    在版本 5 之前,至少有三种解决方案:

    1. Cmdlet Import-LocalizedData。虽然用于处理语言文件,但它可以读取任何 PSD1 格式的文件。

      # Create a test PSD1 file
      @'
          @{
              a1 = 'a1'
              a2 = 2
              a3 = @{
                b1 = 'b1'
              }
          }
      '@ | Set-Content -Path .path\example.psd1
      
      # Read the file
      Import-LocalizedData -BaseDirectory .\path -FileName example.psd1 -BindingVariable Data
      
      # Use the data
      $Data.a1
      $Data.a3.b1
      
    2. 也可以使用Data Section 处理内嵌数据(内嵌类型无法达到目的)。

      # Safely parse data
      $Data2 = DATA {
          @{
              a1 = 'a1'
              a2 = 2
              a3 = @{
                b1 = 'b1'
              }
          }
      }
      
      # Use the data
      $Data2.a1
      $Data2.a3.b1
      
    3. 第三个是PowerShell DSC parameter transformation attribute mentioned by @Jakub Berezanski

    【讨论】:

      【解决方案2】:

      PowerShell DSC 定义了一个参数转换属性,用于支持在调用配置时将 .psd1 文件的路径作为 ConfigurationData 参数的值传递。该属性是公共的,可以在自定义函数中使用,例如:

      function Parse-Psd1
      {
          [CmdletBinding()]
          Param (
              [Parameter(Mandatory = $true)]
              [Microsoft.PowerShell.DesiredStateConfiguration.ArgumentToConfigurationDataTransformation()]
              [hashtable] $data
          )
          return $data
      }
      Parse-Psd1 C:\MyData.psd1
      

      属性实现调用一个内部帮助程序,该帮助程序在受限制的语言上下文中评估文件的内容,其中仅允许以下 cmdlet:

      Import-LocalizedData
      ConvertFrom-StringData
      Write-Host
      Out-Host
      Join-Path
      

      【讨论】:

        【解决方案3】:

        模块清单专门设计为仅使用 PSH 的受限子集,但是没有1在该模式下处理内容(并获取所有数据)的直接方法。但是,您可以使用 Test-ModuleManifest2 验证清单,然后才评估文件的内容。


        1 至少就 PowerShell In Action 第 2 版的内容而言。

        2不幸的是,本书的在线副本使用图像作为源代码(允许注释),因此无法在此处复制。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-25
          • 2020-02-18
          • 2020-03-03
          • 1970-01-01
          • 2015-03-04
          • 2016-05-10
          相关资源
          最近更新 更多