Private/Test-ProvisioningServers.ps1

function Test-ProvisioningServers {
    <#
.SYNOPSIS
    Tests Citrix Provisioning Servers Functionailty.
.DESCRIPTION
    Tests Citrix Provisioning Servers Functionailty..
    Currently Testing
        PVS Server Availability
        PVS Management Port Connectivity
        All Services passed into the module
.PARAMETER ProvisioningServers
    Comma Delimited List of Provisioning Servers to check
.PARAMETER ProvisioningServerPortString
    TCP Port to use for Provisioning Server Connectivity Tests
.PARAMETER ProvisioningServerServices
    Provisioning Server Services to check
.PARAMETER ErrorFile
    Infrastructure Error File to Log To
.PARAMETER OutputFile
    Infrastructure OutputFile
.NOTES
    Current Version: 1.0
    Creation Date: 14/03/2018
.CHANGE CONTROL
    Name Version Date Change Detail
    James Kindon 1.0 14/03/2018 Function Creation
.EXAMPLE
    None Required
#>
 

    Param
    (
        [parameter(Mandatory = $true, ValueFromPipeline = $true)]$ProvisioningServers,
        [parameter(Mandatory = $true, ValueFromPipeline = $true)]$ProvisioningServerPortString,
        [parameter(Mandatory = $true, ValueFromPipeline = $true)]$ProvisioningServerServices,
        [parameter(Mandatory = $true, ValueFromPipeline = $true)]$ErrorFile,
        [parameter(Mandatory = $true, ValueFromPipeline = $true)]$OutputFile

    )

    # Initialize Arrays and Variables
    $ProvisioningServerUp = 0
    $ProvisioningServerDown = 0
    Write-Verbose "Variables and Arrays Initalized"

    # Get Provisioning Server Comma Delimited List
    $ProvisioningServers = $ProvisioningServers.Split(",")
    $ProvisioningServerServices = $ProvisioningServerServices.Split(",")
    Write-Verbose "Read in Provisioning Server Details"
    Write-Verbose "Provisioning Server Farm: $ProvisioningServerFarm"
    Write-Verbose "Provisioning Server Site: $ProvisioningServerSite"
    Write-Verbose "Provisioning Servers: $ProvisioningServers"
    Write-Verbose "Provisioning Server Ports: $ProvisioningServerPortString" 
    Write-Verbose "Provisioning Server Services: $ProvisioningServerServices"

    foreach ($ProvisioningServer in $ProvisioningServers) {

        # Check that the Provisioning Server is up
        if ((Connect-Server $ProvisioningServer) -eq "Successful") {
            
            # Server is up and responding to ping
            Write-Verbose "$ProvisioningServer is online and responding to ping" 

            # Check the Provisioning Server Port
            if ((Test-NetConnection $ProvisioningServer $ProvisioningServerPortString).open -eq "True") {

                # PVS Server port is up and running
                Write-Verbose "$ProvisioningServer Server Port is up: Port - $ProvisioningServerPortString"

                # Check all critical services are running on the PVS Server
                # Initalize Pre loop variables and set Clean Run Services to Yes
                $ServicesUp = "Yes"
                $ServiceError = ""

                # Check Each Service for a Running State
                foreach ($Service in $ProvisioningServerServices) {
                    $CurrentServiceStatus = Check-Service $ProvisioningServer $Service
                    If ($CurrentServiceStatus -ne "Running") {
                        # If the Service is not running set ServicesUp to No and Append The Service with an error to the error description
                        if ($ServiceError -eq "") {
                            $ServiceError = $Service
                        }
                        else {
                            $ServiceError = $ServiceError + ", " + $Service
                        }
                        $ServicesUp = "no"
                    }
                }

                # Check for ALL services running, if so mark Provisioning Server as UP, if not Mark as down and increment down count
                if ($ServicesUp -eq "Yes") {
                    # The Provisioning Server and all services tested successfully - mark as UP
                    Write-Verbose "$ProvisioningServer is up and all Services and running in Site $ProvisioningServerSite in Farm $ProvisioningServerFarm"
                    $ProvisioningServerUp++
                }
                else {
                    # There was an error with one or more of the services
                    Write-Verbose "$ProvisioningServer Service error - $ServiceError - is degraded or stopped."
                    "$ProvisioningServer Service error - $ServiceError - is degraded or stopped." | Out-File $ErrorFile -Append
                    $ProvisioningServerDown++
                }
                
            }
            else {
                # Provisioning Server Broker Port is down - mark down, error log and increment down count
                Write-Verbose "$ProvisioningServer Server Access Port is down - Port - $ProvisioningServerPortString"
                "$ProvisioningServer Server Access Port is down - Port - $ProvisioningServerPortString" | Out-File $ErrorFile -Append
                $ProvisioningServerDown++
            }

        }
        else {
            # Provisioning Server is down - not responding to ping
            Write-Verbose "$ProvisioningServer is down in Site $ProvisioningServerSite in Farm $ProvisioningServerFarm" 
            "$ProvisioningServer is down"  | Out-File $ErrorFile -Append
            $ProvisioningServerDown++
        }
    }

    # Write Data to Output File
    Write-Verbose "Writing Provisioning Server Data to output file"
    "ProvisioningServer,$ProvisioningServerUp,$ProvisioningServerDown" | Out-File $OutputFile
}