Installing Exchange Using DSC - Managing Exchange 2013 With DSC - Part 5


Managing Exchange 2013 With DSC

Part 1 - Introducing xExchange

Part 2 - The QuickStart Template

Part 3 - Automating Mount Point Setup and Maintenance for AutoReseed

Part 4 - Using a DSC Pull Server to Deploy the xExchange Module

Part 5 - Installing Exchange Using DSC

 

Installing Exchange Using DSC

Hey Everyone. Sorry for the lack of updates in this blog series lately. We've been busy working on a major update to the xExchange module, which includes the ability to install Exchange, as well as to automate Jetstress (separate blog post coming soon). As a reminder, you can download the latest version of xExchange from the PowerShell Gallery here.

For this post, I'll be talking about using Desired State Configuration to automate the installation of Exchange 2013 with the new xExchInstall resource. I'll cover how to use the resource, why the resource does what it does, and how to monitor and troubleshoot the resource.

 

The xExchInstall Resource

The xExchInstall resource is relatively simple to configure, as it only contains three parameters, all of which are required (see this article for help installing Exchange using unattended mode):

  • Path: This is the full path to setup.exe in the Exchange 2013 setup directory.

  • Arguments: These are the command line arguments to pass into setup.exe. They are used the same as if you were calling setup.exe from the Command Prompt.

  • Credential: These are the credentials used to perform the installation.

 

 Here's a simple example of how to use the resource:

xExchInstall InstallExchange
{
    Path       = "C:\Binaries\E15CU7\Setup.exe"
    Arguments  = "/mode:Install /role:Mailbox,ClientAccess /Iacceptexchangeserverlicenseterms"
    Credential = $Creds
}

 

Using the resource like this would be equivalent to going in the Exchange setup directory with Command Prompt, and running:

setup /mode:Install /role:Mailbox,ClientAccess /Iacceptexchangeserverlicenseterms"

 

Using xExchInstall In A Script

For this example, I'm using a slightly modified version of the InstallExchange example which ships with xExchange (as of v1.0.3.6). This is located in the xExchange module folder underneath Examples\InstallExchange.

Configuration InstallExchange
{
    param
    (
        [PSCredential]$Creds
    )

    Import-DscResource -Module xExchange
    Import-DscResource -Module xPendingReboot

    Node $AllNodes.NodeName
    {
        LocalConfigurationManager
        {
            CertificateId      = $Node.Thumbprint
        }

        xPendingReboot BeforeExchangeInstall
        {
            Name      = "BeforeExchangeInstall"
        }

        xExchInstall InstallExchange
        {
            Path       = "C:\Binaries\E15CU7\Setup.exe"
            Arguments  = "/mode:Install /role:Mailbox,ClientAccess /Iacceptexchangeserverlicenseterms"
            Credential = $Creds

            DependsOn  = '[xPendingReboot]BeforeExchangeInstall'
        }

        xPendingReboot AfterExchangeInstall
        {
            Name      = "AfterExchangeInstall"

            DependsOn = '[xExchInstall]InstallExchange'
        }
    }
}

The only thing to really note here is that I chose to use the xPendingReboot module/resource (download here) to see if reboots are pending both before and after the installation of Exchange. The one before the installation isn't necessarily required, but can help the Exchange installation process to run more smoothly. I definitely recommend using the xPendingReboot after the install, as a reboot is almost always required after applying an Exchange 2013 Cumulative Update. If you want to use the same xPendingReboot resources in your script, you will need to make sure to download xPendingReboot and put in in the C:\Program Files\WindowsPowerShell\Modules directory.

 

Script Execution Behavior

When the script is successfully executed, the xExchInstall resource will behave in one of two different ways. Either it will proceed all the way through, and won't require a reboot until after Exchange is installed (see Behavior 2), or it will want to reboot the server before Exchange setup has even begun (Behavior 1). These behaviors are independent from reboots that may be caused by the xPendingReboot resources.

 

Behavior 1

