Public/Discovery/Get-ActiveCasConnection.ps1

function Get-ActiveCasConnection {
    <#
    .SYNOPSIS
    Collect counters that show point-in-time use of various protocols (IMAP, POP, EWS, IIS, OWA, RPC)
 
    .DESCRIPTION
    Collect counters that show point-in-time use of various protocols (IMAP, POP, EWS, IIS, OWA, RPC)
    If you have mixed environment run from highest version
    For example, if you have Exchange 2010, 2013 and 2016 - Run from Exchange 2016 server
 
    NOTE: This is designed to run against servers where the services are running.
    You must verify POP and IMAP service is running on all the CAS servers prior to adding it to the list of servers
 
    For example, if the POP service is not running, add '#' to the POP object below, just like this:
    `# POP = [math]::Truncate((Get-Counter "\MSExchangePOP3(_total)\Connections Current" -ComputerName $CurServer).CounterSamples[0].Cookedvalue)`
 
    To verify POP3 and/or IMAP4 service is running run these commands (once):
    ```
    $CAS = Get-ClientAccessServer | Select -ExpandProperty name
    $CAS | % {write-host "`n`nServer: $($_)`nPOP3" -foregroundcolor "Green";Get-service -ComputerName $_ -ServiceName MSExchangePOP3 | Select -expandproperty status }
    $CAS | % {write-host "`n`nServer: $($_)`nIMAP4" -foregroundcolor "Cyan";Get-service -ComputerName $_ -ServiceName MSExchangeIMAP4 | Select -expandproperty status }
    ```
    .PARAMETER LogPath
    Where the log file will be automatically generated. Example c:\scripts
 
    .PARAMETER SleepBetweenChecks
    After each server is checked, the script waits this amount of time (seconds) before proceeding to the next server
 
    .PARAMETER Server
    Feed a list of servers to the function
    This should be passed via the pipeline as demonstrated in the examples below
 
    .EXAMPLE
    $CAS = Get-ClientAccessServer | Select -ExpandProperty name
    for ($i=0 ; $i -lt 10 ; $i++) {$CAS | Get-ActiveCASConnection -LogPath C:\scripts -SleepBetweenChecks 10}
 
    This example runs the check 10 times against each server
 
    .EXAMPLE
    $CAS = "Server01", "Server02"
    for ($i=0 ; $i -lt 100 ; $i++) {$CAS | Get-ActiveCASConnection -LogPath C:\scripts -SleepBetweenChecks 10}
 
    This example runs the check 100 times against each server for only Server01 and Server 02
 
    .NOTES
    Counters retrieved are:
        RPC = RPC Client Access Connections
        OWA = Current Unique OWA users
        EAS = EAS Requests/Sec
        IMAP = IMAP Total Connections
        POP = POP Connections Current
        WSR = Exchange Web Services Requests/Sec
        WST = Web Service (IIS) Total Current Connections
 
        This can be a precursor to enabling protocol logging
 
        For example:
        Set-ImapSettings -ProtocolLogEnabled:$True -LogPerFileSizeQuota 0 -LogFileRollOverSettings Hourly
 
    #>

    [CmdletBinding(SupportsShouldProcess = $true)]
    param (

        [Parameter(Mandatory = $true)]
        $LogPath,

        [Parameter(Mandatory = $true)]
        [int] $SleepBetweenChecks,

        [Parameter(ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true,
            Mandatory = $true)]
        $Server

    )

    begin {
        $Log = Join-Path $LogPath "CasConnections.csv"

        if (-not (Test-Path $Log)) {
            # $headerstring = ('Server' + "," + 'RPC' + "," + 'OWA' + "," + 'EAS' + "," + 'IMAP' + "," + 'POP' + "," + 'WSR' + "," + 'WST' + "," + 'Time')

            # Use when POP3 is not present on the servers
            $headerstring = ('Server' + "," + 'RPC' + "," + 'OWA' + "," + 'EAS' + "," + 'IMAP' + "," + 'WSR' + "," + 'WST' + "," + 'Time')

            # Use when IMAP4 is not present on the servers
            # $headerstring = ('Server' + "," + 'RPC' + "," + 'OWA' + "," + 'EAS' + "," + 'POP' + "," + 'WSR' + "," + 'WST' + "," + 'Time')

            # Use when neither POP nor IMAP is present on the servers
            # $headerstring = ('Server' + "," + 'RPC' + "," + 'OWA' + "," + 'EAS' + "," + "," + 'WSR' + "," + 'WST' + "," + 'Time')

            Out-File -FilePath $Log -InputObject $headerstring -Encoding UTF8 -Append
        }
    }

    process {

        ForEach ($CurServer In $Server) {
            write-host "Checking Connections on SERVER:`t $CurServer"
            $Object = New-Object -TypeName PSObject -Property @{
                Server = $CurServer
                RPC    = (Get-Counter "\MSExchange RpcClientAccess\User Count" -ComputerName $CurServer).CounterSamples[0].Cookedvalue
                OWA    = (Get-Counter "\MSExchange OWA\Current Unique Users" -ComputerName $CurServer).CounterSamples[0].Cookedvalue
                EAS    = [math]::Truncate((Get-Counter "\MSExchange ActiveSync\Requests/sec" -ComputerName $CurServer).CounterSamples[0].Cookedvalue)
                IMAP   = [math]::Truncate((Get-Counter "\MSExchangeImap4(_total)\Current Connections" -ComputerName $CurServer).CounterSamples[0].Cookedvalue)
                # POP = [math]::Truncate((Get-Counter "\MSExchangePOP3(_total)\Connections Current" -ComputerName $CurServer).CounterSamples[0].Cookedvalue)
                WSR    = [math]::Truncate((Get-Counter "\MSExchangeWS\Requests/sec" -ComputerName $CurServer).CounterSamples[0].Cookedvalue)
                WST    = (Get-Counter "\Web Service(_Total)\Current Connections" -ComputerName $CurServer).CounterSamples[0].Cookedvalue
                Time   = (Get-Date).ToString("yyyy/MM/dd HH:mm:ss")
            }
        }

        # Use when POP and IMAP are both present on the servers
        # $Object.Server + "," + $Object.RPC + "," + $Object.OWA + "," + $Object.EAS + "," + $Object.IMAP + "," + $Object.POP + "," + $Object.WSR + "," + $Object.WST + "," + $Object.Time | Out-File -FilePath $Log -Encoding UTF8 -Append

        # Use when POP3 is not present on the servers
        $Object.Server + "," + $Object.RPC + "," + $Object.OWA + "," + $Object.EAS + "," + $Object.IMAP + "," + $Object.WSR + "," + $Object.WST + "," + $Object.Time | Out-File -FilePath $Log -Encoding UTF8 -Append

        # Use with IMAP4 is not present on the servers
        # $Object.Server + "," + $Object.RPC + "," + $Object.OWA + "," + $Object.EAS + "," + $Object.POP + "," + $Object.WSR + "," + $Object.WST + "," + $Object.Time | Out-File -FilePath $Log -Encoding UTF8 -Append

        # Use when neither POP nor IMAP is present on the servers
        # $Object.Server + "," + $Object.RPC + "," + $Object.OWA + "," + $Object.EAS + "," + $Object.WSR + "," + $Object.WST + "," + $Object.Time | Out-File -FilePath $Log -Encoding UTF8 -Append

        Start-Sleep -Seconds $SleepBetweenChecks
    }

    end {

    }
}