【问题标题】:Pass parameters to script using Start-DSCConfiguration使用 Start-DSCConfiguration 将参数传递给脚本
【发布时间】:2017-04-11 12:51:21
【问题描述】:

我有一个看起来像这样的 DSC 配置

configuration DBServer
{
  param(
    [PSCredential]$SqlAdminCredential
  )

  node "localhost"
  {
    Script ConfigureSSRS {
      SetScript = {
        & sqlcmd -S $RSConnection -i $DBCreateFile -U $SQLAdminCredential.UserName -P $SQLAdminCredential.GetNetworkCredential().Password

我使用 JSON 模板部署在 azure VM 上运行它,其 DSC 扩展包含此 Properties 节点:

"Properties": {
    "SqlAdminCredential": {
        "userName": "PrivateSettingsRef:SQLAdmin",
        "password": "PrivateSettingsRef:SQLAdminPass"
    },

这两个值确实在protectedSettings 节点中定义:

"SQLAdmin": "[parameters('sqlAuthenticationLogin')]",
"SQLAdminPass": "[parameters('sqlAuthenticationPassword')]"

但是,每当我尝试使用凭据时,上面列出的代码中都会出现空引用异常。我试过$using:SqlAdminCredential,我相信昨天我也试过$global:SqlAdminCredential

我目前正在尝试解决此问题,但我不喜欢更改我的配置然后花费 15 分钟等待部署以查看它是否有效。但是,我不知道如何使用Start-DscConfiguration 传递此凭据对象参数,以便在现有 VM 上对其进行故障排除。我该怎么做?

如果您能解决我的实际问题并告诉我如何从ConfigureSSRS.SetScript 内部访问$SqlAdimCredential,则可以加分

【问题讨论】:

    标签: powershell azure dsc


    【解决方案1】:

    目前,我决定表现得不好,这样做:

    configuration DBServer
    {
      param(
        [PSCredential]$SqlAdminCredential
      )
    
      node "localhost"
      {
        $adminCreds = $SqlAdminCredential #a hack
    
        Script ConfigureSSRS {
          SetScript = {
            $SqlAdminCredential = $using:adminCreds
    

    我会等待更好的解决方案,但这似乎有效。

    【讨论】:

    • 当您执行此操作时,凭据会被序列化到 mof 而不会首先被加密
    • @aboersch MOF不是在执行和接收任何参数之前编译好的吗?
    • 您可以使用它,但前提是您正在编译并将配置应用到同一台机器上。如果您使用 $using: 它会使用本地计算机的证书进行序列化和加密。因此,它不适合拉取服务器或您在一个系统上创作然后部署到另一个系统的其他场景。
    【解决方案2】:

    您有以下选择:

    1. 如果您需要在单个用户下运行整个脚本,请使用脚本资源的 PSDSCRunAsCredential。

    2. 创建您自己的使用 PSCredential 参数的 DSC 资源。

    【讨论】:

    • 我实际上不希望脚本的任何部分在该用户下运行,因为它不是 Windows 用户。我只希望 sqlcmd 可以访问这些凭据。在我未受过教育的意见中,自定义资源对于像这个这样简单的问题来说可能开销太大。
    • 创建一个模块是小菜一碟 这是我用一个简单的资源创建的要点,它以详细模式显示凭证的密码: 1. 在 C:\Program Files 中创建一个以您的模块命名的文件夹\WindowsPowerShell\Modules\ 2. 运行 New-ModuleManifest -Path C:\Program Files\WindowsPowerShell\Modules\\.psd1 并提供其他参数 3. 编写基于类的 Resource @987654321 @
    • 实际上,我已经在这个解决方案中得到了一个自定义的解决方案 :) 当我的(诚然愚蠢的)解决方法运行良好时,这似乎是很多额外的代码。
    • 这是我使用一个简单资源创建的要点,该资源以详细模式显示凭据的密码:gist.github.com/aboersch/65e846a4966fe2c4708ed21d655a54a7
    猜你喜欢
    • 2013-01-17
    • 2015-05-13
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 2017-12-13
    • 2012-03-15
    • 2019-11-01
    • 1970-01-01
    相关资源
    最近更新 更多