【问题标题】:Reference credential in CMD called by DSCDSC 调用的 CMD 中的参考凭证
【发布时间】:2017-03-19 18:16:58
【问题描述】:

我想知道如何在 DSC 调用的 CMD 中引用凭据。 这是我正在尝试部署的配置,但它没有收到凭据。

configuration SQLCMD
{
    param
    (
        [Parameter(Mandatory=$true)]
        [ValidateNotNullorEmpty()]
        [PSCredential]
        $Credential

    )

    Import-DscResource -ModuleName xSqlServer

    Node localhost
    {

        LocalConfigurationManager
        {
            ConfigurationMode = 'ApplyOnly'
            RebootNodeIfNeeded = $true
            ActionAfterReboot = 'ContinueConfiguration'
            AllowModuleOverwrite = $true
        }

        Script DeployDBmoveTempDB 
        { 
            SetScript = { 
$SourceFile = 'C:\DatabaseTest.dacpac'
$TargetServerName = 'localhost'
$TargetDatabaseName = 'TestDB1'
$databaseSizeSQLCMD = '200MB'
$databaseLogSizeSQLCMD = '20MB'
$tempdbSizeSQLCMD = '1900MB'
$tempdbLogSizeSQLCMD = '1900MB'


trap {
    Write-Error $_
    Exit 1
}

 $args = @('/Action:Publish'
             ,"/SourceFile:$SourceFile"
             ,"/TargetServerName:$TargetServerName"
             ,"/TargetUser:$Credential.UserName"
             ,"/TargetPassword:$Credential"
             ,"/TargetDatabaseName:$TargetDatabaseName"
             ,"/v:databaseSizeSQLCMD=$databaseSizeSQLCMD"
             ,"/v:databaseLogSizeSQLCMD=$databaseLogSizeSQLCMD"
             ,"/v:tempdbSizeSQLCMD=$databaseSizeSQLCMD"
             ,"/v:tempdbLogSizeSQLCMD=$databaseLogSizeSQLCMD"
             ,'/p:BlockOnPossibleDataLoss=false'
             )            

    try {
        & "C:\Program Files (x86)\Microsoft SQL Server\130\DAC\bin\SqlPackage.exe" $args


    }
    catch {
        Write-Host $_ ;
    }   

        } 

            TestScript = { 
            Test-Path D:\TestDB1_primary.mdf
        } 
            GetScript = { <# This must return a hash table #> }
        }

    }
}

但是,以下配置可以正常工作:

configuration SQLCMD
{
    param
    (
        [Parameter(Mandatory=$true)]
        [ValidateNotNullorEmpty()]
        [PSCredential]
        $Credential

    )

    Import-DscResource -ModuleName xSqlServer

    Node localhost
    {

        LocalConfigurationManager
        {
            ConfigurationMode = 'ApplyOnly'
            RebootNodeIfNeeded = $true
            ActionAfterReboot = 'ContinueConfiguration'
            AllowModuleOverwrite = $true
        }

        Script DeployDBmoveTempDB 
        { 
            SetScript = { 
$ErrorActionPreference = "Stop"
$SourceFile = 'C:\DatabaseTest.dacpac'
$TargetServerName = 'localhost'
$user_name = 'mySqlAdmin'
$user_pwd = 'blabla'
$TargetDatabaseName = 'TestDB1'
$databaseSizeSQLCMD = '200MB'
$databaseLogSizeSQLCMD = '20MB'
$tempdbSizeSQLCMD = '1900MB'
$tempdbLogSizeSQLCMD = '1900MB'


trap {
    Write-Error $_
    Exit 1
}

 $args = @('/Action:Publish'
             ,"/SourceFile:$SourceFile"
             ,"/TargetServerName:$TargetServerName"
             ,"/TargetUser:$user_name"
             ,"/TargetPassword:$user_pwd"
             ,"/TargetDatabaseName:$TargetDatabaseName"
             ,"/v:databaseSizeSQLCMD=$databaseSizeSQLCMD"
             ,"/v:databaseLogSizeSQLCMD=$databaseLogSizeSQLCMD"
             ,"/v:tempdbSizeSQLCMD=$databaseSizeSQLCMD"
             ,"/v:tempdbLogSizeSQLCMD=$databaseLogSizeSQLCMD"
             ,'/p:BlockOnPossibleDataLoss=false'
             )            

    try {
        & "C:\Program Files (x86)\Microsoft SQL Server\130\DAC\bin\SqlPackage.exe" $args


    }
    catch {
        Write-Host $_ ;
    }   

        } 

            TestScript = { 
            Test-Path D:\TestDB1_primary.mdf
        } 
            GetScript = { <# This must return a hash table #> }
        }

    }
}

【问题讨论】:

  • 您不能将凭据传递给这样的外部命令。不仅外部命令首先不知道任何关于 PowerShell 对象的信息,而且字符串中的 $Credential 被扩展为凭证对象的字符串表示形式,即字符串 "System.Management.Automation.PSCredential"。您需要从您的凭证对象中扩展用户名和密码并将其传递给外部命令。

标签: tsql powershell dsc


【解决方案1】:

DSC 配置将脚本作为字符串存储在生成的 mof 中,并且默认情况下不扩展变量,因为它不知道要扩展哪个以及保留哪个作为脚本的一部分。但是,通过指定$using:-Scope,您可以包含配置中定义的变量。在 mof 编译期间,变量会添加到每个 Get-/Set-/TestScript 脚本块的开头。 例如:

configuration SQLCMD
{
    param
    (
        [Parameter(Mandatory=$true)]
        [ValidateNotNullorEmpty()]
        [PSCredential]
        $Credential    
    )

    Import-DscResource -ModuleName xSqlServer

    $user_name = $Credential.UserName
    $user_pwd = $Credential.GetNetworkCredential().Password

    Node localhost
    {    
        Script DeployDBmoveTempDB 
        { 
            SetScript = { 

                $TargetDatabaseName = 'TestDB1'
                $args = @(,"/TargetUser:$using:user_name"
                             ,"/TargetPassword:$using:user_pwd"
                             ,"/TargetDatabaseName:$TargetDatabaseName")                
                try {
                    & "C:\Program Files (x86)\Microsoft SQL Server\130\DAC\bin\SqlPackage.exe" $args
                }
                catch { Write-Host $_  }       
            }     
            TestScript = { Test-Path "D:\TestDB1_primary.mdf" }             
            GetScript = { <# This must return a hash table #> }
        }

    }
}

请注意,密码将以纯文本形式存储在 mof 文件中。 例如:

SetScript = "$user_name ='User1'\n$user_pwd ='Password1'\n \n\n                $TargetDatabaseName = 'TestDB1'\n                $args = @(,\"/TargetUser:$user_name\"\n                       
      ,\"/TargetPassword:$user_pwd\"\n                             ,\"/TargetDatabaseName:$TargetDatabaseName\")            \n\n                try {\n                    & \"C:\\Program File
s (x86)\\Microsoft SQL Server\\130\\DAC\\bin\\SqlPackage.exe\" $args\n                }\n                catch { Write-Host $_  }   \n\n            ";

【讨论】:

  • 不幸的是,我收到了这个错误[ERROR] PowerShell DSC resource MSFT_ScriptResource failed to execute Set-TargetResource functionality with error message: You cannot call a method on a null-valued expression.
  • 查看更新。并记得在编译配置时将凭证传递给SQLCMD
  • 更新了答案。找到了一种更好的方法(使用范围与字符串替换)来访问公共变量/参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-06
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 2019-02-26
  • 1970-01-01
相关资源
最近更新 更多