Public/FarmDetails/Get-CitrixFarmDetail.ps1


<#PSScriptInfo
 
.VERSION 1.0.7
 
.GUID b59eb9d3-7d4d-4956-96cf-fb2ed5053e19
 
.AUTHOR Pierre Smit
 
.COMPANYNAME
 
.COPYRIGHT
 
.TAGS Citrix
 
.LICENSEURI
 
.PROJECTURI
 
.ICONURI
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
Created [05/05/2019_08:57]
Updated [13/05/2019_04:40]
Updated [22/05/2019_20:13]
Updated [24/05/2019_19:25]
Updated [06/06/2019_19:25]
Updated [09/06/2019_09:18]
Updated [15/06/2019_01:11]
Updated [15/06/2019_13:59] Updated Reports
 
.PRIVATEDATA
 
#>
 















<#
 
.DESCRIPTION
Xendesktop Farm Details
 
#>


Param()



Function Get-CitrixFarmDetail {
        [CmdletBinding()]
    PARAM(
        [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)]
        [ValidateNotNull()]
        [ValidateNotNullOrEmpty()]
        [string]$AdminServer,
        [Parameter(Mandatory = $false, Position = 1)]
        [switch]$RunAsPSRemote = $false,
        [Parameter(Mandatory = $false, Position = 2)]
        [ValidateNotNull()]
        [ValidateNotNullOrEmpty()]
        [PSCredential]$RemoteCredentials)



