DSC, Exchange, PowerShell

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’)     }