Public/Get-CTXAPI_FailureReport.ps1


<#PSScriptInfo
 
.VERSION 1.0.2
 
.GUID bcce614e-ed5b-4f57-b35d-526154d152a9
 
.AUTHOR Pierre Smit
 
.COMPANYNAME iOCO Tech
 
.COPYRIGHT
 
.TAGS PowerShell Citrix
 
.LICENSEURI
 
.PROJECTURI
 
.ICONURI
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
Created [22/04/2021_10:08] Initital Script Creating
Updated [22/04/2021_11:42] Script Fle Info was updated
Updated [24/04/2021_07:21] Added details from machines api to extract more data
 
.PRIVATEDATA
 
#>
 

#Requires -Module ImportExcel
#Requires -Module PSWriteHTML
#Requires -Module PSWriteColor


<#
 
.DESCRIPTION
Creates a report on connection and machine failures in the last x hours
 
#>
 

Param()


Function Get-CTXAPI_FailureReport {
    PARAM(
        [Parameter(Mandatory = $true, Position = 0)]
        [ValidateNotNullOrEmpty()]
        [string]$CustomerId,
        [Parameter(Mandatory = $true, Position = 1)]
        [ValidateNotNullOrEmpty()]
        [string]$SiteId,
        [Parameter(Mandatory = $true, Position = 2)]
        [ValidateNotNullOrEmpty()]
        [string]$ApiToken,
        [Parameter(Mandatory = $true, Position = 3)]
        [ValidateNotNullOrEmpty()]
        [ValidateSet('us', 'eu', 'ap-s')]
        [string]$region,
        [ValidateNotNullOrEmpty()]
        [Parameter(Mandatory = $true, Position = 4)]
        [int]$hours,
        [Parameter(Mandatory = $true, Position = 5)]
        [ValidateNotNullOrEmpty()]
        [ValidateSet('Connection', 'Machine')]
        [string]$FailureType,
        [Parameter(Mandatory = $false, Position = 6)]
        [ValidateSet('Excel', 'HTML')]
        [string]$Export = 'Host',
        [Parameter(Mandatory = $false, Position = 7)]
        [ValidateScript( { (Test-Path $_) })]
        [string]$ReportPath = $env:temp
    )

    $SessionFailureCode = [PSCustomObject]@{
        0   = 'Unknown'
        1   = 'None'
        2   = 'SessionPreparation'
        3   = 'RegistrationTimeout'
        4   = 'ConnectionTimeout'
        5   = 'Licensing'
        6   = 'Ticketing'
        7   = 'Other'
        8   = 'GeneralFail'
        9   = 'MaintenanceMode'
        10  = 'ApplicationDisabled'
        11  = 'LicenseFeatureRefused'
        12  = 'NoDesktopAvailable'
        13  = 'SessionLimitReached'
        14  = 'DisallowedProtocol'
        15  = 'ResourceUnavailable'
        16  = 'ActiveSessionReconnectDisabled'
        17  = 'NoSessionToReconnect'
        18  = 'SpinUpFailed'
        19  = 'Refused'
        20  = 'ConfigurationSetFailure'
        21  = 'MaxTotalInstancesExceeded'
        22  = 'MaxPerUserInstancesExceeded'
        23  = 'CommunicationError'
        24  = 'MaxPerMachineInstancesExceeded'
        25  = 'MaxPerEntitlementInstancesExceeded'
        100 = 'NoMachineAvailable'
        101 = 'MachineNotFunctional'
    }
    $ConnectionFailureType = [PSCustomObject]@{
        0 = 'None'
        1 = 'ClientConnectionFailure'
        2 = 'MachineFailure'
        3 = 'NoCapacityAvailable'
        4 = 'NoLicensesAvailable'
        5 = 'Configuration'
    }
    $RegistrationState = [PSCustomObject]@{
        0 = 'Unknown'
        1 = 'Registered'
        2 = 'Unregistered'
    }

    $mondata = Get-CTXAPI_MonitorData -CustomerId $CustomerId -SiteId $siteid -ApiToken $apitoken -region $region -hours $hours

    $data = @()

    if ($FailureType -eq 'Machine') {
        $machines = Get-CTXAPI_machines -CustomerId $CustomerId -SiteId $SiteId -ApiToken $ApiToken
        foreach ($log in $mondata.MachineFailureLogs) {
            $MonDataMachine = $mondata.Machines | Where-Object { $_.id -eq $log.MachineId }
            $APIMachine = $machines | Where-Object { $_.dnsname -like $MonDataMachine.DnsName }
            $data += [PSCustomObject]@{
                Name                     = $MonDataMachine.DnsName
                IP                       = $MonDataMachine.IPAddress
                OSType                   = $MonDataMachine.OSType
                FailureStartDate         = $log.FailureStartDate
                FailureEndDate           = $log.FailureEndDate
                FaultState               = $log.FaultState
                LastDeregistrationReason = $APIMachine.LastDeregistrationReason
                LastConnectionFailure    = $APIMachine.LastConnectionFailure
                LastErrorReason          = $APIMachine.LastErrorReason
                CurrentFaultState        = $APIMachine.FaultState

            }

        }
    }
    if ($FailureType -eq 'Connection') {
        foreach ($log in $mondata.ConnectionFailureLogs) {
            $session = $mondata.Session | Where-Object { $_.SessionKey -eq $log.SessionKey }
            $user = $mondata.users | Where-Object { $_.id -like $Session.UserId }
            $mashine = $mondata.machines | Where-Object { $_.id -like $Session.MachineId }    
            $data += [PSCustomObject]@{
                UserName                   = $user.UserName
                FullName                   = $user.FullName
                DnsName                    = $mashine.DnsName
                IPAddress                  = $mashine.IPAddress
                CurrentRegistrationState   = $RegistrationState.($mashine.CurrentRegistrationState)
                FailureDate                = $log.FailureDate
                ConnectionFailureEnumValue    = $SessionFailureCode.($log.ConnectionFailureEnumValue)
            }
        }
    }



    if ($Export -eq 'Excel') { $data | Export-Excel -Path ($ReportPath + '\Failure_Audit-' + (Get-Date -Format yyyy.MM.dd-HH.mm) + '.xlsx') -AutoSize -AutoFilter -Show } 
    if ($Export -eq 'HTML') { $data | Out-GridHtml -DisablePaging -Title 'Citrix Failures' -HideFooter -SearchHighlight -FixedHeader }
    if ($Export -eq 'Host') { $data }

} #end Function