DSCResources/DSC_ExchMailboxDatabase/DSC_ExchMailboxDatabase.psm1

<#
    .SYNOPSIS
        Retrieves the current DSC configuration for this resource.
 
    .PARAMETER Name
        The Name parameter specifies the unique name of the mailbox database.
 
    .PARAMETER Credential
        Credentials used to establish a remote PowerShell session to Exchange.
 
    .PARAMETER DatabaseCopyCount
        The number of copies that the database will have once fully configured.
 
    .PARAMETER EdbFilePath
        The EdbFilePath parameter specifies the path to the database files.
 
    .PARAMETER LogFolderPath
        The LogFolderPath parameter specifies the folder location for log
        files.
 
    .PARAMETER Server
        The Server parameter specifies the server on which you want to create
        the database.
 
    .PARAMETER AdServerSettingsPreferredServer
        An optional domain controller to pass to Set-AdServerSettings
        -PreferredServer.
 
    .PARAMETER AllowFileRestore
        The AllowFileRestore parameter specifies whether to allow a database to
        be restored from a backup.
 
    .PARAMETER AllowServiceRestart
        Whether it is okay to restart the Information Store Service after
        adding a database. Defaults to $false.
 
    .PARAMETER AutoDagExcludeFromMonitoring
        The AutoDagExcludedFromMonitoringparameter specifies whether to
        exclude the mailbox database from the ServerOneCopyMonitor, which
        alerts an administrator when a replicated database has only one healthy
        copy available.
 
    .PARAMETER BackgroundDatabaseMaintenance
        The BackgroundDatabaseMaintenance parameter specifies whether the
        Extensible Storage Engine (ESE) performs database maintenance.
 
    .PARAMETER CalendarLoggingQuota
        The CalendarLoggingQuota parameter specifies the maximum size of the
        log in the Recoverable Items folder of the mailbox that stores
        changes to calendar items.
 
    .PARAMETER CircularLoggingEnabled
        The CircularLoggingEnabled parameter specifies whether circular
        logging is enabled for the database.
 
    .PARAMETER DataMoveReplicationConstraint
        The DataMoveReplicationConstraint parameter specifies the throttling
        behavior for high availability mailbox moves.
 
    .PARAMETER DeletedItemRetention
        The DeletedItemRetention parameter specifies the length of time to keep
        deleted items in the Recoverable Items\Deletions folder in mailboxes.
 
    .PARAMETER DomainController
        The DomainController parameter specifies the domain controller that's
        used by this cmdlet to read data from or write data to Active
        Directory. You identify the domain controller by its fully qualified
        domain name (FQDN). For example, dc01.contoso.com.
 
    .PARAMETER EventHistoryRetentionPeriod
        The EventHistoryRetentionPeriod parameter specifies the length of time
        to keep event data.
 
    .PARAMETER IndexEnabled
        The IndexEnabled parameter specifies whether Exchange Search indexes
        the mailbox database.
 
    .PARAMETER IsExcludedFromProvisioning
        The IsExcludedFromProvisioning parameter specifies whether to exclude
        the database from the mailbox provisioning load balancer that
        distributes new mailboxes randomly and evenly across the available
        databases.
 
    .PARAMETER IsExcludedFromProvisioningByOperator
        The IIsExcludedFromProvisioningByOperator parameter specifies whether
        to exclude the database from the mailbox provisioning load balancer
        that distributes new mailboxes randomly and evenly across the available
        databases.
 
    .PARAMETER IsExcludedFromProvisioningDueToLogicalCorruption
        The IsExcludedFromProvisioningDueToLogicalCorruption parameter
        specifies whether to exclude the database from the mailbox
        provisioning load balancer that distributes new mailboxes randomly and
        evenly across the available databases.
 
    .PARAMETER IsExcludedFromProvisioningReason
        The IsExcludedFromProvisioningReason parameter specifies the reason
        why you excluded the mailbox database from the mailbox provisioning
        load balancer.
 
    .PARAMETER IssueWarningQuota
        The IssueWarningQuota parameter specifies the warning threshold for the
        size of the mailbox.
 
    .PARAMETER IsSuspendedFromProvisioning
        The IsSuspendedFromProvisioning parameter specifies whether to exclude
        the database from the mailbox provisioning load balancer that
        distributes new mailboxes randomly and evenly across the available
        databases.
 
    .PARAMETER JournalRecipient
        The JournalRecipient parameter specifies the journal recipient to use
        for per-database journaling for all mailboxes on the database.
 
    .PARAMETER MailboxRetention
        The MailboxRetention parameter specifies the length of time to keep
        deleted mailboxes before they are permanently deleted or purged.
 
    .PARAMETER MetaCacheDatabaseMaxCapacityInBytes
        The MetaCacheDatabaseMaxCapacityInBytes parameter specifies the size of
        the metacache database in bytes. To convert gigabytes to bytes,
        multiply the value by 1024^3. For terabytes to bytes, multiply by
        1024^4.
 
    .PARAMETER MountAtStartup
        The MountAtStartup parameter specifies whether to mount the mailbox
        database when the Microsoft Exchange Information Store service starts.
 
    .PARAMETER OfflineAddressBook
        The OfflineAddressBook parameter specifies the offline address book
        that's associated with the mailbox database.
 
    .PARAMETER ProhibitSendQuota
        The ProhibitSendQuota parameter specifies a size limit for the mailbox.
        If the mailbox reaches or exceeds this size, the mailbox can't send
        new messages, and the user receives a descriptive warning message.
 
    .PARAMETER ProhibitSendReceiveQuota
        The ProhibitSendReceiveQuota parameter specifies a size limit for the
        mailbox. If the mailbox reaches or exceeds this size, the mailbox can't
        send or receive new messages. Messages sent to the mailbox are returned
        to the sender with a descriptive error message. This value effectively
        determines the maximum size of the mailbox.
 
    .PARAMETER RecoverableItemsQuota
        The RecoverableItemsQuota parameter specifies the maximum size for the
        Recoverable Items folder of the mailbox.
 
    .PARAMETER RecoverableItemsWarningQuota
        The RecoverableItemsWarningQuota parameter specifies the warning
        threshold for the size of the Recoverable Items folder for the mailbox.
 
    .PARAMETER RetainDeletedItemsUntilBackup
        The RetainDeletedItemsUntilBackup parameter specifies whether to keep
        items in the Recoverable Items\Deletions folder of the mailbox until
        the next database backup occurs.
 
    .PARAMETER SkipInitialDatabaseMount
        Whether the initial mount of databases should be skipped after database
        creation.
#>

function Get-TargetResource
{
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSDSCUseVerboseMessageInDSCResource", "")]
    [CmdletBinding()]
    [OutputType([System.Collections.Hashtable])]
    param
    (
        [Parameter(Mandatory = $true)]
        [System.String]
        $Name,

        [Parameter(Mandatory = $true)]
        [System.Management.Automation.PSCredential]
        [System.Management.Automation.Credential()]
        $Credential,

        [Parameter(Mandatory = $true)]
        [System.UInt32]
        $DatabaseCopyCount,

        [Parameter(Mandatory = $true)]
        [System.String]
        $EdbFilePath,

        [Parameter(Mandatory = $true)]
        [System.String]
        $LogFolderPath,

        [Parameter(Mandatory = $true)]
        [System.String]
        $Server,

        [Parameter()]
        [System.String]
        $AdServerSettingsPreferredServer,

        [Parameter()]
        [System.Boolean]
        $AllowFileRestore,

        [Parameter()]
        [System.Boolean]
        $AllowServiceRestart = $false,

        [Parameter()]
        [System.Boolean]
        $AutoDagExcludeFromMonitoring,

        [Parameter()]
        [System.Boolean]
        $BackgroundDatabaseMaintenance,

        [Parameter()]
        [System.String]
        $CalendarLoggingQuota,

        [Parameter()]
        [System.Boolean]
        $CircularLoggingEnabled,

        [Parameter()]
        [ValidateSet('None', 'SecondCopy', 'SecondDatacenter', 'AllDatacenters', 'AllCopies')]
        [System.String]
        $DataMoveReplicationConstraint,

        [Parameter()]
        [System.String]
        $DeletedItemRetention,

        [Parameter()]
        [System.String]
        $DomainController,

        [Parameter()]
        [System.String]
        $EventHistoryRetentionPeriod,

        [Parameter()]
        [System.Boolean]
        $IndexEnabled,

        [Parameter()]
        [System.Boolean]
        $IsExcludedFromProvisioning,

        [Parameter()]
        [System.Boolean]
        $IsExcludedFromProvisioningByOperator,

        [Parameter()]
        [System.Boolean]
        $IsExcludedFromProvisioningDueToLogicalCorruption,

        [Parameter()]
        [System.String]
        $IsExcludedFromProvisioningReason,

        [Parameter()]
        [System.String]
        $IssueWarningQuota,

        [Parameter()]
        [System.Boolean]
        $IsSuspendedFromProvisioning,

        [Parameter()]
        [System.String]
        $JournalRecipient,

        [Parameter()]
        [System.String]
        $MailboxRetention,

        [Parameter()]
        [System.Int64]
        $MetaCacheDatabaseMaxCapacityInBytes,

        [Parameter()]
        [System.Boolean]
        $MountAtStartup,

        [Parameter()]
        [System.String]
        $OfflineAddressBook,

        [Parameter()]
        [System.String]
        $ProhibitSendQuota,

        [Parameter()]
        [System.String]
        $ProhibitSendReceiveQuota,

        [Parameter()]
        [System.String]
        $RecoverableItemsQuota,

        [Parameter()]
        [System.String]
        $RecoverableItemsWarningQuota,

        [Parameter()]
        [System.Boolean]
        $RetainDeletedItemsUntilBackup,

        [Parameter()]
        [System.Boolean]
        $SkipInitialDatabaseMount
    )

    Write-FunctionEntry -Parameters @{
        'Name' = $Name
    } -Verbose:$VerbosePreference

    # Establish remote PowerShell session
    Get-RemoteExchangeSession -Credential $Credential -CommandsToLoad 'Get-MailboxDatabase', 'Set-AdServerSettings' -Verbose:$VerbosePreference

    if ($PSBoundParameters.ContainsKey('AdServerSettingsPreferredServer') -and ![System.String]::IsNullOrEmpty($AdServerSettingsPreferredServer))
    {
        Set-ADServerSettings -PreferredServer "$($AdServerSettingsPreferredServer)"
    }

    $db = Get-MailboxDatabaseInternal @PSBoundParameters

    if ($null -ne $db)
    {
        $returnValue = @{
            Name                          = [System.String] $Name
            Server                        = [System.String] $Server
            EdbFilePath                   = [System.String] $EdbFilePath
            LogFolderPath                 = [System.String] $LogFolderPath
            DatabaseCopyCount             = [System.UInt32] $DatabaseCopyCount
            AllowFileRestore              = [System.Boolean] $db.AllowFileRestore
            AutoDagExcludeFromMonitoring  = [System.Boolean] $db.AutoDagExcludeFromMonitoring
            BackgroundDatabaseMaintenance = [System.Boolean] $db.BackgroundDatabaseMaintenance
            CalendarLoggingQuota          = [System.String] $db.CalendarLoggingQuota
            CircularLoggingEnabled        = [System.Boolean] $db.CircularLoggingEnabled
            DataMoveReplicationConstraint = [System.String] $db.DataMoveReplicationConstraint
            DeletedItemRetention          = [System.String] $db.DeletedItemRetention
            EventHistoryRetentionPeriod   = [System.String] $db.EventHistoryRetentionPeriod
            IsExcludedFromProvisioning    = [System.Boolean] $db.IsExcludedFromProvisioning
            IssueWarningQuota             = [System.String] $db.IssueWarningQuota
            IsSuspendedFromProvisioning   = [System.Boolean] $db.IsSuspendedFromProvisioning
            JournalRecipient              = [System.String] $db.JournalRecipient
            MailboxRetention              = [System.String] $db.MailboxRetention
            MountAtStartup                = [System.Boolean] $db.MountAtStartup
            OfflineAddressBook            = [System.String] $db.OfflineAddressBook
            ProhibitSendQuota             = [System.String] $db.ProhibitSendQuota
            ProhibitSendReceiveQuota      = [System.String] $db.ProhibitSendReceiveQuota
            RecoverableItemsQuota         = [System.String] $db.RecoverableItemsQuota
            RecoverableItemsWarningQuota  = [System.String] $db.RecoverableItemsWarningQuota
            RetainDeletedItemsUntilBackup = [System.Boolean] $db.RetainDeletedItemsUntilBackup
            SkipInitialDatabaseMount      = [System.Boolean] $SkipInitialDatabaseMount
        }

        $serverVersion = Get-ExchangeVersionYear

        if ($serverVersion -in '2013', '2016')
        {
            $returnValue.Add('IndexEnabled', [System.Boolean] $db.IndexEnabled)
        }

        if ($serverVersion -in '2016', '2019')
        {
            $returnValue.Add('IsExcludedFromProvisioningByOperator', [System.Boolean] $db.IsExcludedFromProvisioningByOperator)
            $returnValue.Add('IsExcludedFromProvisioningDueToLogicalCorruption', [System.Boolean] $db.IsExcludedFromProvisioningDueToLogicalCorruption)
            $returnValue.Add('IsExcludedFromProvisioningReason', [System.String] $db.IsExcludedFromProvisioningReason)
        }

        if ($serverVersion -in '2019')
        {
            $returnValue.Add('MetaCacheDatabaseMaxCapacityInBytes', [System.Int64] $db.MetaCacheDatabaseMaxCapacityInBytes)
        }
    }

    $returnValue
}

