DSCResources/DSC_ExchSendConnector/DSC_ExchSendConnector.psm1

<#
    .SYNOPSIS
        Gets the resource state.
     .PARAMETER Name
        Specifies a descriptive name for the connector.
    .PARAMETER Credential
        Credentials used to establish a remote PowerShell session to Exchange.
    .PARAMETER AddressSpaces
        Specifies the domain names to which the Send connector routes mail.
#>

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.String[]]
        $AddressSpaces
    )

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

    # Establish remote PowerShell session
    Get-RemoteExchangeSession -Credential $Credential -CommandsToLoad 'Get-SendConnector', 'Get-ADPermission' -Verbose:$VerbosePreference

    $connector = Get-SendConnector -ErrorAction SilentlyContinue | Where-Object -Property 'Identity' -eq $Name

    if ($null -ne $connector)
    {
        $adPermissions = Get-ADExtendedPermissions -Identity $Name

        $returnValue = @{
            Name                         = [System.String] $connector.Name
            AddressSpaces                = [System.String[]] $connector.AddressSpaces
            Comment                      = [System.String] $connector.Comment
            ConnectionInactivityTimeout  = [System.String] $connector.ConnectionInactivityTimeout
            ConnectorType                = [System.String] $connector.ConnectorType
            DNSRoutingEnabled            = [System.Boolean] $connector.DNSRoutingEnabled
            DomainSecureEnabled          = [System.Boolean] $connector.DomainSecureEnabled
            Enabled                      = [System.Boolean] $connector.Enabled
            ErrorPolicies                = [System.String] $connector.ErrorPolicies
            ExtendedProtectionPolicy     = [System.String] $connector.ExtendedProtectionPolicy
            ExtendedRightAllowEntries    = [Microsoft.Management.Infrastructure.CimInstance[]] $adPermissions['ExtendedRightAllowEntries']
            ExtendedRightDenyEntries     = [Microsoft.Management.Infrastructure.CimInstance[]] $adPermissions['ExtendedRightDenyEntries']
            ForceHELO                    = [System.Boolean] $connector.ForceHELO
            FrontendProxyEnabled         = [System.Boolean] $connector.FrontendProxyEnabled
            Fqdn                         = [System.String] $connector.Fqdn
            IgnoreSTARTTLS               = [System.Boolean] $connector.IgnoreSTARTTLS
            IsCoexistenceConnector       = [System.Boolean] $connector.IsCoexistenceConnector
            IsScopedConnector            = [System.Boolean] $connector.IsScopedConnector
            LinkedReceiveConnector       = [System.String] $connector.LinkedReceiveConnector
            MaxMessageSize               = [System.String] $connector.MaxMessageSize
            Port                         = [System.Int32] $connector.Port
            ProtocolLoggingLevel         = [System.String] $connector.ProtocolLoggingLevel
            RequireTLS                   = [System.Boolean] $connector.RequireTLS
            SmartHostAuthMechanism       = [System.String] $connector.SmartHostAuthMechanism
            SmartHosts                   = [System.String[]] $connector.SmartHosts
            SmtpMaxMessagesPerConnection = [System.Int32] $connector.SmtpMaxMessagesPerConnection
            SourceIPAddress              = [System.String] $connector.SourceIPAddress
            SourceTransportServers       = [System.String[]] $connector.SourceTransportServers
            TlsDomain                    = [System.String] $connector.TlsDomain
            TlsAuthLevel                 = [System.String] $connector.TlsAuthLevel
            UseExternalDNSServersEnabled = [System.Boolean] $connector.UseExternalDNSServersEnabled
            TlsCertificateName           = [System.String] $connector.TlsCertificateName
            Ensure                       = 'Present'
        }
    }
    else
    {
        $returnValue = @{
            Ensure = 'Absent'
        }
    }

    $returnValue
}

