Jean-Yves Moschetto's blog

Tip and tricks on Microsoft products

NAVIGATION - SEARCH

DSC myAdExchPrepareSchema.psm1

How to Exchange Prepare Schema with PowerShell DSC

During some automatized deployments, I had, as often, to deploy Microsoft Exchange 2016 automatically.

 

The well-known module https://www.powershellgallery.com/packages/xExchange/ does many things, but no Exchange preparation on a fresh AD.

Here is a simple DSC Code which
  • checks if AD schema is at the right version
  • if not, launch Exchange setup with the correct parameters

Code

Import-Module $PSScriptRoot\..\myAdHelper.psm1 -Verbose:$false
function Get-TargetResource
{
    param
 (
  [System.String]$ExchSchemaVersion,
  [parameter(Mandatory = $true)]
  [System.String]$Path,
  [parameter(Mandatory = $true)]
  [System.String]$Arguments,
  [System.Management.Automation.PSCredential]$Credential
    )
 $Schema = ReplacePartitionTokens -Identity "%%schema%%" -Credential $Credential
 myGetAdObject -Identity "CN=ms-Exch-Schema-Version-Pt,$Schema" -Credential $Credential -Properties @('rangeUpper')
 
}

function Set-TargetResource
{
    [CmdletBinding()]
    param
    (
  [System.String]$ExchSchemaVersion,
  [parameter(Mandatory = $true)]
  [System.String]$Path,
  [parameter(Mandatory = $true)]
  [System.String]$Arguments,
  [System.Management.Automation.PSCredential]$Credential
    )
 
 StartAndWaitWaitForProcessEnd -Path $Path -Arguments $Arguments -Credential $Credential -Delay 7200 -Verbose -TaskName 'EXCHANGE - PrepareSchema' -ProcessToWaitFor 'ExSetup*'
 
}

function Test-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Boolean])]
    param
    (
  [System.String]$ExchSchemaVersion,
  [parameter(Mandatory = $true)]
  [System.String]$Path,
  [parameter(Mandatory = $true)]
  [System.String]$Arguments,
  [System.Management.Automation.PSCredential]$Credential
    )
 $Result = $true
 
 $Version = Get-TargetResource @PSBoundParameters
 
 if ($Version)
 {
  if ([uint32]$Version.rangeUpper -lt [uint32]$ExchSchemaVersion)
  {
   $Result = $false
  }
 }
 else
 {
  $Result = $false
 }
 
 $result
}
Export-ModuleMember -Function *-TargetResource

Module Call

    myAdExchPrepareSchema ExchangePrepareSchema
    {
     ExchSchemaVersion = '15317'   #CU3 15326
     Path = "$($ConfigurationData.Binaries.Exchange2016)\Setup.exe"
     Arguments = '/PrepareSchema /IAcceptExchangeServerLicenseTerms'
     Credential = $DscCredentials
     DependsOn = @('[xPendingReboot]BeforeExchangePreparation')
    }
 

Add comment