<#
    .SYNOPSIS
        Sets the DSC configuration for this resource.
 
    .PARAMETER Name
        The Name parameter specifies the unique name of the mailbox database.
 
    .PARAMETER Credential
        Credentials used to establish a remote PowerShell session to Exchange.
 
    .PARAMETER DatabaseCopyCount
        The number of copies that the database will have once fully configured.
 
    .PARAMETER EdbFilePath
        The EdbFilePath parameter specifies the path to the database files.
 
    .PARAMETER LogFolderPath
        The LogFolderPath parameter specifies the folder location for log
        files.
 
    .PARAMETER Server
        The Server parameter specifies the server on which you want to create
        the database.
 
    .PARAMETER AdServerSettingsPreferredServer
        An optional domain controller to pass to Set-AdServerSettings
        -PreferredServer.
 
    .PARAMETER AllowFileRestore
        The AllowFileRestore parameter specifies whether to allow a database to
        be restored from a backup.
 
    .PARAMETER AllowServiceRestart
        Whether it is okay to restart the Information Store Service after
        adding a database. Defaults to $false.
 
    .PARAMETER AutoDagExcludeFromMonitoring
        The AutoDagExcludedFromMonitoringparameter specifies whether to
        exclude the mailbox database from the ServerOneCopyMonitor, which
        alerts an administrator when a replicated database has only one healthy
        copy available.
 
    .PARAMETER BackgroundDatabaseMaintenance
        The BackgroundDatabaseMaintenance parameter specifies whether the
        Extensible Storage Engine (ESE) performs database maintenance.
 
    .PARAMETER CalendarLoggingQuota
        The CalendarLoggingQuota parameter specifies the maximum size of the
        log in the Recoverable Items folder of the mailbox that stores
        changes to calendar items.
 
    .PARAMETER CircularLoggingEnabled
        The CircularLoggingEnabled parameter specifies whether circular
        logging is enabled for the database.
 
    .PARAMETER DataMoveReplicationConstraint
        The DataMoveReplicationConstraint parameter specifies the throttling
        behavior for high availability mailbox moves.
 
    .PARAMETER DeletedItemRetention
        The DeletedItemRetention parameter specifies the length of time to keep
        deleted items in the Recoverable Items\Deletions folder in mailboxes.
 
    .PARAMETER DomainController
        The DomainController parameter specifies the domain controller that's
        used by this cmdlet to read data from or write data to Active
        Directory. You identify the domain controller by its fully qualified
        domain name (FQDN). For example, dc01.contoso.com.
 
    .PARAMETER EventHistoryRetentionPeriod
        The EventHistoryRetentionPeriod parameter specifies the length of time
        to keep event data.
 
    .PARAMETER IndexEnabled
        The IndexEnabled parameter specifies whether Exchange Search indexes
        the mailbox database.
 
    .PARAMETER IsExcludedFromProvisioning
        The IsExcludedFromProvisioning parameter specifies whether to exclude
        the database from the mailbox provisioning load balancer that
        distributes new mailboxes randomly and evenly across the available
        databases.
 
    .PARAMETER IsExcludedFromProvisioningByOperator
        The IIsExcludedFromProvisioningByOperator parameter specifies whether
        to exclude the database from the mailbox provisioning load balancer
        that distributes new mailboxes randomly and evenly across the available
        databases.
 
    .PARAMETER IsExcludedFromProvisioningDueToLogicalCorruption
        The IsExcludedFromProvisioningDueToLogicalCorruption parameter
        specifies whether to exclude the database from the mailbox
        provisioning load balancer that distributes new mailboxes randomly and
        evenly across the available databases.
 
    .PARAMETER IsExcludedFromProvisioningReason
        The IsExcludedFromProvisioningReason parameter specifies the reason
        why you excluded the mailbox database from the mailbox provisioning
        load balancer.
 
    .PARAMETER IssueWarningQuota
        The IssueWarningQuota parameter specifies the warning threshold for the
        size of the mailbox.
 
    .PARAMETER IsSuspendedFromProvisioning
        The IsSuspendedFromProvisioning parameter specifies whether to exclude
        the database from the mailbox provisioning load balancer that
        distributes new mailboxes randomly and evenly across the available
        databases.
 
    .PARAMETER JournalRecipient
        The JournalRecipient parameter specifies the journal recipient to use
        for per-database journaling for all mailboxes on the database.
 
    .PARAMETER MailboxRetention
        The MailboxRetention parameter specifies the length of time to keep
        deleted mailboxes before they are permanently deleted or purged.
 
    .PARAMETER MetaCacheDatabaseMaxCapacityInBytes
        The MetaCacheDatabaseMaxCapacityInBytes parameter specifies the size of
        the metacache database in bytes. To convert gigabytes to bytes,
        multiply the value by 1024^3. For terabytes to bytes, multiply by
        1024^4.
 
    .PARAMETER MountAtStartup
        The MountAtStartup parameter specifies whether to mount the mailbox
        database when the Microsoft Exchange Information Store service starts.
 
    .PARAMETER OfflineAddressBook
        The OfflineAddressBook parameter specifies the offline address book
        that's associated with the mailbox database.
 
    .PARAMETER ProhibitSendQuota
        The ProhibitSendQuota parameter specifies a size limit for the mailbox.
        If the mailbox reaches or exceeds this size, the mailbox can't send
        new messages, and the user receives a descriptive warning message.
 
    .PARAMETER ProhibitSendReceiveQuota
        The ProhibitSendReceiveQuota parameter specifies a size limit for the
        mailbox. If the mailbox reaches or exceeds this size, the mailbox can't
        send or receive new messages. Messages sent to the mailbox are returned
        to the sender with a descriptive error message. This value effectively
        determines the maximum size of the mailbox.
 
    .PARAMETER RecoverableItemsQuota
        The RecoverableItemsQuota parameter specifies the maximum size for the
        Recoverable Items folder of the mailbox.
 
    .PARAMETER RecoverableItemsWarningQuota
        The RecoverableItemsWarningQuota parameter specifies the warning
        threshold for the size of the Recoverable Items folder for the mailbox.
 
    .PARAMETER RetainDeletedItemsUntilBackup
        The RetainDeletedItemsUntilBackup parameter specifies whether to keep
        items in the Recoverable Items\Deletions folder of the mailbox until
        the next database backup occurs.
 
    .PARAMETER SkipInitialDatabaseMount
        Whether the initial mount of databases should be skipped after database
        creation.
#>