<#
    .SYNOPSIS
        Sets the resource state.
    .PARAMETER Name
        Specifies a descriptive name for the connector.
    .PARAMETER Credential
        Credentials used to establish a remote PowerShell session to Exchange.
    .PARAMETER Ensure
        Whether the connector should be present or not.
    .PARAMETER AddressSpaces
        Specifies the domain names to which the Send connector routes mail.
    .PARAMETER AuthenticationCredential
        Specifies the username and password that's required to use the connector.
    .PARAMETER Comment
        Specifies an optional comment.
    .PARAMETER ConnectionInactivityTimeout
        Specifies the maximum time an idle connection can remain open.
    .PARAMETER ConnectorType
        Specifies whether the connector is used in hybrid deployments to send messages to Office 365.
    .PARAMETER DNSRoutingEnabled
        Specifies whether the Send connector uses Domain Name System
    .PARAMETER DomainController
        Specifies the domain controller that's used by this cmdlet to read data from or write data to Active Directory.
    .PARAMETER DomainSecureEnabled
        Enables mutual Transport Layer Security
    .PARAMETER Enabled
        Specifies whether to enable the Send connector to process email messages.
    .PARAMETER ErrorPolicies
        Specifies how communication errors are treated.
    .PARAMETER ExtendedRightAllowEntries
        Additional allow permissions.
    .PARAMETER ExtendedRightDenyEntries
        Additional deny permissions.
    .PARAMETER ForceHELO
        Specifies whether HELO is sent instead of the default EHLO.
    .PARAMETER FrontendProxyEnabled
        Routes outbound messages through the CAS server
    .PARAMETER Fqdn
        Specifies the FQDN used as the source server.
    .PARAMETER IgnoreSTARTTLS
        Specifies whether to ignore the StartTLS option offered by a remote sending server.
    .PARAMETER IsCoexistenceConnector
        Specifies whether this Send connector is used for secure mail flow between your on
    .PARAMETER IsScopedConnector
        Specifies the availability of the connector to other Mailbox servers with the Transport service.
    .PARAMETER LinkedReceiveConnector
        Specifies whether to force all messages received by the specified Receive connector out through this Send connector.
    .PARAMETER MaxMessageSize
        Specifies the maximum size of a message that can pass through a connector.
    .PARAMETER Port
        Specifies the port number for smart host forwarding.
    .PARAMETER ProtocolLoggingLevel
        Specifies whether to enable protocol logging.
    .PARAMETER RequireTLS
        Specifies whether all messages sent through this connector must be transmitted using TLS.
    .PARAMETER SmartHostAuthMechanism
        Specifies the smart host authentication mechanism to use for authentication.
    .PARAMETER SmartHosts
        Specifies the smart hosts the Send connector uses to route mail.
    .PARAMETER SmtpMaxMessagesPerConnection
        Specifies the maximum number of messages the server can send per connection.
    .PARAMETER SourceIPAddress
        Specifies the local IP address to use as the endpoint for an SMTP connection.
    .PARAMETER SourceTransportServers
        Specifies the names of the Mailbox servers that can use this Send connector.
    .PARAMETER TlsAuthLevel
        Specifies the TLS authentication level that is used for outbound TLS connections.
    .PARAMETER TlsDomain
        Specifies the domain name that the Send connector uses to verify the FQDN of the target certificate.
    .PARAMETER UseExternalDNSServersEnabled
        Specifies whether the connector uses the external DNS list specified by the ExternalDNSServers parameter of the Set
    .PARAMETER TlsCertificateName
        Specifies the X.509 certificate to use for TLS encryption.
    .PARAMETER Usage
        Specifies the default permissions and authentication methods assigned to the Send connector.
