DSCResources/cDtcResource_cDtc/cDtcResource_cDtc.psm1

function Get-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Collections.Hashtable])]
    param
    (
        [parameter(Mandatory = $true)]
        [System.String]
        $InstanceName,

        [parameter(Mandatory = $true)]
        [ValidateSet("Present","Absent")]
        [System.String]
        $Ensure,

        [parameter(Mandatory = $true)]
        [ValidateSet("NoAuth","Mutual","Incoming")]
        [System.String]
        $AuthenticationLevel,

        [parameter(Mandatory = $true)]
        [ValidateSet("Started","Stopped")]
        [System.String]
        $Status,

        [parameter(Mandatory = $true)]
        [System.Boolean]
        $InboundTransactionsEnabled,

        [parameter(Mandatory = $true)]
        [System.Boolean]
        $OutboundTransactionsEnabled,

        [parameter(Mandatory = $true)]
        [System.Boolean]
        $RemoteClientAccessEnabled,

        [parameter(Mandatory = $true)]
        [System.Boolean]
        $RemoteAdministrationAccessEnabled,

        [parameter(Mandatory = $true)]
        [System.Boolean]
        $XATransactionsEnabled,

        [parameter(Mandatory = $true)]
        [System.Boolean]
        $LUTransactionsEnabled
    )

    #Write-Verbose "Use this cmdlet to deliver information about command processing."

    #Write-Debug "Use this cmdlet to write debug information while troubleshooting."
    
    Write-Verbose 'Entered Get() method 0.0.1'

    $dtc = Get-Dtc -DtcName $InstanceName
    $present = IsDtcPresent $InstanceName
    $dtcNetworkSetting = Get-DtcNetworkSetting -DtcName $InstanceName

    if($present)
    {
      $_ensure = "Present"
    }
    else
    {
      return @{
        Ensure = "Absent"
      }
    }

    return @{
      InstanceName                      = $dtc.DtcName
      Ensure                            = $_ensure
      Status                            = $dtc.Status
      AuthenticationLevel               = $dtcNetworkSetting.AuthenticationLevel
      InboundTransactionsEnabled        = $dtcNetworkSetting.InboundTransactionsEnabled
      OutboundTransactionsEnabled       = $dtcNetworkSetting.OutboundTransactionsEnabled
      RemoteClientAccessEnabled         = $dtcNetworkSetting.RemoteClientAccessEnabled
      RemoteAdministrationAccessEnabled = $dtcNetworkSetting.RemoteAdministrationAccessEnabled
      XATransactionsEnabled             = $dtcNetworkSetting.XATransactionsEnabled
      LUTransactionsEnabled             = $dtcNetworkSetting.LUTransactionsEnabled
    }

    <#
    $returnValue = @{
    InstanceName = [System.String]
    Ensure = [System.String]
    AuthenticationLevel = [System.String]
    Status = [System.String]
    InboundTransactionsEnabled = [System.Boolean]
    OutboundTransactionsEnabled = [System.Boolean]
    RemoteClientAccessEnabled = [System.Boolean]
    RemoteAdministrationAccessEnabled = [System.Boolean]
    XATransactionsEnabled = [System.Boolean]
    LUTransactionsEnabled = [System.Boolean]
    }
 
    $returnValue
    #>

}


function Set-TargetResource
{
    [CmdletBinding()]
    param
    (
        [parameter(Mandatory = $true)]
        [System.String]
        $InstanceName,

        [parameter(Mandatory = $true)]
        [ValidateSet("Present","Absent")]
        [System.String]
        $Ensure,

        [parameter(Mandatory = $true)]
        [ValidateSet("NoAuth","Mutual","Incoming")]
        [System.String]
        $AuthenticationLevel,

        [parameter(Mandatory = $true)]
        [ValidateSet("Started","Stopped")]
        [System.String]
        $Status,

        [parameter(Mandatory = $true)]
        [System.Boolean]
        $InboundTransactionsEnabled,

        [parameter(Mandatory = $true)]
        [System.Boolean]
        $OutboundTransactionsEnabled,

        [parameter(Mandatory = $true)]
        [System.Boolean]
        $RemoteClientAccessEnabled,

        [parameter(Mandatory = $true)]
        [System.Boolean]
        $RemoteAdministrationAccessEnabled,

        [parameter(Mandatory = $true)]
        [System.Boolean]
        $XATransactionsEnabled,

        [parameter(Mandatory = $true)]
        [System.Boolean]
        $LUTransactionsEnabled
    )

    #Write-Verbose "Use this cmdlet to deliver information about command processing."

    #Write-Debug "Use this cmdlet to write debug information while troubleshooting."

    #Include this line if the resource requires a system reboot.
    #$global:DSCMachineStatus = 1

    Write-Verbose 'Entered Set() method 0.0.1'

    $dtc = Get-Dtc -DtcName $InstanceName
    $present = IsDtcPresent $InstanceName

    if($present -and $Ensure -eq "Absent")
    {
      Write-Verbose 'Uninstalling MS DTC'

      Uninstall-Dtc -Confirm $true
      return
    }

    if(-not $present -and $Ensure -eq "Present")
    {
      Write-Verbose 'Installing MS DTC'

      Install-Dtc
    }

    Set-DtcNetworkSetting `
      -DtcName $InstanceName `
      -AuthenticationLevel $AuthenticationLevel `
      -InboundTransactionsEnabled $InboundTransactionsEnabled `
      -OutboundTransactionsEnabled $OutboundTransactionsEnabled `
      -RemoteClientAccessEnabled $RemoteClientAccessEnabled `
      -RemoteAdministrationAccessEnabled $RemoteAdministrationAccessEnabled `
      -XATransactionsEnabled $XATransactionsEnabled `
      -LUTransactionsEnabled $LUTransactionsEnabled

    if($Status -eq "Stopped")
    {
      Write-Verbose 'Stopping MS DTC'

      Stop-Dtc
    } 
    else 
    {
      Write-Verbose 'Starting MS DTC'

      Start-Dtc
    }
}


