DSC myAdExchPrepareSchema.psm1
How to Exchange Prepare Schema with PowerShell DSC During some automatized deployments, as often, we have 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]$Path, 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’) }