function Set-TargetResource
{
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory = $true)]
        [System.String]
        $Name,

        [Parameter(Mandatory = $true)]
        [System.Management.Automation.PSCredential]
        [System.Management.Automation.Credential()]
        $Credential,

        [Parameter(Mandatory = $true)]
        [System.UInt32]
        $DatabaseCopyCount,

        [Parameter(Mandatory = $true)]
        [System.String]
        $EdbFilePath,

        [Parameter(Mandatory = $true)]
        [System.String]
        $LogFolderPath,

        [Parameter(Mandatory = $true)]
        [System.String]
        $Server,

        [Parameter()]
        [System.String]
        $AdServerSettingsPreferredServer,

        [Parameter()]
        [System.Boolean]
        $AllowFileRestore,

        [Parameter()]
        [System.Boolean]
        $AllowServiceRestart = $false,

        [Parameter()]
        [System.Boolean]
        $AutoDagExcludeFromMonitoring,

        [Parameter()]
        [System.Boolean]
        $BackgroundDatabaseMaintenance,

        [Parameter()]
        [System.String]
        $CalendarLoggingQuota,

        [Parameter()]
        [System.Boolean]
        $CircularLoggingEnabled,

        [Parameter()]
        [ValidateSet('None', 'SecondCopy', 'SecondDatacenter', 'AllDatacenters', 'AllCopies')]
        [System.String]
        $DataMoveReplicationConstraint,

        [Parameter()]
        [System.String]
        $DeletedItemRetention,

        [Parameter()]
        [System.String]
        $DomainController,

        [Parameter()]
        [System.String]
        $EventHistoryRetentionPeriod,

        [Parameter()]
        [System.Boolean]
        $IndexEnabled,

        [Parameter()]
        [System.Boolean]
        $IsExcludedFromProvisioning,

        [Parameter()]
        [System.Boolean]
        $IsExcludedFromProvisioningByOperator,

        [Parameter()]
        [System.Boolean]
        $IsExcludedFromProvisioningDueToLogicalCorruption,

        [Parameter()]
        [System.String]
        $IsExcludedFromProvisioningReason,

        [Parameter()]
        [System.String]
        $IssueWarningQuota,

        [Parameter()]
        [System.Boolean]
        $IsSuspendedFromProvisioning,

        [Parameter()]
        [System.String]
        $JournalRecipient,

        [Parameter()]
        [System.String]
        $MailboxRetention,

        [Parameter()]
        [System.Int64]
        $MetaCacheDatabaseMaxCapacityInBytes,

        [Parameter()]
        [System.Boolean]
        $MountAtStartup,

        [Parameter()]
        [System.String]
        $OfflineAddressBook,

        [Parameter()]
        [System.String]
        $ProhibitSendQuota,

        [Parameter()]
        [System.String]
        $ProhibitSendReceiveQuota,

        [Parameter()]
        [System.String]
        $RecoverableItemsQuota,

        [Parameter()]
        [System.String]
        $RecoverableItemsWarningQuota,

        [Parameter()]
        [System.Boolean]
        $RetainDeletedItemsUntilBackup,

        [Parameter()]
        [System.Boolean]
        $SkipInitialDatabaseMount
    )

    Write-FunctionEntry -Parameters  @{
        'Name' = $Name
    } -Verbose:$VerbosePreference

    # Establish remote PowerShell session
    Get-RemoteExchangeSession -Credential $Credential `
        -CommandsToLoad '*MailboxDatabase', 'Move-DatabasePath', 'Mount-Database', 'Set-AdServerSettings'`
        -Verbose:$VerbosePreference

    # Check for non-existent parameters in Exchange 2013
    Remove-NotApplicableParamsForVersion -PSBoundParametersIn $PSBoundParameters `
        -ParamName 'IsExcludedFromProvisioningByOperator' `
        -ResourceName 'ExchMailboxDatabase' `
        -ParamExistsInVersion '2016', '2019'

    Remove-NotApplicableParamsForVersion -PSBoundParametersIn $PSBoundParameters `
        -ParamName 'IsExcludedFromProvisioningDueToLogicalCorruption' `
        -ResourceName 'ExchMailboxDatabase' `
        -ParamExistsInVersion '2016', '2019'

    Remove-NotApplicableParamsForVersion -PSBoundParametersIn $PSBoundParameters `
        -ParamName 'IsExcludedFromProvisioningReason' `
        -ResourceName 'ExchMailboxDatabase' `
        -ParamExistsInVersion '2016', '2019'

    # Check for non-existent parameters in Exchange 2013 or 2016
    Remove-NotApplicableParamsForVersion -PSBoundParametersIn $PSBoundParameters `
        -ParamName 'MetaCacheDatabaseMaxCapacityInBytes' `
        -ResourceName 'ExchMailboxDatabase' `
        -ParamExistsInVersion '2019'

    # Check for non-existent parameters in Exchange 2019
    Remove-NotApplicableParamsForVersion -PSBoundParametersIn $PSBoundParameters `
        -ParamName 'IndexEnabled' `
        -ResourceName 'ExchMailboxDatabase' `
        -ParamExistsInVersion '2013', '2016'

    Set-EmptyStringParamsToNull -PSBoundParametersIn $PSBoundParameters

    if ($PSBoundParameters.ContainsKey('AdServerSettingsPreferredServer') -and ![System.String]::IsNullOrEmpty($AdServerSettingsPreferredServer))
    {
        Set-ADServerSettings -PreferredServer "$($AdServerSettingsPreferredServer)"
    }

    $db = Get-MailboxDatabaseInternal @PSBoundParameters

    if ($null -eq $db) # Need to create a new DB
    {
        # Create a copy of the original parameters
        $originalPSBoundParameters = @{} + $PSBoundParameters

        Remove-FromPSBoundParametersUsingHashtable -PSBoundParametersIn $PSBoundParameters -ParamsToKeep 'Name', 'Server', 'EdbFilePath', 'LogFolderPath', 'DomainController'

        # Create the database
        $db = New-MailboxDatabase @PSBoundParameters

        if ($null -ne $db)
        {
            # Add original props back
            Add-ToPSBoundParametersFromHashtable -PSBoundParametersIn $PSBoundParameters -ParamsToAdd $originalPSBoundParameters

            if ($AllowServiceRestart -eq $true)
            {
                Write-Verbose -Message 'Restarting Information Store'

                Restart-Service MSExchangeIS
            }
            else
            {
                Write-Warning -Message 'The configuration will not take effect until MSExchangeIS is manually restarted.'
            }

            # If MountAtStartup is not explicitly set to $false, mount the new database
            if ($PSBoundParameters.ContainsKey('SkipInitialDatabaseMount') -eq $true -and $SkipInitialDatabaseMount -eq $true)
            {
                # Don't mount the DB, regardless of what else is set.
            }
            elseif ($PSBoundParameters.ContainsKey('MountAtStartup') -eq $false -or $MountAtStartup -eq $true)
            {
                Write-Verbose -Message 'Attempting to mount database.'

                Mount-DatabaseInternal @PSBoundParameters
            }
        }
        else
        {
            throw 'Failed to create new Mailbox Database'
        }
    }

    if ($null -ne $db) # Set props on existing DB
    {
        # First check if a DB or log move is required
        if (($PSBoundParameters.ContainsKey('EdbFilePath') -and (Compare-StringToString -String1 $db.EdbFilePath.PathName -String2 $EdbFilePath -IgnoreCase) -eq $false) -or
            ($PSBoundParameters.ContainsKey('LogFolderPath') -and (Compare-StringToString -String1 $db.LogFolderPath.PathName -String2 $LogFolderPath -IgnoreCase) -eq $false))
        {
            if ($db.DatabaseCopies.Count -le 1)
            {
                Write-Verbose -Message 'Moving database and/or log path'

                Move-DatabaseOrLogPath @PSBoundParameters
            }
            else
            {
                throw 'Database must have only a single copy for the DB path or log path to be moved'
            }
        }

        # setup params
        Add-ToPSBoundParametersFromHashtable -PSBoundParametersIn $PSBoundParameters -ParamsToAdd @{
            'Identity' = $Name
        }
        Remove-FromPSBoundParametersUsingHashtable -PSBoundParametersIn $PSBoundParameters `
            -ParamsToRemove 'Name', 'Server', 'DatabaseCopyCount', 'AllowServiceRestart', 'EdbFilePath', 'LogFolderPath', 'Credential', 'AdServerSettingsPreferredServer', 'SkipInitialDatabaseMount'

        # Remove parameters that depend on all copies being added
        if ($db.DatabaseCopies.Count -lt $DatabaseCopyCount)
        {
            Remove-FromPSBoundParametersUsingHashtable -PSBoundParametersIn $PSBoundParameters `
                -ParamsToRemove 'CircularLoggingEnabled', 'DataMoveReplicationConstraint'
        }

        Set-MailboxDatabase @PSBoundParameters
    }
}

<#
    .SYNOPSIS
        Tests whether the desired configuration for this resource has been
        applied.
 
    .PARAMETER Name
        The Name parameter specifies the unique name of the mailbox database.
 
    .PARAMETER Credential
        Credentials used to establish a remote PowerShell session to Exchange.
 
    .PARAMETER DatabaseCopyCount
        The number of copies that the database will have once fully configured.
 
    .PARAMETER EdbFilePath
        The EdbFilePath parameter specifies the path to the database files.
 
    .PARAMETER LogFolderPath
        The LogFolderPath parameter specifies the folder location for log
        files.
 
    .PARAMETER Server
        The Server parameter specifies the server on which you want to create
        the database.
 
    .PARAMETER AdServerSettingsPreferredServer
        An optional domain controller to pass to Set-AdServerSettings
        -PreferredServer.
 
    .PARAMETER AllowFileRestore
        The AllowFileRestore parameter specifies whether to allow a database to
        be restored from a backup.
 
    .PARAMETER AllowServiceRestart
        Whether it is okay to restart the Information Store Service after
        adding a database. Defaults to $false.
 
    .PARAMETER AutoDagExcludeFromMonitoring
        The AutoDagExcludedFromMonitoringparameter specifies whether to
        exclude the mailbox database from the ServerOneCopyMonitor, which
        alerts an administrator when a replicated database has only one healthy
        copy available.
 
    .PARAMETER BackgroundDatabaseMaintenance
        The BackgroundDatabaseMaintenance parameter specifies whether the
        Extensible Storage Engine (ESE) performs database maintenance.
 
    .PARAMETER CalendarLoggingQuota
        The CalendarLoggingQuota parameter specifies the maximum size of the
        log in the Recoverable Items folder of the mailbox that stores
        changes to calendar items.
 
    .PARAMETER CircularLoggingEnabled
        The CircularLoggingEnabled parameter specifies whether circular
        logging is enabled for the database.
 
    .PARAMETER DataMoveReplicationConstraint
        The DataMoveReplicationConstraint parameter specifies the throttling
        behavior for high availability mailbox moves.
 
    .PARAMETER DeletedItemRetention
        The DeletedItemRetention parameter specifies the length of time to keep
        deleted items in the Recoverable Items\Deletions folder in mailboxes.
 
    .PARAMETER DomainController
        The DomainController parameter specifies the domain controller that's
        used by this cmdlet to read data from or write data to Active
        Directory. You identify the domain controller by its fully qualified
        domain name (FQDN). For example, dc01.contoso.com.
 
    .PARAMETER EventHistoryRetentionPeriod
        The EventHistoryRetentionPeriod parameter specifies the length of time
        to keep event data.
 
    .PARAMETER IndexEnabled
        The IndexEnabled parameter specifies whether Exchange Search indexes
        the mailbox database.
 
    .PARAMETER IsExcludedFromProvisioning
        The IsExcludedFromProvisioning parameter specifies whether to exclude
        the database from the mailbox provisioning load balancer that
        distributes new mailboxes randomly and evenly across the available
        databases.
 
    .PARAMETER IsExcludedFromProvisioningByOperator
        The IIsExcludedFromProvisioningByOperator parameter specifies whether
        to exclude the database from the mailbox provisioning load balancer
        that distributes new mailboxes randomly and evenly across the available
        databases.
 
    .PARAMETER IsExcludedFromProvisioningDueToLogicalCorruption
        The IsExcludedFromProvisioningDueToLogicalCorruption parameter
        specifies whether to exclude the database from the mailbox
        provisioning load balancer that distributes new mailboxes randomly and
        evenly across the available databases.
 
    .PARAMETER IsExcludedFromProvisioningReason
        The IsExcludedFromProvisioningReason parameter specifies the reason
        why you excluded the mailbox database from the mailbox provisioning
        load balancer.
 
    .PARAMETER IssueWarningQuota
        The IssueWarningQuota parameter specifies the warning threshold for the
        size of the mailbox.
 
    .PARAMETER IsSuspendedFromProvisioning
        The IsSuspendedFromProvisioning parameter specifies whether to exclude
        the database from the mailbox provisioning load balancer that
        distributes new mailboxes randomly and evenly across the available
        databases.
 
    .PARAMETER JournalRecipient
        The JournalRecipient parameter specifies the journal recipient to use
        for per-database journaling for all mailboxes on the database.
 
    .PARAMETER MailboxRetention
        The MailboxRetention parameter specifies the length of time to keep
        deleted mailboxes before they are permanently deleted or purged.
 
    .PARAMETER MetaCacheDatabaseMaxCapacityInBytes
        The MetaCacheDatabaseMaxCapacityInBytes parameter specifies the size of
        the metacache database in bytes. To convert gigabytes to bytes,
        multiply the value by 1024^3. For terabytes to bytes, multiply by
        1024^4.
 
    .PARAMETER MountAtStartup
        The MountAtStartup parameter specifies whether to mount the mailbox
        database when the Microsoft Exchange Information Store service starts.
 
    .PARAMETER OfflineAddressBook
        The OfflineAddressBook parameter specifies the offline address book
        that's associated with the mailbox database.
 
    .PARAMETER ProhibitSendQuota
        The ProhibitSendQuota parameter specifies a size limit for the mailbox.
        If the mailbox reaches or exceeds this size, the mailbox can't send
        new messages, and the user receives a descriptive warning message.
 
    .PARAMETER ProhibitSendReceiveQuota
        The ProhibitSendReceiveQuota parameter specifies a size limit for the
        mailbox. If the mailbox reaches or exceeds this size, the mailbox can't
        send or receive new messages. Messages sent to the mailbox are returned
        to the sender with a descriptive error message. This value effectively
        determines the maximum size of the mailbox.
 
    .PARAMETER RecoverableItemsQuota
        The RecoverableItemsQuota parameter specifies the maximum size for the
        Recoverable Items folder of the mailbox.
 
    .PARAMETER RecoverableItemsWarningQuota
        The RecoverableItemsWarningQuota parameter specifies the warning
        threshold for the size of the Recoverable Items folder for the mailbox.
 
    .PARAMETER RetainDeletedItemsUntilBackup
        The RetainDeletedItemsUntilBackup parameter specifies whether to keep
        items in the Recoverable Items\Deletions folder of the mailbox until
        the next database backup occurs.
 
    .PARAMETER SkipInitialDatabaseMount
        Whether the initial mount of databases should be skipped after database
        creation.
#>

function Test-TargetResource
{
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSDSCUseVerboseMessageInDSCResource", "")]
    [CmdletBinding()]
    [OutputType([System.Boolean])]
    param
    (
        [Parameter(Mandatory = $true)]
        [System.String]
        $Name,

        [Parameter(Mandatory = $true)]
        [System.Management.Automation.PSCredential]
        [System.Management.Automation.Credential()]
        $Credential,

        [Parameter(Mandatory = $true)]
        [System.UInt32]
        $DatabaseCopyCount,

        [Parameter(Mandatory = $true)]
        [System.String]
        $EdbFilePath,

        [Parameter(Mandatory = $true)]
        [System.String]
        $LogFolderPath,

        [Parameter(Mandatory = $true)]
        [System.String]
        $Server,

        [Parameter()]
        [System.String]
        $AdServerSettingsPreferredServer,

        [Parameter()]
        [System.Boolean]
        $AllowFileRestore,

        [Parameter()]
        [System.Boolean]
        $AllowServiceRestart = $false,

        [Parameter()]
        [System.Boolean]
        $AutoDagExcludeFromMonitoring,

        [Parameter()]
        [System.Boolean]
        $BackgroundDatabaseMaintenance,

        [Parameter()]
        [System.String]
        $CalendarLoggingQuota,

        [Parameter()]
        [System.Boolean]
        $CircularLoggingEnabled,

        [Parameter()]
        [ValidateSet('None', 'SecondCopy', 'SecondDatacenter', 'AllDatacenters', 'AllCopies')]
        [System.String]
        $DataMoveReplicationConstraint,

        [Parameter()]
        [System.String]
        $DeletedItemRetention,

        [Parameter()]
        [System.String]
        $DomainController,

        [Parameter()]
        [System.String]
        $EventHistoryRetentionPeriod,

        [Parameter()]
        [System.Boolean]
        $IndexEnabled,

        [Parameter()]
        [System.Boolean]
        $IsExcludedFromProvisioning,

        [Parameter()]
        [System.Boolean]
        $IsExcludedFromProvisioningByOperator,

        [Parameter()]
        [System.Boolean]
        $IsExcludedFromProvisioningDueToLogicalCorruption,

        [Parameter()]
        [System.String]
        $IsExcludedFromProvisioningReason,

        [Parameter()]
        [System.String]
        $IssueWarningQuota,

        [Parameter()]
        [System.Boolean]
        $IsSuspendedFromProvisioning,

        [Parameter()]
        [System.String]
        $JournalRecipient,

        [Parameter()]
        [System.String]
        $MailboxRetention,

        [Parameter()]
        [System.Int64]
        $MetaCacheDatabaseMaxCapacityInBytes,

        [Parameter()]
        [System.Boolean]
        $MountAtStartup,

        [Parameter()]
        [System.String]
        $OfflineAddressBook,

        [Parameter()]
        [System.String]
        $ProhibitSendQuota,

        [Parameter()]
        [System.String]
        $ProhibitSendReceiveQuota,

        [Parameter()]
        [System.String]
        $RecoverableItemsQuota,

        [Parameter()]
        [System.String]
        $RecoverableItemsWarningQuota,

        [Parameter()]
        [System.Boolean]
        $RetainDeletedItemsUntilBackup,

        [Parameter()]
        [System.Boolean]
        $SkipInitialDatabaseMount
    )

    Write-FunctionEntry -Parameters  @{
        'Name' = $Name
    } -Verbose:$VerbosePreference

    # Establish remote PowerShell session
    Get-RemoteExchangeSession -Credential $Credential `
        -CommandsToLoad 'Get-MailboxDatabase', 'Get-Recipient', 'Set-AdServerSettings'`
        -Verbose:$VerbosePreference

    # Check for non-existent parameters in Exchange 2013
    Remove-NotApplicableParamsForVersion -PSBoundParametersIn $PSBoundParameters `
        -ParamName 'IsExcludedFromProvisioningByOperator' `
        -ResourceName 'ExchMailboxDatabase' `
        -ParamExistsInVersion '2016', '2019'

    Remove-NotApplicableParamsForVersion -PSBoundParametersIn $PSBoundParameters `
        -ParamName 'IsExcludedFromProvisioningDueToLogicalCorruption' `
        -ResourceName 'ExchMailboxDatabase' `
        -ParamExistsInVersion '2016', '2019'

    Remove-NotApplicableParamsForVersion -PSBoundParametersIn $PSBoundParameters `
        -ParamName 'IsExcludedFromProvisioningReason' `
        -ResourceName 'ExchMailboxDatabase' `
        -ParamExistsInVersion '2016', '2019'

    # Check for non-existent parameters in Exchange 2013 or 2016
    Remove-NotApplicableParamsForVersion -PSBoundParametersIn $PSBoundParameters `
        -ParamName 'MetaCacheDatabaseMaxCapacityInBytes' `
        -ResourceName 'ExchMailboxDatabase' `
        -ParamExistsInVersion '2019'

    # Check for non-existent parameters in Exchange 2019
    Remove-NotApplicableParamsForVersion -PSBoundParametersIn $PSBoundParameters `
        -ParamName 'IndexEnabled' `
        -ResourceName 'ExchMailboxDatabase' `
        -ParamExistsInVersion '2013', '2016'

    if ($PSBoundParameters.ContainsKey('AdServerSettingsPreferredServer') -and ![System.String]::IsNullOrEmpty($AdServerSettingsPreferredServer))
    {
        Set-ADServerSettings -PreferredServer "$($AdServerSettingsPreferredServer)"
    }

    $db = Get-MailboxDatabaseInternal @PSBoundParameters

    $testResults = $true

    if ($null -eq $db)
    {
        Write-Verbose -Message 'Unable to retrieve Mailbox Database settings or Mailbox Database does not exist'

        $testResults = $false
    }
    else
    {
        if (!(Test-ExchangeSetting -Name 'AllowFileRestore' -Type 'Boolean' -ExpectedValue $AllowFileRestore -ActualValue $db.AllowFileRestore -PSBoundParametersIn $PSBoundParameters -Verbose:$VerbosePreference))
        {
            $testResults = $false
        }

        if (!(Test-ExchangeSetting -Name 'AutoDagExcludeFromMonitoring' -Type 'Boolean' -ExpectedValue $AutoDagExcludeFromMonitoring -ActualValue $db.AutoDagExcludeFromMonitoring -PSBoundParametersIn $PSBoundParameters -Verbose:$VerbosePreference))
        {
            $testResults = $false
        }

        if (!(Test-ExchangeSetting -Name 'BackgroundDatabaseMaintenance' -Type 'Boolean' -ExpectedValue $BackgroundDatabaseMaintenance -ActualValue $db.BackgroundDatabaseMaintenance -PSBoundParametersIn $PSBoundParameters -Verbose:$VerbosePreference))
        {
            $testResults = $false
        }

        if (!(Test-ExchangeSetting -Name 'CalendarLoggingQuota' -Type 'Unlimited' -ExpectedValue $CalendarLoggingQuota -ActualValue $db.CalendarLoggingQuota -PSBoundParametersIn $PSBoundParameters -Verbose:$VerbosePreference))
        {
            $testResults = $false
        }

        # Only check these if all copies have been added
        if ($db.DatabaseCopies.Count -ge $DatabaseCopyCount)
        {
            if (!(Test-ExchangeSetting -Name 'CircularLoggingEnabled' -Type 'Boolean' -ExpectedValue $CircularLoggingEnabled -ActualValue $db.CircularLoggingEnabled -PSBoundParametersIn $PSBoundParameters -Verbose:$VerbosePreference))
            {
                $testResults = $false
            }

            if (!(Test-ExchangeSetting -Name 'DataMoveReplicationConstraint' -Type 'String' -ExpectedValue $DataMoveReplicationConstraint -ActualValue $db.DataMoveReplicationConstraint -PSBoundParametersIn $PSBoundParameters -Verbose:$VerbosePreference))
            {
                $testResults = $false
            }
        }

        if (!(Test-ExchangeSetting -Name 'DeletedItemRetention' -Type 'Timespan' -ExpectedValue $DeletedItemRetention -ActualValue $db.DeletedItemRetention -PSBoundParametersIn $PSBoundParameters -Verbose:$VerbosePreference))
        {
            $testResults = $false
        }

        if (!(Test-ExchangeSetting -Name 'EdbFilePath' -Type 'String' -ExpectedValue $EdbFilePath -ActualValue $db.EdbFilePath.PathName -PSBoundParametersIn $PSBoundParameters -Verbose:$VerbosePreference))
        {
            $testResults = $false
        }

        if (!(Test-ExchangeSetting -Name 'EventHistoryRetentionPeriod' -Type 'Timespan' -ExpectedValue $EventHistoryRetentionPeriod -ActualValue $db.EventHistoryRetentionPeriod -PSBoundParametersIn $PSBoundParameters -Verbose:$VerbosePreference))
        {
            $testResults = $false
        }

        if (!(Test-ExchangeSetting -Name 'IndexEnabled' -Type 'Boolean' -ExpectedValue $IndexEnabled -ActualValue $db.IndexEnabled -PSBoundParametersIn $PSBoundParameters -Verbose:$VerbosePreference))
        {
            $testResults = $false
        }

        if (!(Test-ExchangeSetting -Name 'IsExcludedFromProvisioning' -Type 'Boolean' -ExpectedValue $IsExcludedFromProvisioning -ActualValue $db.IsExcludedFromProvisioning -PSBoundParametersIn $PSBoundParameters -Verbose:$VerbosePreference))
        {
            $testResults = $false
        }

        if (!(Test-ExchangeSetting -Name 'IsExcludedFromProvisioningReason' -Type 'String' -ExpectedValue $IsExcludedFromProvisioningReason -ActualValue $db.IsExcludedFromProvisioningReason -PSBoundParametersIn $PSBoundParameters -Verbose:$VerbosePreference))
        {
            $testResults = $false
        }

        if (!(Test-ExchangeSetting -Name 'IsExcludedFromProvisioningByOperator' -Type 'Boolean' -ExpectedValue $IsExcludedFromProvisioningByOperator -ActualValue $db.IsExcludedFromProvisioningByOperator -PSBoundParametersIn $PSBoundParameters -Verbose:$VerbosePreference))
        {
            $testResults = $false
        }

        if (!(Test-ExchangeSetting -Name 'IsExcludedFromProvisioningDueToLogicalCorruption' -Type 'Boolean' -ExpectedValue $IsExcludedFromProvisioningDueToLogicalCorruption -ActualValue $db.IsExcludedFromProvisioningDueToLogicalCorruption -PSBoundParametersIn $PSBoundParameters -Verbose:$VerbosePreference))
        {
            $testResults = $false
        }

        if (!(Test-ExchangeSetting -Name 'IssueWarningQuota' -Type 'Unlimited' -ExpectedValue $IssueWarningQuota -ActualValue $db.IssueWarningQuota -PSBoundParametersIn $PSBoundParameters -Verbose:$VerbosePreference))
        {
            $testResults = $false
        }

        if (!(Test-ExchangeSetting -Name 'IsSuspendedFromProvisioning' -Type 'Boolean' -ExpectedValue $IsSuspendedFromProvisioning -ActualValue $db.IsSuspendedFromProvisioning -PSBoundParametersIn $PSBoundParameters -Verbose:$VerbosePreference))
        {
            $testResults = $false
        }

        if (!(Test-ExchangeSetting -Name 'JournalRecipient' -Type 'ADObjectID' -ExpectedValue $JournalRecipient -ActualValue $db.JournalRecipient -PSBoundParametersIn $PSBoundParameters -Verbose:$VerbosePreference))
        {
            $testResults = $false
        }

        if (!(Test-ExchangeSetting -Name 'LogFolderPath' -Type 'String' -ExpectedValue $LogFolderPath -ActualValue $db.LogFolderPath.PathName -PSBoundParametersIn $PSBoundParameters -Verbose:$VerbosePreference))
        {
            $testResults = $false
        }

        if (!(Test-ExchangeSetting -Name 'MailboxRetention' -Type 'Timespan' -ExpectedValue $MailboxRetention -ActualValue $db.MailboxRetention -PSBoundParametersIn $PSBoundParameters -Verbose:$VerbosePreference))
        {
            $testResults = $false
        }

        if (!(Test-ExchangeSetting -Name 'MetaCacheDatabaseMaxCapacityInBytes' -Type 'Int' -ExpectedValue $MetaCacheDatabaseMaxCapacityInBytes -ActualValue $db.MetaCacheDatabaseMaxCapacityInBytes -PSBoundParametersIn $PSBoundParameters -Verbose:$VerbosePreference))
        {
            $testResults = $false
        }

        if (!(Test-ExchangeSetting -Name 'MountAtStartup' -Type 'Boolean' -ExpectedValue $MountAtStartup -ActualValue $db.MountAtStartup -PSBoundParametersIn $PSBoundParameters -Verbose:$VerbosePreference))
        {
            $testResults = $false
        }

        # Strip leading slash off the OAB now so it's easier to check
        if ($PSBoundParameters.ContainsKey('OfflineAddressBook'))
        {
            if ($OfflineAddressBook.StartsWith('\'))
            {
                $OfflineAddressBook = $OfflineAddressBook.Substring(1)
            }

            if ($db.OfflineAddressBook.Name.StartsWith('\'))
            {
                $dbOab = $db.OfflineAddressBook.Name.Substring(1)
            }
            else
            {
                $dbOab = $db.OfflineAddressBook.Name
            }
        }

        if (!(Test-ExchangeSetting -Name 'OfflineAddressBook' -Type 'String' -ExpectedValue $OfflineAddressBook -ActualValue $dbOab -PSBoundParametersIn $PSBoundParameters -Verbose:$VerbosePreference))
        {
            $testResults = $false
        }

        if (!(Test-ExchangeSetting -Name 'ProhibitSendQuota' -Type 'Unlimited' -ExpectedValue $ProhibitSendQuota -ActualValue $db.ProhibitSendQuota -PSBoundParametersIn $PSBoundParameters -Verbose:$VerbosePreference))
        {
            $testResults = $false
        }

        if (!(Test-ExchangeSetting -Name 'ProhibitSendReceiveQuota' -Type 'Unlimited' -ExpectedValue $ProhibitSendReceiveQuota -ActualValue $db.ProhibitSendReceiveQuota -PSBoundParametersIn $PSBoundParameters -Verbose:$VerbosePreference))
        {
            $testResults = $false
        }

        if (!(Test-ExchangeSetting -Name 'RecoverableItemsQuota' -Type 'Unlimited' -ExpectedValue $RecoverableItemsQuota -ActualValue $db.RecoverableItemsQuota -PSBoundParametersIn $PSBoundParameters -Verbose:$VerbosePreference))
        {
            $testResults = $false
        }

        if (!(Test-ExchangeSetting -Name 'RecoverableItemsWarningQuota' -Type 'Unlimited' -ExpectedValue $RecoverableItemsWarningQuota -ActualValue $db.RecoverableItemsWarningQuota -PSBoundParametersIn $PSBoundParameters -Verbose:$VerbosePreference))
        {
            $testResults = $false
        }

        if (!(Test-ExchangeSetting -Name 'RetainDeletedItemsUntilBackup' -Type 'Boolean' -ExpectedValue $RetainDeletedItemsUntilBackup -ActualValue $db.RetainDeletedItemsUntilBackup -PSBoundParametersIn $PSBoundParameters -Verbose:$VerbosePreference))
        {
            $testResults = $false
        }
    }

    return $testResults
}

<#
    .SYNOPSIS
        Runs Get-MailboxDatabase, only specifying Identity and optionally
        DomainController.
 
    .PARAMETER Name
        The Name parameter specifies the unique name of the mailbox database.
 
    .PARAMETER Credential
        Credentials used to establish a remote PowerShell session to Exchange.
 
    .PARAMETER DatabaseCopyCount
        The number of copies that the database will have once fully configured.
 
    .PARAMETER EdbFilePath
        The EdbFilePath parameter specifies the path to the database files.
 
    .PARAMETER LogFolderPath
        The LogFolderPath parameter specifies the folder location for log
        files.
 
    .PARAMETER Server
        The Server parameter specifies the server on which you want to create
        the database.
 
    .PARAMETER AdServerSettingsPreferredServer
        An optional domain controller to pass to Set-AdServerSettings
        -PreferredServer.
 
    .PARAMETER AllowFileRestore
        The AllowFileRestore parameter specifies whether to allow a database to
        be restored from a backup.
 
    .PARAMETER AllowServiceRestart
        Whether it is okay to restart the Information Store Service after
        adding a database. Defaults to $false.
 
    .PARAMETER AutoDagExcludeFromMonitoring
        The AutoDagExcludedFromMonitoringparameter specifies whether to
        exclude the mailbox database from the ServerOneCopyMonitor, which
        alerts an administrator when a replicated database has only one healthy
        copy available.
 
    .PARAMETER BackgroundDatabaseMaintenance
        The BackgroundDatabaseMaintenance parameter specifies whether the
        Extensible Storage Engine (ESE) performs database maintenance.
 
    .PARAMETER CalendarLoggingQuota
        The CalendarLoggingQuota parameter specifies the maximum size of the
        log in the Recoverable Items folder of the mailbox that stores
        changes to calendar items.
 
    .PARAMETER CircularLoggingEnabled
        The CircularLoggingEnabled parameter specifies whether circular
        logging is enabled for the database.
 
    .PARAMETER DataMoveReplicationConstraint
        The DataMoveReplicationConstraint parameter specifies the throttling
        behavior for high availability mailbox moves.
 
    .PARAMETER DeletedItemRetention
        The DeletedItemRetention parameter specifies the length of time to keep
        deleted items in the Recoverable Items\Deletions folder in mailboxes.
 
    .PARAMETER DomainController
        The DomainController parameter specifies the domain controller that's
        used by this cmdlet to read data from or write data to Active
        Directory. You identify the domain controller by its fully qualified
        domain name (FQDN). For example, dc01.contoso.com.
 
    .PARAMETER EventHistoryRetentionPeriod
        The EventHistoryRetentionPeriod parameter specifies the length of time
        to keep event data.
 
    .PARAMETER IndexEnabled
        The IndexEnabled parameter specifies whether Exchange Search indexes
        the mailbox database.
 
    .PARAMETER IsExcludedFromProvisioning
        The IsExcludedFromProvisioning parameter specifies whether to exclude
        the database from the mailbox provisioning load balancer that
        distributes new mailboxes randomly and evenly across the available
        databases.
 
    .PARAMETER IsExcludedFromProvisioningByOperator
        The IIsExcludedFromProvisioningByOperator parameter specifies whether
        to exclude the database from the mailbox provisioning load balancer
        that distributes new mailboxes randomly and evenly across the available
        databases.
 
    .PARAMETER IsExcludedFromProvisioningDueToLogicalCorruption
        The IsExcludedFromProvisioningDueToLogicalCorruption parameter
        specifies whether to exclude the database from the mailbox
        provisioning load balancer that distributes new mailboxes randomly and
        evenly across the available databases.
 
    .PARAMETER IsExcludedFromProvisioningReason
        The IsExcludedFromProvisioningReason parameter specifies the reason
        why you excluded the mailbox database from the mailbox provisioning
        load balancer.
 
    .PARAMETER IssueWarningQuota
        The IssueWarningQuota parameter specifies the warning threshold for the
        size of the mailbox.
 
    .PARAMETER IsSuspendedFromProvisioning
        The IsSuspendedFromProvisioning parameter specifies whether to exclude
        the database from the mailbox provisioning load balancer that
        distributes new mailboxes randomly and evenly across the available
        databases.
 
    .PARAMETER JournalRecipient
        The JournalRecipient parameter specifies the journal recipient to use
        for per-database journaling for all mailboxes on the database.
 
    .PARAMETER MailboxRetention
        The MailboxRetention parameter specifies the length of time to keep
        deleted mailboxes before they are permanently deleted or purged.
 
    .PARAMETER MetaCacheDatabaseMaxCapacityInBytes
        The MetaCacheDatabaseMaxCapacityInBytes parameter specifies the size of
        the metacache database in bytes. To convert gigabytes to bytes,
        multiply the value by 1024^3. For terabytes to bytes, multiply by
        1024^4.
 
    .PARAMETER MountAtStartup
        The MountAtStartup parameter specifies whether to mount the mailbox
        database when the Microsoft Exchange Information Store service starts.
 
    .PARAMETER OfflineAddressBook
        The OfflineAddressBook parameter specifies the offline address book
        that's associated with the mailbox database.
 
    .PARAMETER ProhibitSendQuota
        The ProhibitSendQuota parameter specifies a size limit for the mailbox.
        If the mailbox reaches or exceeds this size, the mailbox can't send
        new messages, and the user receives a descriptive warning message.
 
    .PARAMETER ProhibitSendReceiveQuota
        The ProhibitSendReceiveQuota parameter specifies a size limit for the
        mailbox. If the mailbox reaches or exceeds this size, the mailbox can't
        send or receive new messages. Messages sent to the mailbox are returned
        to the sender with a descriptive error message. This value effectively
        determines the maximum size of the mailbox.
 
    .PARAMETER RecoverableItemsQuota
        The RecoverableItemsQuota parameter specifies the maximum size for the
        Recoverable Items folder of the mailbox.
 
    .PARAMETER RecoverableItemsWarningQuota
        The RecoverableItemsWarningQuota parameter specifies the warning
        threshold for the size of the Recoverable Items folder for the mailbox.
 
    .PARAMETER RetainDeletedItemsUntilBackup
        The RetainDeletedItemsUntilBackup parameter specifies whether to keep
        items in the Recoverable Items\Deletions folder of the mailbox until
        the next database backup occurs.
 
    .PARAMETER SkipInitialDatabaseMount
        Whether the initial mount of databases should be skipped after database
        creation.
#>

function Get-MailboxDatabaseInternal
{
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory = $true)]
        [System.String]
        $Name,

        [Parameter(Mandatory = $true)]
        [System.Management.Automation.PSCredential]
        [System.Management.Automation.Credential()]
        $Credential,

        [Parameter(Mandatory = $true)]
        [System.UInt32]
        $DatabaseCopyCount,

        [Parameter(Mandatory = $true)]
        [System.String]
        $EdbFilePath,

        [Parameter(Mandatory = $true)]
        [System.String]
        $LogFolderPath,

        [Parameter(Mandatory = $true)]
        [System.String]
        $Server,

        [Parameter()]
        [System.String]
        $AdServerSettingsPreferredServer,

        [Parameter()]
        [System.Boolean]
        $AllowFileRestore,

        [Parameter()]
        [System.Boolean]
        $AllowServiceRestart = $false,

        [Parameter()]
        [System.Boolean]
        $AutoDagExcludeFromMonitoring,

        [Parameter()]
        [System.Boolean]
        $BackgroundDatabaseMaintenance,

        [Parameter()]
        [System.String]
        $CalendarLoggingQuota,

        [Parameter()]
        [System.Boolean]
        $CircularLoggingEnabled,

        [Parameter()]
        [ValidateSet('None', 'SecondCopy', 'SecondDatacenter', 'AllDatacenters', 'AllCopies')]
        [System.String]
        $DataMoveReplicationConstraint,

        [Parameter()]
        [System.String]
        $DeletedItemRetention,

        [Parameter()]
        [System.String]
        $DomainController,

        [Parameter()]
        [System.String]
        $EventHistoryRetentionPeriod,

        [Parameter()]
        [System.Boolean]
        $IndexEnabled,

        [Parameter()]
        [System.Boolean]
        $IsExcludedFromProvisioning,

        [Parameter()]
        [System.Boolean]
        $IsExcludedFromProvisioningByOperator,

        [Parameter()]
        [System.Boolean]
        $IsExcludedFromProvisioningDueToLogicalCorruption,

        [Parameter()]
        [System.String]
        $IsExcludedFromProvisioningReason,

        [Parameter()]
        [System.String]
        $IssueWarningQuota,

        [Parameter()]
        [System.Boolean]
        $IsSuspendedFromProvisioning,

        [Parameter()]
        [System.String]
        $JournalRecipient,

        [Parameter()]
        [System.String]
        $MailboxRetention,

        [Parameter()]
        [System.Int64]
        $MetaCacheDatabaseMaxCapacityInBytes,

        [Parameter()]
        [System.Boolean]
        $MountAtStartup,

        [Parameter()]
        [System.String]
        $OfflineAddressBook,

        [Parameter()]
        [System.String]
        $ProhibitSendQuota,

        [Parameter()]
        [System.String]
        $ProhibitSendReceiveQuota,

        [Parameter()]
        [System.String]
        $RecoverableItemsQuota,

        [Parameter()]
        [System.String]
        $RecoverableItemsWarningQuota,

        [Parameter()]
        [System.Boolean]
        $RetainDeletedItemsUntilBackup,

        [Parameter()]
        [System.Boolean]
        $SkipInitialDatabaseMount
    )

    Add-ToPSBoundParametersFromHashtable -PSBoundParametersIn $PSBoundParameters -ParamsToAdd  @{
        'Identity' = $Name
    }
    Remove-FromPSBoundParametersUsingHashtable -PSBoundParametersIn $PSBoundParameters -ParamsToKeep 'Identity', 'DomainController'

    return (Get-MailboxDatabase @PSBoundParameters -ErrorAction SilentlyContinue)
}

<#
    .SYNOPSIS
        Moves the database or log path. Doesn't validate that the DB is in a
        good condition to move. Caller should do that.
 
    .PARAMETER Name
        The Name parameter specifies the unique name of the mailbox database.
 
    .PARAMETER Credential
        Credentials used to establish a remote PowerShell session to Exchange.
 
    .PARAMETER DatabaseCopyCount
        The number of copies that the database will have once fully configured.
 
    .PARAMETER EdbFilePath
        The EdbFilePath parameter specifies the path to the database files.
 
    .PARAMETER LogFolderPath
        The LogFolderPath parameter specifies the folder location for log
        files.
 
    .PARAMETER Server
        The Server parameter specifies the server on which you want to create
        the database.
 
    .PARAMETER AdServerSettingsPreferredServer
        An optional domain controller to pass to Set-AdServerSettings
        -PreferredServer.
 
    .PARAMETER AllowFileRestore
        The AllowFileRestore parameter specifies whether to allow a database to
        be restored from a backup.
 
    .PARAMETER AllowServiceRestart
        Whether it is okay to restart the Information Store Service after
        adding a database. Defaults to $false.
 
    .PARAMETER AutoDagExcludeFromMonitoring
        The AutoDagExcludedFromMonitoringparameter specifies whether to
        exclude the mailbox database from the ServerOneCopyMonitor, which
        alerts an administrator when a replicated database has only one healthy
        copy available.
 
    .PARAMETER BackgroundDatabaseMaintenance
        The BackgroundDatabaseMaintenance parameter specifies whether the
        Extensible Storage Engine (ESE) performs database maintenance.
 
    .PARAMETER CalendarLoggingQuota
        The CalendarLoggingQuota parameter specifies the maximum size of the
        log in the Recoverable Items folder of the mailbox that stores
        changes to calendar items.
 
    .PARAMETER CircularLoggingEnabled
        The CircularLoggingEnabled parameter specifies whether circular
        logging is enabled for the database.
 
    .PARAMETER DataMoveReplicationConstraint
        The DataMoveReplicationConstraint parameter specifies the throttling
        behavior for high availability mailbox moves.
 
    .PARAMETER DeletedItemRetention
        The DeletedItemRetention parameter specifies the length of time to keep
        deleted items in the Recoverable Items\Deletions folder in mailboxes.
 
    .PARAMETER DomainController
        The DomainController parameter specifies the domain controller that's
        used by this cmdlet to read data from or write data to Active
        Directory. You identify the domain controller by its fully qualified
        domain name (FQDN). For example, dc01.contoso.com.
 
    .PARAMETER EventHistoryRetentionPeriod
        The EventHistoryRetentionPeriod parameter specifies the length of time
        to keep event data.
 
    .PARAMETER IndexEnabled
        The IndexEnabled parameter specifies whether Exchange Search indexes
        the mailbox database.
 
    .PARAMETER IsExcludedFromProvisioning
        The IsExcludedFromProvisioning parameter specifies whether to exclude
        the database from the mailbox provisioning load balancer that
        distributes new mailboxes randomly and evenly across the available
        databases.
 
    .PARAMETER IsExcludedFromProvisioningByOperator
        The IIsExcludedFromProvisioningByOperator parameter specifies whether
        to exclude the database from the mailbox provisioning load balancer
        that distributes new mailboxes randomly and evenly across the available
        databases.
 
    .PARAMETER IsExcludedFromProvisioningDueToLogicalCorruption
        The IsExcludedFromProvisioningDueToLogicalCorruption parameter
        specifies whether to exclude the database from the mailbox
        provisioning load balancer that distributes new mailboxes randomly and
        evenly across the available databases.
 
    .PARAMETER IsExcludedFromProvisioningReason
        The IsExcludedFromProvisioningReason parameter specifies the reason
        why you excluded the mailbox database from the mailbox provisioning
        load balancer.
 
    .PARAMETER IssueWarningQuota
        The IssueWarningQuota parameter specifies the warning threshold for the
        size of the mailbox.
 
    .PARAMETER IsSuspendedFromProvisioning
        The IsSuspendedFromProvisioning parameter specifies whether to exclude
        the database from the mailbox provisioning load balancer that
        distributes new mailboxes randomly and evenly across the available
        databases.
 
    .PARAMETER JournalRecipient
        The JournalRecipient parameter specifies the journal recipient to use
        for per-database journaling for all mailboxes on the database.
 
    .PARAMETER MailboxRetention
        The MailboxRetention parameter specifies the length of time to keep
        deleted mailboxes before they are permanently deleted or purged.
 
    .PARAMETER MetaCacheDatabaseMaxCapacityInBytes
        The MetaCacheDatabaseMaxCapacityInBytes parameter specifies the size of
        the metacache database in bytes. To convert gigabytes to bytes,
        multiply the value by 1024^3. For terabytes to bytes, multiply by
        1024^4.
 
    .PARAMETER MountAtStartup
        The MountAtStartup parameter specifies whether to mount the mailbox
        database when the Microsoft Exchange Information Store service starts.
 
    .PARAMETER OfflineAddressBook
        The OfflineAddressBook parameter specifies the offline address book
        that's associated with the mailbox database.
 
    .PARAMETER ProhibitSendQuota
        The ProhibitSendQuota parameter specifies a size limit for the mailbox.
        If the mailbox reaches or exceeds this size, the mailbox can't send
        new messages, and the user receives a descriptive warning message.
 
    .PARAMETER ProhibitSendReceiveQuota
        The ProhibitSendReceiveQuota parameter specifies a size limit for the
        mailbox. If the mailbox reaches or exceeds this size, the mailbox can't
        send or receive new messages. Messages sent to the mailbox are returned
        to the sender with a descriptive error message. This value effectively
        determines the maximum size of the mailbox.
 
    .PARAMETER RecoverableItemsQuota
        The RecoverableItemsQuota parameter specifies the maximum size for the
        Recoverable Items folder of the mailbox.
 
    .PARAMETER RecoverableItemsWarningQuota
        The RecoverableItemsWarningQuota parameter specifies the warning
        threshold for the size of the Recoverable Items folder for the mailbox.
 
    .PARAMETER RetainDeletedItemsUntilBackup
        The RetainDeletedItemsUntilBackup parameter specifies whether to keep
        items in the Recoverable Items\Deletions folder of the mailbox until
        the next database backup occurs.
 
    .PARAMETER SkipInitialDatabaseMount
        Whether the initial mount of databases should be skipped after database
        creation.
#>

function Move-DatabaseOrLogPath
{
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory = $true)]
        [System.String]
        $Name,

        [Parameter(Mandatory = $true)]
        [System.Management.Automation.PSCredential]
        [System.Management.Automation.Credential()]
        $Credential,

        [Parameter(Mandatory = $true)]
        [System.UInt32]
        $DatabaseCopyCount,

        [Parameter(Mandatory = $true)]
        [System.String]
        $EdbFilePath,

        [Parameter(Mandatory = $true)]
        [System.String]
        $LogFolderPath,

        [Parameter(Mandatory = $true)]
        [System.String]
        $Server,

        [Parameter()]
        [System.String]
        $AdServerSettingsPreferredServer,

        [Parameter()]
        [System.Boolean]
        $AllowFileRestore,

        [Parameter()]
        [System.Boolean]
        $AllowServiceRestart = $false,

        [Parameter()]
        [System.Boolean]
        $AutoDagExcludeFromMonitoring,

        [Parameter()]
        [System.Boolean]
        $BackgroundDatabaseMaintenance,

        [Parameter()]
        [System.String]
        $CalendarLoggingQuota,

        [Parameter()]
        [System.Boolean]
        $CircularLoggingEnabled,

        [Parameter()]
        [ValidateSet('None', 'SecondCopy', 'SecondDatacenter', 'AllDatacenters', 'AllCopies')]
        [System.String]
        $DataMoveReplicationConstraint,

        [Parameter()]
        [System.String]
        $DeletedItemRetention,

        [Parameter()]
        [System.String]
        $DomainController,

        [Parameter()]
        [System.String]
        $EventHistoryRetentionPeriod,

        [Parameter()]
        [System.Boolean]
        $IndexEnabled,

        [Parameter()]
        [System.Boolean]
        $IsExcludedFromProvisioning,

        [Parameter()]
        [System.Boolean]
        $IsExcludedFromProvisioningByOperator,

        [Parameter()]
        [System.Boolean]
        $IsExcludedFromProvisioningDueToLogicalCorruption,

        [Parameter()]
        [System.String]
        $IsExcludedFromProvisioningReason,

        [Parameter()]
        [System.String]
        $IssueWarningQuota,

        [Parameter()]
        [System.Boolean]
        $IsSuspendedFromProvisioning,

        [Parameter()]
        [System.String]
        $JournalRecipient,

        [Parameter()]
        [System.String]
        $MailboxRetention,

        [Parameter()]
        [System.Int64]
        $MetaCacheDatabaseMaxCapacityInBytes,

        [Parameter()]
        [System.Boolean]
        $MountAtStartup,

        [Parameter()]
        [System.String]
        $OfflineAddressBook,

        [Parameter()]
        [System.String]
        $ProhibitSendQuota,

        [Parameter()]
        [System.String]
        $ProhibitSendReceiveQuota,

        [Parameter()]
        [System.String]
        $RecoverableItemsQuota,

        [Parameter()]
        [System.String]
        $RecoverableItemsWarningQuota,

        [Parameter()]
        [System.Boolean]
        $RetainDeletedItemsUntilBackup,

        [Parameter()]
        [System.Boolean]
        $SkipInitialDatabaseMount
    )

    Add-ToPSBoundParametersFromHashtable -PSBoundParametersIn $PSBoundParameters -ParamsToAdd  @{
        'Identity' = $Name
    }
    Remove-FromPSBoundParametersUsingHashtable -PSBoundParametersIn $PSBoundParameters -ParamsToKeep 'Identity', 'DomainController', 'EdbFilePath', 'LogFolderPath'

    Move-DatabasePath @PSBoundParameters -Confirm:$false -Force
}