function CitrixFarmDetails {
        param($AdminServer, $VerbosePreference)

        Add-PSSnapin Citrix*

    function Get-CTXSiteDetail($AdminServer) {

    $site = Get-BrokerSite -AdminAddress $AdminServer
    $CustomCTXObject = New-Object PSObject -Property @{
    Summary   = $site | Select-Object Name, ConfigLastChangeTime, LicenseEdition, LicenseModel, LicenseServerName
            AllDetails = $site
        }

        $CustomCTXObject

 }

    function Get-CTXController($AdminServer) {
        $RegistedDesktops = @()
        $controllsers = Get-BrokerController -AdminAddress $AdminServer
        foreach ($server in $controllsers) {
            $CustomCTXObject = New-Object PSObject -Property @{
                Name                  = $server.dnsname
                'Desktops Registered' = $server.DesktopsRegistered
                'Last Activity Time'  = $server.LastActivityTime
                'Last Start Time'     = $server.LastStartTime
                State                 = $server.State
                ControllerVersion     = $server.ControllerVersion
            } | Select-Object Name, 'Desktops Registered', 'Last Activity Time', 'Last Start Time', State, ControllerVersion

        $RegistedDesktops += $CustomCTXObject
    }
    $CustomCTXObject = New-Object PSObject -Property @{
        Summary    = $RegistedDesktops
        AllDetails = $controllsers
    }

    $CustomCTXObject
}

function Get-CTXBrokerMachine($AdminServer) {
    $NonRemotepc = Get-BrokerDesktopGroup -AdminAddress $AdminServer | Where-Object { $_.IsRemotePC -eq $false } | ForEach-Object { Get-BrokerMachine -MaxRecordCount 10000 -AdminAddress $AdminBox -DesktopGroupName $_.name | Select-Object DNSName, CatalogName, DesktopGroupName, CatalogUid, AssociatedUserNames, DesktopGroupUid, DeliveryType, DesktopKind, DesktopUid, FaultState, IPAddress, IconUid, OSType, PublishedApplications, RegistrationState, WindowsConnectionSetting }
$UnRegServer = $NonRemotepc | Where-Object { $_.RegistrationState -like "unreg*" -and $_.DeliveryType -notlike "DesktopsOnly" } | Select-Object DNSName, CatalogName, DesktopGroupName, AssociatedUserNames, FaultState
$UnRegDesktop = $NonRemotepc | Where-Object { $_.RegistrationState -like "unreg*" -and $_.DeliveryType -like "DesktopsOnly" } | Select-Object DNSName, CatalogName, DesktopGroupName, AssociatedUserNames, FaultState
$CusObject = New-Object PSObject -Property @{
    AllMachines          = $NonRemotepc
    UnRegisteredServers  = $UnRegServer
    UnRegisteredDesktops = $UnRegDesktop
} | Select-Object AllMachines, UnRegisteredServers, UnRegisteredDesktops
$CusObject
}

function Get-CTXSession($AdminServer) { Get-BrokerSession -MaxRecordCount 10000 -AdminAddress $AdminServer }

function Get-CTXBrokerDesktopGroup($AdminServer) {
    $DG = Get-BrokerDesktopGroup -AdminAddress $AdminServer
    $ReadAbleDG = @()
    foreach ($item in $DG) {
        $CusObject = New-Object PSObject -Property @{
            Name                   = $item.name
            DeliveryType           = $item.DeliveryType
            DesktopKind            = $item.DesktopKind
            IsRemotePC             = $item.IsRemotePC
            Enabled                = $item.Enabled
            TotalDesktops          = $item.TotalDesktops
            DesktopsAvailable      = $item.DesktopsAvailable
            DesktopsInUse          = $item.DesktopsInUse
            DesktopsUnregistered   = $item.DesktopsUnregistered
            InMaintenanceMode      = $item.InMaintenanceMode
            Sessions               = $item.Sessions
            SessionSupport         = $item.SessionSupport
            TotalApplicationGroups = $item.TotalApplicationGroups
            TotalApplications      = $item.TotalApplications
        } | Select-Object Name, DeliveryType, DesktopKind, IsRemotePC, Enabled, TotalDesktops, DesktopsAvailable, DesktopsInUse, DesktopsUnregistered, InMaintenanceMode, Sessions, SessionSupport, TotalApplicationGroups, TotalApplications
    $ReadAbleDG += $CusObject
    }
$ReadAbleDG
}

function Get-CTXADObject($AdminServer) {
 $tainted = $adobjects = $CusObject = $null
 $adobjects = Get-AcctADAccount -MaxRecordCount 10000 -AdminAddress $AdminServer
 $tainted = $adobjects | Where-Object { $_.state -like "tainted*" }
$CusObject = New-Object PSObject -Property @{
    AllObjects     = $adobjects
    TaintedObjects = $tainted
} | Select-Object AllObjects, TaintedObjects
$CusObject
}

function Get-CTXDBConnection($AdminServer) {
    $dbArray = @()

    $dbconnection = (Test-BrokerDBConnection -DBConnection(Get-BrokerDBConnection -AdminAddress $AdminBox))

    if ([bool]($dbconnection.ExtraInfo.'Database.Status') -eq $False) { [string]$dbstatus = "Unavalable" }
    else { [string]$dbstatus = $dbconnection.ExtraInfo.'Database.Status' }

    $CCTXObject = New-Object PSObject -Property @{
        "Service Status"       = $dbconnection.ServiceStatus.ToString()
        "DB Connection Status" = $dbstatus
        "Is Mirroring Enabled" = $dbconnection.ExtraInfo.'Database.IsMirroringEnabled'.ToString()
        "DB Last Backup Date"  = $dbconnection.ExtraInfo.'Database.LastBackupDate'.ToString()
    } | Select-Object  "Service Status", "DB Connection Status", "Is Mirroring Enabled", "DB Last Backup Date"
$dbArray = $CCTXObject.psobject.Properties | Select-Object -Property Name, Value
$dbArray
}

Write-Verbose "$((Get-Date -Format HH:mm:ss).ToString()) [Processing] Site Details"
$SiteDetails = Get-CTXSiteDetail -AdminServer $AdminServer
Write-Verbose "$((Get-Date -Format HH:mm:ss).ToString()) [Processing] Controllers Details"
$Controllers = Get-CTXController -AdminServer $AdminServer
Write-Verbose "$((Get-Date -Format HH:mm:ss).ToString()) [Processing] Machines Details"
$Machines = Get-CTXBrokerMachine -AdminServer $AdminServer
Write-Verbose "$((get-date -Format HH:mm:ss).ToString()) [Processing] DeliveryGroups Details"
$DeliveryGroups = Get-CTXBrokerDesktopGroup -AdminAddress $AdminServer
Write-Verbose "$((Get-Date -Format HH:mm:ss).ToString()) [Processing] Sessions Details"
$Sessions = Get-CTXSession -AdminServer $AdminServer
Write-Verbose "$((Get-Date -Format HH:mm:ss).ToString()) [Processing] ADObjects Details"
$ADObjects = Get-CTXADObject -AdminServer $AdminServer
Write-Verbose "$((Get-Date -Format HH:mm:ss).ToString()) [Processing] DBConnection Details"
$DBConnection = Get-CTXDBConnection -AdminServer $AdminServer
Write-Verbose "$((Get-Date -Format HH:mm:ss).ToString()) [Processing] Session Counts Details"
$SessionCounts = New-Object PSObject -Property @{
    'Active Sessions'      = ($Sessions | Where-Object -Property Sessionstate -EQ "Active").count
   'Disconnected Sessions' = ($Sessions | Where-Object -Property Sessionstate -EQ "Disconnected").count
   'Unregistered Servers'  = ($Machines.UnRegisteredServers | Measure-Object).count
   'Unregistered Desktops' = ($Machines.UnRegisteredDesktops | Measure-Object).count
   'Tainted Objects'       = ($ADObjects.TaintedObjects | Measure-Object).Count
} | Select-Object 'Active Sessions', 'Disconnected Sessions', 'Unregistered Servers', 'Unregistered Desktops', 'Tainted Objects'

$CustomCTXObject = New-Object PSObject -Property @{
    DateCollected    = (Get-Date -Format dd-MM-yyyy_HH:mm).ToString()
    SiteDetails      = $SiteDetails
    Controllers      = $Controllers
    Machines         = $Machines
    Sessions         = $Sessions
    ADObjects        = $ADObjects
    DeliveryGroups   = $DeliveryGroups
    DBConnection     = $DBConnection
    SessionCounts    = $SessionCounts
} | Select-Object DateCollected, SiteDetails, Controllers, Machines, Sessions, ADObjects,DeliveryGroups, DBConnection, SessionCounts


$CustomCTXObject

}

$FarmDetails = @()
if ($RunAsPSRemote -eq $true) { $FarmDetails = Invoke-Command -ComputerName $AdminServer -ScriptBlock ${Function:CitrixFarmDetails} -ArgumentList  @($AdminServer, $RemoteCredentials, $VerbosePreference) -Credential $RemoteCredentials }
else { $FarmDetails = CitrixFarmDetails -AdminAddress $AdminServer -VerbosePreference $VerbosePreference }
Write-Verbose "$((Get-Date -Format HH:mm:ss).ToString()) [End] All Details"
$FarmDetails | Select-Object DateCollected, SiteDetails, Controllers, Machines, Sessions, ADObjects,DeliveryGroups, DBConnection, SessionCounts

} #end Function