#>

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

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

        [Parameter()]
        [ValidateSet('Present', 'Absent')]
        [System.String]
        $Ensure = 'Present',

        [Parameter()]
        [System.Management.Automation.PSCredential]
        [System.Management.Automation.Credential()]
        $AuthenticationCredential,

        [Parameter()]
        [Microsoft.Management.Infrastructure.CimInstance[]]
        $ExtendedRightAllowEntries = @(),

        [Parameter()]
        [Microsoft.Management.Infrastructure.CimInstance[]]
        $ExtendedRightDenyEntries = @(),

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

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

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

        [Parameter()]
        [ValidateSet('Default', 'XPremises')]
        [System.String]
        $ConnectorType,

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

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

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

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

        [Parameter()]
        [ValidateSet('Default', 'DowngradeAuthFailures', 'DowngradeDNSFailures')]
        [System.String]
        $ErrorPolicies,

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

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

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

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

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

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

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

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

        [Parameter()]
        [System.Int32]
        $Port,

        [Parameter()]
        [ValidateSet('None', 'Verbose')]
        [System.String]
        $ProtocolLoggingLevel,

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

        [Parameter()]
        [ValidateSet('None', 'BasicAuth', 'BasicAuthRequireTLS', 'ExchangeServer', 'ExternalAuthoritative')]
        [System.String]
        $SmartHostAuthMechanism,

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

        [Parameter()]
        [System.Int32]
        $SmtpMaxMessagesPerConnection,

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

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

        [Parameter()]
        [ValidateSet('EncryptionOnly', 'CertificateValidation', 'DomainValidation')]
        [System.String]
        $TlsAuthLevel,

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

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

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

        [Parameter()]
        [ValidateSet('Internal', 'Internet', 'Partner', 'Custom')]
        [System.String]
        $Usage
    )

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

    $connector = Get-TargetResource -Name $Name -Credential $Credential -AddressSpaces $AddressSpaces

    # Establish remote PowerShell session
    Get-RemoteExchangeSession -Credential $Credential -CommandsToLoad '*SendConnector', '*ADPermission' -Verbose:$VerbosePreference

    if ($Ensure -eq 'Absent')
    {
        Write-Verbose -Message "Removing send connector $Name."

        Remove-SendConnector -Identity $Name -DomainController $PSBoundParameters['DomainController'] -Confirm:$false
    }
    else
    {
        # Remove Credential and Ensure so we don't pass it into the next command
        Remove-FromPSBoundParametersUsingHashtable -PSBoundParametersIn $PSBoundParameters -ParamsToRemove 'Credential', 'Ensure', 'ExtendedRightAllowEntries', 'ExtendedRightDenyEntries'

        Set-EmptyStringParamsToNull -PSBoundParametersIn $PSBoundParameters

        # We need to create the new connector
        if ($connector['Ensure'] -eq 'Absent')
        {
            # Create the connector
            Write-Verbose -Message "Creating send connector $Name."

            New-SendConnector @PSBoundParameters

            if (($ExtendedRightAllowEntries -or $ExtendedRightDenyEntries) -and $null -eq $PSBoundParameters['DomainController'])
            {
                $sendConnectorFound = Get-ADPermission -Identity $Name -ErrorAction SilentlyContinue
                $itt = 0

                while ($null -eq $sendConnectorFound -and $itt -le 3)
                {
                    Write-Verbose -Message 'Extended AD permissions were specified and the new connector is still not found in AD. Sleeping for 30 seconds.'
                    Start-Sleep -Seconds 30
                    $itt++
                    $sendConnectorFound = Get-ADPermission -Identity $Name -ErrorAction SilentlyContinue
                }

                if ($null -eq $sendConnectorFound)
                {
                    throw 'The new send connector was not found after 2 minutes of wait time. Please check AD replication!'
                }
            }
            if ($null -ne $PSBoundParameters['DomainController'])
            {
                Write-Verbose -Message 'Setting domain controller as default parameter.'
                $PSDefaultParameterValues = @{
                    'Add-ADPermission:DomainController' = $DomainController
                }
            }
            if ($ExtendedRightAllowEntries)
            {
                Write-Verbose -Message "Setting ExtendedRightAllowEntries for send connector: $Name."

                foreach ($ExtendedRightAllowEntry in $ExtendedRightAllowEntries)
                {
                    foreach ($Value in $($ExtendedRightAllowEntry.Value.Split(',')))
                    {
                        Add-ADPermission -Identity $Name -User $ExtendedRightAllowEntry.Key -ExtendedRights $Value
                    }
                }
            }

            if ($ExtendedRightDenyEntries)
            {
                Write-Verbose -Message "Setting ExtendedRightDenyEntries for send connector: $Name."

                foreach ($ExtendedRightDenyEntry in $ExtendedRightDenyEntries)
                {
                    foreach ($Value in $($ExtendedRightDenyEntry.Value.Split(',')))
                    {
                        Add-ADPermission -Identity $Name -User $ExtendedRightDenyEntry.Key -ExtendedRights $Value -Deny -Confirm:$false
                    }
                }
            }
        }
        else
        {
            Write-Verbose -Message "Send connector $Name not compliant. Setting the properties."

            # Usage is not a valid command for Set-SendConnector
            Remove-FromPSBoundParametersUsingHashtable -PSBoundParametersIn $PSBoundParameters -ParamsToRemove 'Ensure', 'ExtendedRightAllowEntries', 'ExtendedRightDenyEntries' , 'Name', 'Usage'

            $PSBoundParameters['Identity'] = $Name
            Set-SendConnector  @PSBoundParameters

            if ($null -ne $PSBoundParameters['DomainController'])
            {
                $PSDefaultParameterValues = @{
                    'Add-ADPermission:DomainController' = $DomainController
                }
            }
            # Set AD permissions
            if ($ExtendedRightAllowEntries)
            {
                foreach ($ExtendedRightAllowEntry in $ExtendedRightAllowEntries)
                {
                    foreach ($Value in $($ExtendedRightAllowEntry.Value.Split(',')))
                    {
                        Add-ADPermission -Identity $Name -User $ExtendedRightAllowEntry.Key -ExtendedRights $Value
                    }
                }
            }

            if ($ExtendedRightDenyEntries)
            {
                foreach ($ExtendedRightDenyEntry in $ExtendedRightDenyEntries)
                {
                    foreach ($Value in $($ExtendedRightDenyEntry.Value.Split(',')))
                    {
                        Add-ADPermission -Identity $Name -User $ExtendedRightDenyEntry.Key -ExtendedRights $Value -Deny -Confirm:$false
                    }
                }
            }
        }
    }
}