<#
    .SYNOPSIS
        Mounts the specified database.
 
    .PARAMETER Name
        The Name parameter specifies the unique name of the mailbox database.
 
    .PARAMETER Credential
        Credentials used to establish a remote PowerShell session to Exchange.
 
    .PARAMETER DatabaseCopyCount
        The number of copies that the database will have once fully configured.
 
    .PARAMETER EdbFilePath
        The EdbFilePath parameter specifies the path to the database files.
 
    .PARAMETER LogFolderPath
        The LogFolderPath parameter specifies the folder location for log
        files.
 
    .PARAMETER Server
        The Server parameter specifies the server on which you want to create
        the database.
 
    .PARAMETER AdServerSettingsPreferredServer
        An optional domain controller to pass to Set-AdServerSettings
        -PreferredServer.
 
    .PARAMETER AllowFileRestore
        The AllowFileRestore parameter specifies whether to allow a database to
        be restored from a backup.
 
    .PARAMETER AllowServiceRestart
        Whether it is okay to restart the Information Store Service after
        adding a database. Defaults to $false.
 
    .PARAMETER AutoDagExcludeFromMonitoring
        The AutoDagExcludedFromMonitoringparameter specifies whether to
        exclude the mailbox database from the ServerOneCopyMonitor, which
        alerts an administrator when a replicated database has only one healthy
        copy available.
 
    .PARAMETER BackgroundDatabaseMaintenance
        The BackgroundDatabaseMaintenance parameter specifies whether the
        Extensible Storage Engine (ESE) performs database maintenance.
 
    .PARAMETER CalendarLoggingQuota
        The CalendarLoggingQuota parameter specifies the maximum size of the
        log in the Recoverable Items folder of the mailbox that stores
        changes to calendar items.
 
    .PARAMETER CircularLoggingEnabled
        The CircularLoggingEnabled parameter specifies whether circular
        logging is enabled for the database.
 
    .PARAMETER DataMoveReplicationConstraint
        The DataMoveReplicationConstraint parameter specifies the throttling
        behavior for high availability mailbox moves.
 
    .PARAMETER DeletedItemRetention
        The DeletedItemRetention parameter specifies the length of time to keep
        deleted items in the Recoverable Items\Deletions folder in mailboxes.
 
    .PARAMETER DomainController
        The DomainController parameter specifies the domain controller that's
        used by this cmdlet to read data from or write data to Active
        Directory. You identify the domain controller by its fully qualified
        domain name (FQDN). For example, dc01.contoso.com.
 
    .PARAMETER EventHistoryRetentionPeriod
        The EventHistoryRetentionPeriod parameter specifies the length of time
        to keep event data.
 
    .PARAMETER IndexEnabled
        The IndexEnabled parameter specifies whether Exchange Search indexes
        the mailbox database.
 
    .PARAMETER IsExcludedFromProvisioning
        The IsExcludedFromProvisioning parameter specifies whether to exclude
        the database from the mailbox provisioning load balancer that
        distributes new mailboxes randomly and evenly across the available
        databases.
 
    .PARAMETER IsExcludedFromProvisioningByOperator
        The IIsExcludedFromProvisioningByOperator parameter specifies whether
        to exclude the database from the mailbox provisioning load balancer
        that distributes new mailboxes randomly and evenly across the available
        databases.
 
    .PARAMETER IsExcludedFromProvisioningDueToLogicalCorruption
        The IsExcludedFromProvisioningDueToLogicalCorruption parameter
        specifies whether to exclude the database from the mailbox
        provisioning load balancer that distributes new mailboxes randomly and
        evenly across the available databases.
 
    .PARAMETER IsExcludedFromProvisioningReason
        The IsExcludedFromProvisioningReason parameter specifies the reason
        why you excluded the mailbox database from the mailbox provisioning
        load balancer.
 
    .PARAMETER IssueWarningQuota
        The IssueWarningQuota parameter specifies the warning threshold for the
        size of the mailbox.
 
    .PARAMETER IsSuspendedFromProvisioning
        The IsSuspendedFromProvisioning parameter specifies whether to exclude
        the database from the mailbox provisioning load balancer that
        distributes new mailboxes randomly and evenly across the available
        databases.
 
    .PARAMETER JournalRecipient
        The JournalRecipient parameter specifies the journal recipient to use
        for per-database journaling for all mailboxes on the database.
 
    .PARAMETER MailboxRetention
        The MailboxRetention parameter specifies the length of time to keep
        deleted mailboxes before they are permanently deleted or purged.
 
    .PARAMETER MetaCacheDatabaseMaxCapacityInBytes
        The MetaCacheDatabaseMaxCapacityInBytes parameter specifies the size of
        the metacache database in bytes. To convert gigabytes to bytes,
        multiply the value by 1024^3. For terabytes to bytes, multiply by
        1024^4.
 
    .PARAMETER MountAtStartup
        The MountAtStartup parameter specifies whether to mount the mailbox
        database when the Microsoft Exchange Information Store service starts.
 
    .PARAMETER OfflineAddressBook
        The OfflineAddressBook parameter specifies the offline address book
        that's associated with the mailbox database.
 
    .PARAMETER ProhibitSendQuota
        The ProhibitSendQuota parameter specifies a size limit for the mailbox.
        If the mailbox reaches or exceeds this size, the mailbox can't send
        new messages, and the user receives a descriptive warning message.
 
    .PARAMETER ProhibitSendReceiveQuota
        The ProhibitSendReceiveQuota parameter specifies a size limit for the
        mailbox. If the mailbox reaches or exceeds this size, the mailbox can't
        send or receive new messages. Messages sent to the mailbox are returned
        to the sender with a descriptive error message. This value effectively
        determines the maximum size of the mailbox.
 
    .PARAMETER RecoverableItemsQuota
        The RecoverableItemsQuota parameter specifies the maximum size for the
        Recoverable Items folder of the mailbox.
 
    .PARAMETER RecoverableItemsWarningQuota
        The RecoverableItemsWarningQuota parameter specifies the warning
        threshold for the size of the Recoverable Items folder for the mailbox.
 
    .PARAMETER RetainDeletedItemsUntilBackup
        The RetainDeletedItemsUntilBackup parameter specifies whether to keep
        items in the Recoverable Items\Deletions folder of the mailbox until
        the next database backup occurs.
 
    .PARAMETER SkipInitialDatabaseMount
        Whether the initial mount of databases should be skipped after database
        creation.