The first behavior I'll describe is the most common behavior I've seen so far. This is the behavior that people running Windows Management Framework 4 should see (WMF5 is NOT CURRENTLY SUPPORTED with Exchange 2013). When you execute the script in Verbose mode, you'll see Verbose output similar to the following:

[[xExchInstall]InstallExchange] Entering function 'Test-TargetResource'. Notable parameters: Arguments = '/mode:Install /role:Mailbox,ClientAccess /Iacceptexchangeserverlicenseterms', Path = 'C:\Binaries\E15CU7\Setup.exe'
[[xExchInstall]InstallExchange] Exchange is either not installed, or a previous install only partially completed.
[[xExchInstall]InstallExchange] in 1.7030 seconds.
[[xExchInstall]InstallExchange]
[[xExchInstall]InstallExchange] Entering function 'Set-TargetResource'. Notable parameters: Arguments = '/mode:Install /role:Mailbox,ClientAccess /Iacceptexchangeserverlicenseterms', Path = 'C:\Binaries\E15CU7\Setup.exe'
[[xExchInstall]InstallExchange] Value 'UpdatedConfig' missing from registry key HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WSMAN. Running: winrm i restore winrm/config
[[xExchInstall]InstallExchange] Machine needs to be rebooted before Exchange setup can proceed

[[xExchInstall]InstallExchange] in 1.8030 seconds.

What's happening here is that xExchInstall has detected that certain WSMan registry keys are not present, has decided to configure WSMan using the command 'winrm i restore winrm/config', and is waiting for a reboot to occur before starting the install. Once the machine has been rebooted, the installation should begin automatically.

The reason this pre-configuration of WinRM occurs is to prevent an issue which can occur later in Exchange setup. During setup, Exchange checks for the presence of a few registry keys to determine if WinRM is configured correctly. If any of those keys are missing, setup runs 'winrm i restore winrm/config', then attempts to restart the WinRM service. Because a DSC configuration is actively running, the stop of the WinRM service fails, which then causes Exchange setup to fail. To pre-empt this condition, xExchInstall looks for these registry keys itself, and if they're missing or not configured, runs the above winrm command before Exchange setup has a chance to try.

Here's a full screenshot of this behavior:

 

Behavior 2

The less common behavior is for xExchInstall to go through the whole setup process, and not require a reboot at all (the xPendingReboot resource may still force a reboot after setup has completed). This would occur if you manually ran 'winrm i restore winrm/config' prior to the install, or possibly if you had WMF5 installed (again, WMF5 is NOT CURRENTLY SUPPORTED with Exchange 2013).

With this behavior, xExchInstall will launch Setup.exe (which then launches ExSetup.exe), and then will report to the screen every minute that setup is still running until it has completed:

 

Monitoring Install Progress

If you are installing Exchange using a DSC pull server, or if you experience Behavior 1 from above, it can be difficult to tell exactly what is happening with the xExchInstall resource. The following are different approaches you can use to determine if Exchange setup is running, and if it has encountered any issues.

 

Look for the ExSetup.exe Process

One way to determine if setup is running is to log on to the machine where Exchange is being installed, and look for the ExSetup.exe process in Task Manager:

 

You could also use the Get-Process cmdlet to inspect whether the ExSetup.exe process exists on a remote machine:

 

Look in the Exchange Setup Logs

As with troubleshooting any Exchange Setup issue, another place you can look is the C:\ExchangeSetupLogs folder. In ExchangeSetup.log, you can see the exact status of the install, and determine whether it is currently running, or whether it failed or succeeded.

 

Use the xDscDiagnostics Module

Another way to determine what xExchInstall is doing is to use the xDscDiagnostics module (download here). This blog does a great job explaining how to use the module.

After downloading and installing the module, the first thing you'll want to do is enable Analytic logging using the Update-xDscEventLogStatus cmdlet. This must be done prior to running the script to install Exchange:

 

After you've started the script containing xExchInstall, use Get-xDscOperation to find the appropriate SequenceId (for me it was always Id 1):

 

Once you've located the correct SequenceId, use Trace-xDscOperation to see all events:

 

You can use the .Message property of the Trace-xDscOperation output variable to make it easier to see the Verbose output that was logged:

 