<#
    .SYNOPSIS
        Tets the resource state.
    .PARAMETER Name
        Specifies a descriptive name for the connector.
    .PARAMETER Credential
        Credentials used to establish a remote PowerShell session to Exchange.
    .PARAMETER Ensure
        Whether the connector should be present or not.
    .PARAMETER AddressSpaces
        Specifies the domain names to which the Send connector routes mail.
    .PARAMETER AuthenticationCredential
        Specifies the username and password that's required to use the connector.
    .PARAMETER Comment
        Specifies an optional comment.
    .PARAMETER ConnectionInactivityTimeout
        Specifies the maximum time an idle connection can remain open.
    .PARAMETER ConnectorType
        Specifies whether the connector is used in hybrid deployments to send messages to Office 365.
    .PARAMETER DNSRoutingEnabled
        Specifies whether the Send connector uses Domain Name System
    .PARAMETER DomainController
        Specifies the domain controller that's used by this cmdlet to read data from or write data to Active Directory.
    .PARAMETER DomainSecureEnabled
        Enables mutual Transport Layer Security
    .PARAMETER Enabled
        Specifies whether to enable the Send connector to process email messages.
    .PARAMETER ErrorPolicies
        Specifies how communication errors are treated.
    .PARAMETER ExtendedRightAllowEntries
        Additional allow permissions.
    .PARAMETER ExtendedRightDenyEntries
        Additional deny permissions.
    .PARAMETER ForceHELO
        Specifies whether HELO is sent instead of the default EHLO.
    .PARAMETER FrontendProxyEnabled
        Routes outbound messages through the CAS server
    .PARAMETER Fqdn
        Specifies the FQDN used as the source server.
    .PARAMETER IgnoreSTARTTLS
        Specifies whether to ignore the StartTLS option offered by a remote sending server.
    .PARAMETER IsCoexistenceConnector
        Specifies whether this Send connector is used for secure mail flow between your on
    .PARAMETER IsScopedConnector
        Specifies the availability of the connector to other Mailbox servers with the Transport service.
    .PARAMETER LinkedReceiveConnector
        Specifies whether to force all messages received by the specified Receive connector out through this Send connector.
    .PARAMETER MaxMessageSize
        Specifies the maximum size of a message that can pass through a connector.
    .PARAMETER Port
        Specifies the port number for smart host forwarding.
    .PARAMETER ProtocolLoggingLevel
        Specifies whether to enable protocol logging.
    .PARAMETER RequireTLS
        Specifies whether all messages sent through this connector must be transmitted using TLS.
    .PARAMETER SmartHostAuthMechanism
        Specifies the smart host authentication mechanism to use for authentication.
    .PARAMETER SmartHosts
        Specifies the smart hosts the Send connector uses to route mail.
    .PARAMETER SmtpMaxMessagesPerConnection
        Specifies the maximum number of messages the server can send per connection.
    .PARAMETER SourceIPAddress
        Specifies the local IP address to use as the endpoint for an SMTP connection.
    .PARAMETER SourceTransportServers
        Specifies the names of the Mailbox servers that can use this Send connector.
    .PARAMETER TlsAuthLevel
        Specifies the TLS authentication level that is used for outbound TLS connections.
    .PARAMETER TlsDomain
        Specifies the domain name that the Send connector uses to verify the FQDN of the target certificate.
    .PARAMETER UseExternalDNSServersEnabled
        Specifies whether the connector uses the external DNS list specified by the ExternalDNSServers parameter of the Set
    .PARAMETER TlsCertificateName
        Specifies the X.509 certificate to use for TLS encryption.
    .PARAMETER Usage
        Specifies the default permissions and authentication methods assigned to the Send connector.
