xActiveDirectory/DSCResources/MSFT_xADDomainController/MSFT_xADDomainController.psm1

function Get-TargetResource
{
    [OutputType([System.Collections.Hashtable])]
    param
    (
        [Parameter(Mandatory)]
        [String]$DomainName,

        [Parameter(Mandatory)]
        [PSCredential]$DomainAdministratorCredential,

        [Parameter(Mandatory)]
        [PSCredential]$SafemodeAdministratorPassword
    )

    $returnValue = @{
        Name = $DomainName
        Ensure = $false
    }

    try
    {
        Write-Verbose -Message "Resolving $DomainName..."
        $domain = Get-ADDomain -Identity $DomainName -Credential $DomainAdministratorCredential
        if( $domain -ne $null )
        {
            Write-Verbose -Message "Domain $DomainName is present. Looking for DCs"
            try
            {
                $dc = Get-ADDomainController -Identity $env:COMPUTERNAME -Credential $DomainAdministratorCredential
                Write-Verbose -Message "Got Domain Controller $($dc.Name) in domain $($dc.Domain)."
                if($dc.Domain -eq $DomainName)
                {
                    Write-Verbose -Message "Current node $($dc.Name) is already a domain controller for $($dc.Domain)."
                    $returnValue.Ensure = $true
                }
            }
            catch
            {
                Write-Verbose -Message "No domain controllers could be contacted for $DomainName"
            }
        }
    }
    catch
    {
        Write-Error -Message "Target Machine is not running AD WS, and hence is not a domain controller"
        throw $_
    }
    $returnValue
}


function Set-TargetResource
{
    param
    (
        [Parameter(Mandatory)]
        [String]$DomainName,

        [Parameter(Mandatory)]
        [PSCredential]$DomainAdministratorCredential,

        [Parameter(Mandatory)]
        [PSCredential]$SafemodeAdministratorPassword
    )
    
    $parameters = $PSBoundParameters.Remove("Debug");
    $state = Test-TargetResource @PSBoundParameters
    if( $state -eq $true )
    {
        Write-Verbose -Message "Already at desired state. Returning."
        return
    }

    Write-Verbose -Message "Checking if Domain $DomainName is present ..."
    # Check if the domain exists
    $domain = $null;
    try
    {
        $domain = Get-ADDomain -Identity $DomainName -Credential $DomainAdministratorCredential
    }
    catch
    {
        Write-Error -Message "Domain $DomainName could not be found. Assert a domain resource first."
        throw (new-object -TypeName System.InvalidOperationException -ArgumentList "Domain $DomainName could not be found.")
    }

    Write-Verbose -Message "Verified that Domain $DomainName is present in the network. Going on to create the domain controller."

    Install-ADDSDomainController -DomainName $DomainName -Force -Verbose:$false -NoRebootOnCompletion `
                        -SafeModeAdministratorPassword $SafemodeAdministratorPassword.Password `
                        -Credential $DomainAdministratorCredential
                
    Write-Verbose -Message "Node is now a domain controller for $DomainName"
    Write-Verbose -Message "Indicating to LCM that system needs reboot."
    $global:DSCMachineStatus = 1 

}


function Test-TargetResource
{
    [OutputType([System.Boolean])]
    param
    (
        [Parameter(Mandatory)]
        [String]$DomainName,

        [Parameter(Mandatory)]
        [PSCredential]$DomainAdministratorCredential,

        [Parameter(Mandatory)]
        [PSCredential]$SafemodeAdministratorPassword
    )

    try
    {
        $parameters = $PSBoundParameters.Remove("Debug");
        $existingResource = Get-TargetResource @PSBoundParameters
        $existingResource.Ensure
    }
    # If the domain doesn't exist
    catch
    {
        Write-Error -Message "Domain $DomainName is NOT present on the node"
        throw $_
    } 
}