Search code examples
powershelldsc

How to pass around a PowerShell DSC Configuration as an object?


I'd like to be able to pass around DSC configuration objects to helper functions/cmdlets in order to make using them a little easier.

An example such configuration is:

[DSCLocalConfigurationManager()]
configuration LCMConfig
{
    Node $AllNodes.NodeName
    {
        Settings
        {
            ActionAfterReboot = 'ContinueConfiguration'
            ConfigurationMode = 'ApplyOnly'
            RebootNodeIfNeeded = $true
        }
    }
}

Is there any way to do something like

MyHelperFunction `
    -ConfigurationName LCMConfig `
    -ConfigurationData $configurationData `
    -Credential $administratorCredential

where the LCMConfig configuration is being passed into MyHelperFunction who can do with it what it wants?


Solution

  • Ok I finally figured out how to do it. You can do it with:

    $configuration = Get-Command $ConfigurationName
    Invoke-DscConfiguration `
        -Configuration $configuration `
        -ConfigurationData $configurationData `
        -Credential $administratorCredential
    

    where Invoke-DscConfiguration is:

    function Invoke-DscConfiguration
    {
        [CmdletBinding()]
        [OutputType([String])]
        Param
        (
            [Parameter(Mandatory=$true)]
            [System.Management.Automation.ConfigurationInfo]$Configuration,
    
            [Parameter(Mandatory=$true)]
            [Hashtable]$ConfigurationData,
    
            [Parameter(Mandatory=$true)]
            [PSCredential]$Credential,
    
            [Switch]$IsLCMConfiguration,
    
            [HashTable]$ConfigurationParameters
        )
    
        $ErrorActionPreference = 'Stop'
    
        $outputPath = Get-TemporaryDscDirectory
    
        Write-Verbose "Compiling the '$($ConfigurationName.Name)' configuration."
        & $Configuration -ConfigurationData $ConfigurationData -OutputPath $outputPath | Out-Null
    
        Write-Verbose "Executing the '$($ConfigurationName.Name)' configuration."
        if ($IsLCMConfiguration)
        {
            Set-DscLocalConfigurationManager -Path $outputPath -Force -Credential $Credential -Verbose
        }
        else
        {
            Start-DscConfiguration -Path $outputPath -Force -Wait -Credential $Credential -Verbose
        }
    }