public/Register-AzureDSCNode.ps1

function Register-AzureDSCNode {

<#
 
.SYNOPSIS
 
Register existing nodes to Azure DSC.
 
.DESCRIPTION
 
Register-AzureDSCNode cmdlet registers the Azure RM VM as DSC node in Azure automation account. Make sure that node configuration for the Azure RM VM you're trying to register, must be available in the resource group as automation account.
 
.PARAMETER nodeName
 
specify the VMname to register to AzureDSC.
 
.PARAMETER NodeResourceGroupName
 
Specify the resource group name of the VM
 
.PARAMETER DSCResourceGroupName
 
Specify the resource group name that contains the automation account associated with DSC.
 
.PARAMETER AutomationAccount
 
Specify the Automation account name
 
.PARAMETER location
 
Specify the Azure Region where the target VM is located.
 
.PARAMETER NodeConfigurationName
 
Specify the node configuration name, please use the format mentioned above with subscriptionshortname.VMname
 
.PARAMETER subscriptionName
 
Specify whether to wait for the output or
 
 
.EXAMPLE
 
Register-AzureDSCNode -NodeName <VMname> -NodeResourceGroupName <ResourcegroupName> -DSCResourceGroupName <ResrouceGroupName> -AutomationAccount <Automationaccountname> -location <Location> -NodeConfigurationName <subscriptionshortname.VMname> -SubscriptionName <sunscriptionname> -Verbose
 
 
#>


    [CmdletBinding()]

    Param (
    
    [Parameter(Mandatory=$true)]
    [string]$NodeName,

    [Parameter(Mandatory=$true)]
    [string]$NodeResourceGroupName,

    [Parameter(Mandatory=$true)]
    [string]$DSCResourceGroupName,

    [Parameter(Mandatory=$true)]
    [string]$AutomationAccount,

    [Parameter(Mandatory=$true)]
    [string]$location,

    [Parameter(Mandatory=$true)]
    [string]$NodeConfigurationName,
    
    [Parameter(Mandatory=$false)]
    [bool]$wait = $false,

    [Parameter(Mandatory=$false)]
    [string]$ConfigurationMode = 'ApplyAndAutoCorrect',

    [Parameter(Mandatory=$false)]
    [bool]$RebootNodeIfNeeded = $false,

    [Parameter(Mandatory=$false)]
    [string]$DSCVersion = '2.26'


   
    )

    Process 
    {

        

        Try {
            $AccountInfo = Get-AzureRmAutomationRegistrationInfo -ResourceGroupName $DSCResourceGroupName -AutomationAccountName $AutomationAccount -ErrorAction Stop -Verbose   
        }
        Catch {
            $error[0]
            break
        }
       
        
        # extension static values
        $privateConfig = @"
{
  "RegistrationUrl": "$AccountInfo.Endpoint",
  "RegistrationKey": "$AccountInfo.PrimaryKey"
}
"@
 
  
        $publicConfig = '{
  "Mode": "Register"
}'
 

        $extName = "Microsoft.Powershell.DSC"
        $publisher = "Microsoft.Powershell"
        $extType = "DSC"

        # Set-AzureRMVMExtension cmdlet params
        $ExtensionParams = @{
            ResourceGroupName = $NodeResourceGroupName;
            VMName = $NodeName;
            Location = $location;
            Name = $extName;
            Publisher = $publisher;
            ExtensionType = $extType;
            TypeHandlerVersion = $DSCVersion;
            SettingString = $publicConfig;
            ProtectedSettingString = $privateConfig;
            ErrorAction = 'Stop'   
        
        }


        Try {
            $setExtension = Set-AzureRmVMExtension @ExtensionParams -Verbose  
            Write-Output "Success" 
        }
        Catch {
            $error[0]
            break
        }

        #Register-AzureRMAutomationDSCNode params
        $RegistrationParams = @{
            AzureVMName = $NodeName;
            NodeConfigurationName = $NodeConfigurationName;
            ConfigurationMode = $ConfigurationMode;
            RebootNodeIfNeeded = $RebootNodeIfNeeded;
            AzureVMResourceGroup = $NodeResourceGroupName;
            AzureVMLocation = $location;
            ResourceGroupName = $DSCResourceGroupName;
            AutomationAccountName = $AutomationAccount;
            ErrorAction = 'Stop'
        }
        
        Try {
            If ($wait){
                $RegisterNode = Register-AzureRmAutomationDscNode @RegistrationParams -Verbose 
            }
            else {
                $job = Start-Job -Name ("DSC-Registration-" + $NodeName) -ScriptBlock {Register-AzureRmAutomationDscNode @RegistrationParams -Verbose}
                $jobinfo = New-Object -TypeName psobject -Property @{
                    "Job Name" = $job.Name
                    "Job Id"   = $job.Id
                    "Job State"= $job.State
                }
                $RegisterNode = $jobinfo
            }
        }
        Catch {
            $error[0]
            break
        }

        return $RegisterNode

    }

}