powershell - 如何安全读取 PowerShell .PSD1 文件

标签 powershell

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

例如(MyScriptConfig.psd1):

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

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

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

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

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

最佳答案

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

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

  • 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
    
  • 也可以使用 Data Section 处理在线数据。 (在线排序失败了目的)。
    # Safely parse data
    $Data2 = DATA {
        @{
            a1 = 'a1'
            a2 = 2
            a3 = @{
              b1 = 'b1'
            }
        }
    }
    
    # Use the data
    $Data2.a1
    $Data2.a3.b1
    
  • 第三个是PowerShell DSC parameter transformation attribute mentioned by @Jakub Berezanski .
  • 关于powershell - 如何安全读取 PowerShell .PSD1 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25408815/

    相关文章:

    powershell - 跨 session 保存 Powershell 对象

    powershell - 如何通过 New-SelfSignedCertificate cmdlet 创建代码签名证书

    python - 尝试连接到 Azure Sql 数据库时,用户 'user' 登录失败

    azure - 格式化 Powershell 脚本对象输出?

    windows - 打印目录树但排除 Windows cmd 上的文件夹

    powershell - 如何使用管道将变量传递到 Write-Host

    powershell - 在 Powershell 中将文件的一部分读取到流中

    PowerShell 的解析模式 : argument (command) mode vs. 表达模式

    powershell - 使用 dtutil 部署 SSIS 包

    c# - 给定 shell 扩展 CLSID,如何找到实现 COM 可执行文件或 DLL,并检查其接口(interface)和成员?