#>

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()]
        [ValidateSet('Present', 'Absent')]
        [System.String]
        $Ensure,

        [Parameter()]
        [System.Management.Automation.PSCredential]
        [System.Management.Automation.Credential()]
        $AuthenticationCredential,

        [Parameter()]
        [Microsoft.Management.Infrastructure.CimInstance[]]
        $ExtendedRightAllowEntries = @(),

        [Parameter()]
        [Microsoft.Management.Infrastructure.CimInstance[]]
        $ExtendedRightDenyEntries = @(),

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

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

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

        [Parameter()]
        [ValidateSet('Default', 'XPremises')]
        [System.String]
        $ConnectorType,

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

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

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

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

        [Parameter()]
        [ValidateSet('Default', 'DowngradeAuthFailures', 'DowngradeDNSFailures')]
        [System.String]
        $ErrorPolicies,

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

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

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

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

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

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

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

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

        [Parameter()]
        [System.Int32]
        $Port,

        [Parameter()]
        [ValidateSet('None', 'Verbose')]
        [System.String]
        $ProtocolLoggingLevel,

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

        [Parameter()]
        [ValidateSet('None', 'BasicAuth', 'BasicAuthRequireTLS', 'ExchangeServer', 'ExternalAuthoritative')]
        [System.String]
        $SmartHostAuthMechanism,

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

        [Parameter()]
        [System.Int32]
        $SmtpMaxMessagesPerConnection,

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

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

        [Parameter()]
        [ValidateSet('EncryptionOnly', 'CertificateValidation', 'DomainValidation')]
        [System.String]
        $TlsAuthLevel,

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

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

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

        [Parameter()]
        [ValidateSet('Internal', 'Internet', 'Partner', 'Custom')]
        [System.String]
        $Usage
    )

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

    $connector = Get-TargetResource -Name $Name -Credential $Credential -AddressSpaces $AddressSpaces

    # Establish remote PowerShell session
    Get-RemoteExchangeSession -Credential $Credential -CommandsToLoad 'Get-SendConnector', 'Get-ADPermission' -Verbose:$VerbosePreference

    $testResults = $true

    if ($connector['Ensure'] -eq 'Absent')
    {
        if ($Ensure -eq 'Present')
        {
            Write-Verbose -Message 'Send Connector should exist, but does not.'
            $testResults = $false
        }
    }
    else
    {
        if ($Ensure -eq 'Absent')
        {
            Write-Verbose -Message 'Send Connector should not exist, but does.'
            $testResults = $false
        }
        else
        {
            # Get AD permissions if necessary
            if (($ExtendedRightAllowEntries) -or ($ExtendedRightDenyEntries))
            {
                if ($PSBoundParameters.ContainsKey('DomainController'))
                {
                    $adPermissions = Get-ADPermission -Identity $Name -DomainController $DomainController | Where-Object { $_.IsInherited -eq $false }
                }
                else
                {
                    $adPermissions = Get-ADPermission -Identity $Name | Where-Object { $_.IsInherited -eq $false }
                }

                $splat = @{
                    ExtendedRightAllowEntries = $ExtendedRightAllowEntries
                    ExtendedRightDenyEntries  = $ExtendedRightDenyEntries
                    ADPermissions             = $adPermissions
                }

                $testResults = Test-ExtendedRights @splat
            }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    return $testResults
}