Private/Test-XenServer.ps1

function Test-XenServer {
    <#
.SYNOPSIS
    Checks the Status of the XenServer Pools Passed In
.DESCRIPTION
    Checks the Status of the XenServer Pools Passed In
.PARAMETER PoolMasters
    Comma Delimited List of XenServer Pool Masters to check
.PARAMETER ConnectionPort
    TCP Port to use for XenServer Connectivity Tests
.PARAMETER ErrorFile
    Infrastructure Error File to Log To
.PARAMETER XenUserName
    XenServer Username
.PARAMETER XenPassword
    XenServer Password
.NOTES
    Current Version: 1.0
    Creation Date: 22/02/2018
.CHANGE CONTROL
    Name Version Date Change Detail
    David Brett 1.0 22/02/2018 Function Creation
    Ryan Butler 1.1 28/03/2018 Returns object
    David Brett 1.2 16/06/2018 Updated for Object Model
.EXAMPLE
    None Required
#>

    [CmdletBinding()]
    Param
    (
        [parameter(Mandatory = $true, ValueFromPipeline = $true)]$PoolMaster,
        [parameter(Mandatory = $true, ValueFromPipeline = $true)]$XenUserName,
        [parameter(Mandatory = $true, ValueFromPipeline = $true)][System.Security.SecureString]$XenPassword
    )

    #Create array with results
    $Results = @()
    $Errors = @()

    # Convert Secure Password to Standard Text
    $BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($XenPassword)
    $UnsecurePassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)

    # Import XenServer SDK
    import-module Xen*
    $xenTest = get-module xen*
    if ($null -eq $xentest) {
        write-verbose "XenServer checks are enabled but no XenServer SDK Found"
        $Errors += "XenServer checks are enabled but no XenServer SDK Found"
    }
    else {
        Write-Verbose "XenServer SDK Imported Sucessfully"
        Write-Verbose "XenServer Pool Master: $PoolMaster"
        Write-Verbose "Management Port: 80"

        $HostsUp = 0
        $HostsDown = 0


        $Session = Connect-XenServer $PoolMaster -Port 80 -UserName $XenUserName -Password $UnsecurePassword
        Write-Verbose "Connecting to XenServer Pool Using PoolMaster $PoolMaster"

        $XenHosts = Get-XenHost

        # Loop Through Each Host and Check Availability and Management Access
        foreach ($XenHost in $XenHosts) {

            # Get the HostName and IP Addressd for the XenServer Host
            $XenHostName = $XenHost.hostname
            $XenIP = $XenHost.address
            Write-Verbose "XenServer Details - $XenHostName / $XenIP"

            if ((Connect-Server $XenIP) -eq "Successful") {
                Write-Verbose "XenServer Host - $XenHostName is up"

                # If Host Management Port is UP log to Console and Increment UP Port Count
                if ( Test-NetConnection -ComputerName $XenIP -Port 80 -InformationLevel Quiet ) {
                    Write-Verbose "$XenHostName Management Port is up: Port - 80"
                    $HostsUp ++
                }
                else {
                    Write-Verbose "$XenHostName Management Port is down - Port - $ConnectionPort" 
                    $Errors += "$XenHostName Management Port is down"
                    $HostsDown ++
                }
            }
            else {
                Write-Verbose "XenServer Host - $XenHostName is down"
                $Errors += "XenServer Host - $XenHostName is down"
                $HostsDown ++
            }
        }
        Disconnect-XenServer -Session $session

        $results += [PSCustomObject]@{
            'PoolMaster' = $poolmaster
            'HostsUp'    = $HostsUp
            'HostsDown'  = $HostsDown
            'Errors'     = $Errors
        }

        #Returns test results
        return $results
    
    }

}