#>

function Mount-DatabaseInternal
{
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory = $true)]
        [System.String]
        $Name,

        [Parameter(Mandatory = $true)]
        [System.Management.Automation.PSCredential]
        [System.Management.Automation.Credential()]
        $Credential,

        [Parameter(Mandatory = $true)]
        [System.UInt32]
        $DatabaseCopyCount,

        [Parameter(Mandatory = $true)]
        [System.String]
        $EdbFilePath,

        [Parameter(Mandatory = $true)]
        [System.String]
        $LogFolderPath,

        [Parameter(Mandatory = $true)]
        [System.String]
        $Server,

        [Parameter()]
        [System.String]
        $AdServerSettingsPreferredServer,

        [Parameter()]
        [System.Boolean]
        $AllowFileRestore,

        [Parameter()]
        [System.Boolean]
        $AllowServiceRestart = $false,

        [Parameter()]
        [System.Boolean]
        $AutoDagExcludeFromMonitoring,

        [Parameter()]
        [System.Boolean]
        $BackgroundDatabaseMaintenance,

        [Parameter()]
        [System.String]
        $CalendarLoggingQuota,

        [Parameter()]
        [System.Boolean]
        $CircularLoggingEnabled,

        [Parameter()]
        [ValidateSet('None', 'SecondCopy', 'SecondDatacenter', 'AllDatacenters', 'AllCopies')]
        [System.String]
        $DataMoveReplicationConstraint,

        [Parameter()]
        [System.String]
        $DeletedItemRetention,

        [Parameter()]
        [System.String]
        $DomainController,

        [Parameter()]
        [System.String]
        $EventHistoryRetentionPeriod,

        [Parameter()]
        [System.Boolean]
        $IndexEnabled,

        [Parameter()]
        [System.Boolean]
        $IsExcludedFromProvisioning,

        [Parameter()]
        [System.Boolean]
        $IsExcludedFromProvisioningByOperator,

        [Parameter()]
        [System.Boolean]
        $IsExcludedFromProvisioningDueToLogicalCorruption,

        [Parameter()]
        [System.String]
        $IsExcludedFromProvisioningReason,

        [Parameter()]
        [System.String]
        $IssueWarningQuota,

        [Parameter()]
        [System.Boolean]
        $IsSuspendedFromProvisioning,

        [Parameter()]
        [System.String]
        $JournalRecipient,

        [Parameter()]
        [System.String]
        $MailboxRetention,

        [Parameter()]
        [System.Int64]
        $MetaCacheDatabaseMaxCapacityInBytes,

        [Parameter()]
        [System.Boolean]
        $MountAtStartup,

        [Parameter()]
        [System.String]
        $OfflineAddressBook,

        [Parameter()]
        [System.String]
        $ProhibitSendQuota,

        [Parameter()]
        [System.String]
        $ProhibitSendReceiveQuota,

        [Parameter()]
        [System.String]
        $RecoverableItemsQuota,

        [Parameter()]
        [System.String]
        $RecoverableItemsWarningQuota,

        [Parameter()]
        [System.Boolean]
        $RetainDeletedItemsUntilBackup,

        [Parameter()]
        [System.Boolean]
        $SkipInitialDatabaseMount
    )

    Add-ToPSBoundParametersFromHashtable -PSBoundParametersIn $PSBoundParameters -ParamsToAdd  @{
        'Identity' = $Name
    }
    Remove-FromPSBoundParametersUsingHashtable -PSBoundParametersIn $PSBoundParameters -ParamsToKeep 'Identity', 'DomainController'

    $previousError = Get-PreviousError

    Mount-Database @PSBoundParameters

    Assert-NoNewError -CmdletBeingRun 'Mount-Database' -PreviousError $previousError -Verbose:$VerbosePreference
}

Export-ModuleMember -Function *-TargetResource