Automate Exchange 2016 installation and DAG configuration with PowerShell DSC

Hi, folks!

Version 1.0 has already been published here (simple script for automation of Exchange 2016 installation. can be used on multiple servers).

Today’s version is a little bit improved (2 separate files for 2-node configuration, 535 and 420 strings respectively, can be easy scaled out with copy-paste to more than 2 nodes). It helps you to install Exchange, prepare environment for DAG (prestage CNO, witness and etc) and create one with at least 2 members

Each node can be configured simultaneously (it’s not needed to wait while fist node finishes all tasks and etc. just run both scripts, relax and get a cup of coffee). It’s also ideally suitable for using as a part of VMM Service Templates or other kinds of unattended installations (I’ll show you it later)

If you’d like to get script files – write me directly or leave request in the comments. I’ll send you zip-file.

Update: scripts are at my GitHub Repo. Thanks for stars and commits!

What does script do (exch01.ps1)?

  • Sets network settings (DNS, IP, GW) on targeted server
#..........
xIPAddress NewIPAddress #Set IPv4 on Ethernet adapter
        {
            IPAddress      = $ip
            InterfaceAlias = "Ethernet"
            SubnetMask     = 24
            AddressFamily  = "IPV4"
            DependsOn       = "[xDhcpClient]DisabledDhcpClient"
        }
         xDefaultGatewayAddress GW #Set GW address
        {
            Address = $gw
            InterfaceAlias = "Ethernet"
            AddressFamily = "IPv4"
            DependsOn     = "[xIPAddress]NewIPAddress"
        }
#...........
  • Installs required prerequisites for Exchange (including UCMA) and does reboot if it’s really required
#........
 WindowsFeature WebNet45
        {
            Ensure = 'Present'
            Name = 'Web-Net-Ext45'
        }
     WindowsFeature WebReq
        {
            Ensure = 'Present'
            Name = 'Web-Request-Monitor'
        }
     WindowsFeature WebSrv
        {
            Ensure = 'Present'
            Name = 'Web-Server'
        }
#.........
  • Adds server to domain and reboots it to apply changes
 xComputer DomainJoin
        {
          Name = $nodename
          DomainName = $domainname
          Credential = $creds
          DependsOn  = "[xDnsServerAddress]DNSServers"
        }
  • Setups Exchange and checks if reboot is required after installation
 xExchInstall InstallExchange
        {
            Path       = "C:\ExchInstall\Exch\Setup.exe"
            Arguments  = "/mode:Install /role:Mailbox /OrganizationName:""$netbios"" /Iacceptexchangeserverlicenseterms"
            Credential = $Creds

            DependsOn  = '[xPendingReboot]BeforeExchangeInstall'
        }
  • Adds and checks that DAG CNO is existed and required permissions are applied
#...........
SetScript = {
                    $creds = New-Object Management.Automation.PSCredential("$($using:netbios)\Administrator",(ConvertTo-SecureString $using:pass -AsPlainText -Force))
                    New-ADComputer -Name DAG01 -DNSHostName DAG01 -DisplayName DAG01 -Enabled $false -Credential $creds -verbose
                    $DC=(Get-ADDomainController -Credential $creds).HostName
                    ICM -ComputerName $DC -Credential $creds -ScriptBlock {
                    #Variables
                    $dagacc = Get-ADComputer DAG01 #-Credential $creds
                    $dagldap="LDAP" + '://' + $dagacc.DistinguishedName
                    $dagadsi = New-Object DirectoryServices.DirectoryEntry $dagldap
                    #.....
                    }
#...........
  • Configures witness server, DAG and generates status of successful completion
#........
xExchDatabaseAvailabilityGroup DAG
        {
            Name                                 = $dagSettings.DAGName
            Credential                           = $creds
            AutoDagTotalNumberOfServers          = $dagSettings.AutoDagTotalNumberOfServers
            AutoDagDatabaseCopiesPerVolume       = $dagSettings.AutoDagDatabaseCopiesPerVolume
           #.......
            WitnessDirectory                     = 'C:\FSW'
            WitnessServer                        = $dagSettings.WitnessServer
        }
#.........

Script file named as exch02.ps1 has almost the same steps with the following differences:

  1. Waits while Exchange setup initiated on the first node finishes Active Directory preparation and then starts Exchanges installation on the second node
  2. Waits while DAG becomes online and only then starts adding the second node
  3.  No witness and DAG CNO preparation (hope it’s clear)

Requirements are still the same: exchange media, UCMA package, certificates for securing MOF-files (optional). All prerequisites (except Exchange media files) are in the zip-file (all-in-one).

Thanks for reading and have a nice week!

System Center 2016 summary highlights

System Center 2016 makes it easy to deploy, configure, manage and monitor your virtualized workloads, software-defined datacenter and hybrid cloud infrastructure. Enabling a comprehensive datacenter management solution support for everything from provisioning the physical and virtual infrastructure to IT process and service management.

System Center 2016 is now available (..and even more..we already have an Update Rollup 1 published yesterday) and offers an array of new capabilities across components:

System Center 2016 Features and What's New

To get more information about updated and completely new features – download  and check out the white paper “What’s New In System Center 2016”  (12 pages, PDF)