function Test-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Boolean])]
    param
    (
        [parameter(Mandatory = $true)]
        [System.String]
        $InstanceName,

        [parameter(Mandatory = $true)]
        [ValidateSet("Present","Absent")]
        [System.String]
        $Ensure,

        [parameter(Mandatory = $true)]
        [ValidateSet("NoAuth","Mutual","Incoming")]
        [System.String]
        $AuthenticationLevel,

        [parameter(Mandatory = $true)]
        [ValidateSet("Started","Stopped")]
        [System.String]
        $Status,

        [parameter(Mandatory = $true)]
        [System.Boolean]
        $InboundTransactionsEnabled,

        [parameter(Mandatory = $true)]
        [System.Boolean]
        $OutboundTransactionsEnabled,

        [parameter(Mandatory = $true)]
        [System.Boolean]
        $RemoteClientAccessEnabled,

        [parameter(Mandatory = $true)]
        [System.Boolean]
        $RemoteAdministrationAccessEnabled,

        [parameter(Mandatory = $true)]
        [System.Boolean]
        $XATransactionsEnabled,

        [parameter(Mandatory = $true)]
        [System.Boolean]
        $LUTransactionsEnabled
    )

    #Write-Verbose "Use this cmdlet to deliver information about command processing."

    #Write-Debug "Use this cmdlet to write debug information while troubleshooting."

    Write-Verbose 'Entered Test() method 0.0.1'

    $dtc = Get-Dtc -DtcName $InstanceName
    $present = IsDtcPresent $InstanceName
    $dtcNetworkSetting = Get-DtcNetworkSetting -DtcName $InstanceName
    
    if(-not $present -and $Ensure -eq 'Absent')
    {
      return $true
    }

    if(-not $present -and $Ensure -eq 'Present')
    {
      Write-Verbose 'DTC is not installed'
      return $false
    }

    if(-Not $present -and $Ensure -eq "Absent")
    {
      Write-Verbose 'DTC is absent when Ensure is set to Absent'
      return $true;
    }

    if(-Not $present -and $Ensure -eq "Present")
    {
      Write-Verbose 'DTC is absent when Ensure is set to Present'
      return $false;
    }

    if($present -and $Ensure -eq "Absent")
    {
      Write-Verbose 'DTC is present when Ensure is set to Absent'
      return $false;
    }

    if($dtc.DtcName -ne $InstanceName)
    {
      Write-Verbose 'DTC instance name mismatch'
      return $false
    }

    if($dtc.Status -ne $Status) 
    {
      Write-Verbose 'DTC status mismatch'
      return $false
    }

    if($dtcNetworkSetting.AuthenticationLevel -ne $AuthenticationLevel)
    {
      Write-Verbose 'DTC authentication level mismatch'
      return $false
    }

    if($dtcNetworkSetting.InboundTransactionsEnabled -ne $InboundTransactionsEnabled)
    {
      Write-Verbose 'DTC inbound transaction enabled mismatch'
      return $false
    }

    if($dtcNetworkSetting.OutboundTransactionsEnabled -ne $OutboundTransactionsEnabled)
    {
      Write-Verbose 'DTC outbound transaction enabled mismatch'
      return $false
    }

    if($dtcNetworkSetting.RemoteClientAccessEnabled -ne $RemoteClientAccessEnabled)
    {
      Write-Verbose 'DTC remote client access enabled mismatch'
      return $false
    }

    if($dtcNetworkSetting.RemoteAdministrationAccessEnabled -ne $RemoteAdministrationAccessEnabled)
    {
      Write-Verbose 'DTC remote administration access enabled mismatch'
      return $false
    }

    if($dtcNetworkSetting.XATransactionsEnabled -ne $XATransactionsEnabled)
    {
      Write-Verbose 'DTC XA transaction enabled mismatch'
      return $false
    }

    if($dtcNetworkSetting.LUTransactionsEnabled -ne $LUTransactionsEnabled)
    {
      Write-Verbose 'DTC LU transaction enabled mismatch'
      return $false
    }

    return $true

    <#
    $result = [System.Boolean]
     
    $result
    #>

}

function IsDtcPresent
{
  [OutputType([System.Boolean])]
  param(
    [string] $InstanceName
  )
  Write-Verbose 'Check if DTC is present'

  $dtc = Get-Dtc -DtcName $InstanceName

  return $dtc -ne $null
}

Export-ModuleMember -Function *-TargetResource