After you're done troubleshooting, make sure to turn logging back off:

Comments (14)

  1. DJ Grijalva says:

    Thanks for getting this done!

  2. DJ Grijalva says:

    Any thoughts into parsing the "Arguments" parameter and reading what roles are to be installed and verifying they are installed? Say they start out with only the Mailbox role then want to add the CAS role, the check never looks to see if the roles are
    different from whats on the server to what's in the arguments.

  3. That definitely seems possible, I just haven't heard anyone request it yet. Also not sure how common of a scenario that is. It would help to know how often people change roles on installed servers. Function IsSetupPartiallyCompleted in MiscxExchangeCommon.psm1
    already checks the keys that indicate whether the various roles have been fully installed or not, so it probably wouldn't be too difficult to parse the Arguments parameter and do some additional role based checks. A similar feature I think would be kind of
    neat would be if the resource could optionally look at the installed version so that it could be used for upgrades as well, rather than just initial installs. I think that would be applicable to lots of people.

  4. For getting the version, I'd either use the Exchange Management Shell, or the registry. In the registry, you can check HKLMSOFTWAREMicrosoftExchangeServerV15Setup, and look at MsiBuildMajor and MsiBuildMinor. Alternately you can run Get-ExchangeServer
    and check AdminDisplayVersion. Either of these should be updated when you install a CU. You could compare those values to known versions (assuming you've installed that CU before and have checked what it uses), or possibly by looking at the version property
    of setup.exe. I don't think the Minor version always gets put on that file though, so that may not be completely reliable.

  5. Hi Mike,
    first of all: Great stuff!
    I'm wondering how you manage upgrades of CU's? I'm currently working on a workflow to implement this. Maybe you have some hints? My first idea is to check registry for version and depending on the values initiate an installation with the mode 'upgrade'.
    Thanks!
    Ciao,
    Ingo

  6. Thanks Mike,

    That was my idea, using the registry.

    Ciao,
    Ingo

  7. John says:

    Hi Mike,

    Thank you for your article! I'm unfortunately running into trouble during the installation. Exchange is successfully installed (no error in Exchange's logs) but the script stops with the following error :

    The PowerShell DSC resource MSFT_xExchInstall threw one or more non-terminating errors while running the Set-TargetResource functionality. These errors are

    logged to the ETW channel called Microsoft-Windows-DSC/Operational. Refer to this channel for more details.
    + CategoryInfo : InvalidOperation: (:) [], CimException
    + FullyQualifiedErrorId : NonTerminatingErrorFromProvider
    + PSComputerName : exchange3

    The SendConfigurationApply function did not succeed.
    + CategoryInfo : NotSpecified: (root/Microsoft/...gurationManager:String) [], CimException
    + FullyQualifiedErrorId : MI RESULT 1
    + PSComputerName : exchange3

    Any idea of what could cause this error? Thanks!

    John

  8. Hi John, can you run with the -Verbose switch, and send all the output that precedes this error? That will give me some indication of how far the resource got before failing. Also, are you positive Exchange is successfully installed? If you try to run
    the setup GUI manually, does it report that a previous installation was detected?

  9. John says:

    Hi Mike,

    Thank you Mike for your support, The Exchange server wasn't properly installed, after fixing this issue, the script worked perfectly!

  10. Ken says:

    Hi Mike,
    This is a great series of articles and the presentation at ignite was great as well. Thanks for all of your work on this.

    One question... Whenever I add a TargetDir:"C:Program FilesMicrosoftExchange" it errors with "The filename or extension is too long". Have you used the TargetDir parameter?
    Arguments from the ps1 file:
    Arguments = '/mode:Install /r:CA /TargetDir:"C:Program FilesMicrosoftExchange Server" /IAcceptExchangeServerLicenseTerms'

    Error using diagnostics module:

    [[xExchInstall]InstallExchange] Task Action: C:BinariesExchangeSetup.exe /m
    ode:Install /r:CA /TargetDir:"C:Program FilesMicrosoftExchange Server" /IAcceptExchangeServerLicenseTerms
    Message The filename or extension is too long.

    HResult -2146233087
    StackTrack at System.Management.Automation.Interpreter.ThrowInstruction.Run(InterpretedFrame frame)
    at System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(InterpretedFrame frame)
    This event indicates that failure happens when LCM is processing the configuration. ErrorId is 0x1. ErrorDetail is The
    SendConfigurationApply function did not succeed.. ResourceId is [xExchInstall]InstallExchange and SourceInfo is C:DscS
    criptsInstallExchange.ps1::35::9::xExchInstall. ErrorMessage is PowerShell DSC resource MSFT_xExchInstall
    failed to execute Set-TargetResource functionality with error message: The filename or extension is too long.
    .

  11. Hi Ken,
    I have not tried using the TargetDir parameter before. I'll see if I can reproduce this, and if so, add it as a known issue for xExchange so that we can fix it in the future.

    Also, just FYI, if you come across issues like this, you can also report them as an Issue directly on GitHub, which is the new home for development of this module:

    https://github.com/powershell/xexchange/issues

    Thanks.

  12. Ken says:

    Hi Mike,
    I've submitted this on GitHub. Thanks.

  13. (Posted this on GitHub too. Feel free to respond there.)
    I can't seem to reproduce this. I tried installing Exchange 2013 CU9 on a fresh Windows 2012 R2 machine with WMF4, and all the latest Windows Updates. Is you environment or script any different? Here's the script I used:

    Configuration InstallExchange
    {
    param
    (
    [PSCredential]$Creds
    )

    Import-DscResource -Module xExchange

    Node $AllNodes.NodeName
    {
    LocalConfigurationManager
    {
    CertificateId = $Node.Thumbprint
    }

    #Do the Exchange install
    xExchInstall InstallExchange
    {
    Path = "C:E15CU9Setup.exe"
    Arguments = '/mode:Install /role:CA /TargetDir:"C:Program FilesMicrosoftExchange Server" /Iacceptexchangeserverlicenseterms'
    Credential = $Creds
    }
    }
    }

    if ($Creds -eq $null)
    {
    $Creds = Get-Credential -Message "Enter credentials for establishing Remote Powershell sessions to Exchange"
    }

    ###Compiles the example
    InstallExchange -ConfigurationData $PSScriptRootInstallExchange-Config.psd1 -Creds $Creds

    ###Sets up LCM on target computers to decrypt credentials, and to allow reboot during resource execution
    #Set-DscLocalConfigurationManager -Path .InstallExchange -Verbose

    ###Pushes configuration and waits for execution
    #Start-DscConfiguration -Path .InstallExchange -Verbose -Wait

  14. Siri says:

    I am getting following error after execuing xExchinstall config....Any pointers on what could be the issue?
    he user name or password is incorrect.
    + CategoryInfo : AuthenticationError: (PS_ScheduledTask:) [], CimException
    + FullyQualifiedErrorId : HRESULT 0x8007052e,Set-ScheduledTask
    + PSComputerName : Server3

    VERBOSE: [Server3]: LCM: [ End Set ] [[xExchInstall]InstallExchange] in 2767.2180 seconds.
    The PowerShell provider MSFT_xExchInstall threw one or more non-terminating errors while running the
    Set-TargetResource functionality. These errors are logged to the ETW channel called Microsoft-Windows-DSC/Operational.
    Refer to this channel for more details.
    + CategoryInfo : InvalidOperation: (:) [], CimException
    + FullyQualifiedErrorId : NonTerminatingErrorFromProvider
    + PSComputerName : Server3

    VERBOSE: [Seerver3]: LCM: [ End Set ]
    The SendConfigurationApply function did not succeed.
    + CategoryInfo : NotSpecified: (root/Microsoft/...gurationManager:String) [], CimException
    + FullyQualifiedErrorId : MI RESULT 1
    + PSComputerName : Server3

    VERBOSE: Operation 'Invoke CimMethod' complete.
    VERBOSE: Time taken for configuration job to complete is 2867.623 seconds

Skip to main content