Private/Start-XDUDashboard.ps1


<#PSScriptInfo
 
.VERSION 1.0.2
 
.GUID 144e3fd9-5999-4364-bdd6-99e1a6451adf
 
.AUTHOR Pierre Smit
 
.COMPANYNAME
 
.COPYRIGHT
 
.TAGS Powershell
 
.LICENSEURI
 
.PROJECTURI
 
.ICONURI
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
Created [06/06/2019_04:01]
Updated [06/06/2019_19:25]
Updated [09/06/2019_09:18]
 
.PRIVATEDATA
 
#>
 





<#
 
.DESCRIPTION
Universal Dashboard
 
#>
 

Param()
Set-Location $PSScriptRoot

[XML]$XMLParameter = Get-Content $env:PSParameters
$XMLParameter.Settings.Variables.Variable | ft
Write-Verbose "$((Get-Date -Format HH:mm:ss).ToString()) [Starting] Variable Details"

$XMLParameter.Settings.Variables.Variable | foreach {
    # Set Variables contained in XML file
    $VarValue = $_.Value
    $CreateVariable = $True # Default value to create XML content as Variable
    switch ($_.Type) {
        # Format data types for each variable
        '[string]' { $VarValue = [string]$VarValue } # Fixed-length string of Unicode characters
        '[char]' { $VarValue = [char]$VarValue } # A Unicode 16-bit character
        '[byte]' { $VarValue = [byte]$VarValue } # An 8-bit unsigned character
        '[bool]' { If ($VarValue.ToLower() -eq 'false') { $VarValue = [bool]$False } ElseIf ($VarValue.ToLower() -eq 'true') { $VarValue = [bool]$True } } # An boolean True/False value
        '[int]' { $VarValue = [int]$VarValue } # 32-bit signed integer
        '[long]' { $VarValue = [long]$VarValue } # 64-bit signed integer
        '[decimal]' { $VarValue = [decimal]$VarValue } # A 128-bit decimal value
        '[single]' { $VarValue = [single]$VarValue } # Single-precision 32-bit floating point number
        '[double]' { $VarValue = [double]$VarValue } # Double-precision 64-bit floating point number
        '[DateTime]' { $VarValue = [DateTime]$VarValue } # Date and Time
        '[Array]' { $VarValue = [Array]$VarValue.Split(',') } # Array
        '[Command]' { $VarValue = Invoke-Expression $VarValue; $CreateVariable = $False } # Command
    }
    If ($CreateVariable) { New-Variable -Name $_.Name -Value $VarValue -Scope $_.Scope -Force }
}

$CTXAdmin = Find-Credential | where target -Like "*Healthcheck" | Get-Credential -Store
if ($CTXAdmin -eq $null) {
    $AdminAccount = BetterCredentials\Get-Credential -Message "Admin Account: DOMAIN\Username for CTX HealthChecks"
    Set-Credential -Credential $AdminAccount -Target "Healthcheck" -Persistence LocalComputer -Description "Account used for ctx health checks" -Verbose
}

########################################
## build pages
#########################################

$CTXFunctions = New-UDEndpointInitialization -Module @("CTXHealthCheck", "PoshRSJob") -Variable @("ReportsFolder", "ParametersFolder", "CTXAdmin", "PSParameters") -Function @("Get-FullUserDetail", "Initialize-CitrixAudit", "Initialize-CitrixHealthCheck")
$Theme = Get-UDTheme -Name Default 

#region Page1
$CTXHomePage = New-UDPage -Name "Health Check" -Icon home -DefaultHomePage -Content {
    New-UDButton -Text "Refresh" -Icon cloud -IconAlignment left -onClick {                 
        $job = Start-RSJob -ScriptBlock { Initialize-CitrixHealthCheck -XMLParameterFilePath  $args[0] -Verbose } -ArgumentList @($env:PSParameters)
        do {
            Show-UDModal -Content { New-UDHeading -Text "Refreshing your data"  -Color 'white'} -Persistent -BackgroundColor green
            Start-Sleep -Seconds 10
            Hide-UDModal           
}   until( $job.State -notlike 'Running')
    $TodayReport = Get-Item ((Get-ChildItem $ReportsFolder\XDHealth\*.html | Sort-Object -Property LastWriteTime -Descending)[0]) | select *
    Sync-UDElement -Id 'Healcheck1'
} # onclick
New-UDCollapsible -Items {
    New-UDCollapsibleItem -Title 'Latest Health Check Report'-Content {
    New-UDCard -Id 'Healcheck1' -Endpoint {
    param ($TodayReport)
    $TodayReport = Get-Item ((Get-ChildItem $ReportsFolder\XDHealth\*.html | Sort-Object -Property LastWriteTime -Descending)[0]) | select *
    New-UDHtml ([string](Get-Content $TodayReport.FullName))
    }
} -Active
}
}
#endregion

#region Page2
$CTXAuditPage = New-UDPage -Name "Audit Results" -Icon bomb -Content {
    New-UDButton -Text "Refresh" -Icon cloud -IconAlignment left -onClick {                 
        $job = Start-RSJob -ScriptBlock { Initialize-CitrixAudit -XMLParameterFilePath  $args[0] -Verbose } -ArgumentList @($env:PSParameters)
        do {
            Show-UDModal -Content { New-UDHeading -Text "Refreshing your data"  -Color 'white'} -Persistent -BackgroundColor green
            Start-Sleep -Seconds 10
            Hide-UDModal           
}   until( $job.State -notlike 'Running')
    $AuditReport = Get-Item ((Get-ChildItem $ReportsFolder\XDAudit\*.html | Sort-Object -Property LastWriteTime -Descending)[0]) | select *
    Sync-UDElement -Id 'Audit1'
} # onclick
New-UDCollapsible -Items {
    New-UDCollapsibleItem -Title 'Latest Health Check Report'-Content {
    New-UDCard -Id 'Audit1' -Endpoint {
    param ($AuditReport)
    $AuditReport = Get-Item ((Get-ChildItem $ReportsFolder\XDAudit\*.html | Sort-Object -Property LastWriteTime -Descending)[0]) | select *
    New-UDHtml ([string](Get-Content $AuditReport.FullName))
}
}
}
}
#endregion

#region Page 3
$UserPage1 = New-UDPage -Name "User Details" -Icon user -Content {
    New-UDCollapsible -Items {
        New-UDCollapsibleItem  -Endpoint {
            New-UDInput -Title "Username" -Endpoint {
                param(
                    [Parameter(Mandatory)]
                    [UniversalDashboard.ValidationErrorMessage("Invalid user")]
                    [ValidateScript( { Get-ADUser -Identity $_ })]
                    [string]$Username)

                New-UDInputAction -Content @(
        $validuser = Get-FullUserDetail -UserToQuery $username -DomainFQDN htpcza.com -DomainCredentials $CTXAdmin
        $UserDetail = ConvertTo-FormatListView -Data $validuser.UserSummery

        New-UDCard -Text (Get-Date -DisplayHint DateTime).ToString()-TextSize Medium -TextAlignment center
        New-UDLayout -Columns 2 -Content {
            New-UDGrid -Id 'UserGrid1'  -Headers @("Name", "Value") -Properties @("Name", "Value") -NoPaging -Endpoint { $UserDetail | Out-UDGridData }
                    New-UDGrid -Id 'UserGrid2' -Headers @("SamAccountName", "GroupScope") -Properties @("SamAccountName", "GroupScope") -NoPaging -Endpoint { $validuser.AllUserGroups | select SamAccountName, GroupScope | Out-UDGridData }
            }

        )
    }
} -Title "Single user Details" -FontColor black

New-UDCollapsibleItem -Endpoint {
    New-UDInput -Title "Compare Users" -Content {
        New-UDInputField -Name 'Username1' -Type textbox -Placeholder 'Username1'
        New-UDInputField -Name 'Username2' -Type textbox -Placeholder 'Username2'
    } -Endpoint {
        param(
            [Parameter(Mandatory)]
            [UniversalDashboard.ValidationErrorMessage("Invalid user")]
            [ValidateScript( { Get-ADUser -Identity $_ })]
            [string]$Username1,
            [Parameter(Mandatory)]
            [UniversalDashboard.ValidationErrorMessage("Invalid user")]
            [ValidateScript( { Get-ADUser -Identity $_ })]
            [string]$Username2)


            
        New-UDInputAction -Toast $Username1
        New-UDInputAction -Toast $Username2

        $compareUsers = Compare-TwoADUsers -Username1 $Username1 -Username2 $Username2 -Verbose

        New-UDInputAction -Content  @(
            New-UDCard -Text (Get-Date -DisplayHint DateTime).ToString()-TextSize Medium -TextAlignment center
            New-UDLayout -Columns 2 -Content {
                New-UDGrid -Title $compareusers.User1Details.user1Headding -Endpoint { $compareusers.User1Details.userDetailList1 | Out-UDGridData }
            New-UDGrid -Title $compareusers.User2Details.user2Headding -Endpoint { $compareusers.User2Details.userDetailList2 | Out-UDGridData }
    }
    New-UDLayout -Columns 3 -Content {
        New-UDGrid -Title $compareusers.User1Details.user1HeaddingMissing -Endpoint { $compareusers.User1Details.User1Missing | Out-UDGridData }
    New-UDGrid -Title $compareusers.User2Details.user2HeaddingMissing -Endpoint { $compareusers.User2Details.User2Missing | Out-UDGridData }
New-UDGrid -Title 'Same Groups' -Endpoint { $compareusers.SameGroups | Out-UDGridData }
}
New-UDLayout -Columns 2 -Content {
    New-UDGrid -Title $compareusers.User1Details.user1Headding -Endpoint { $compareusers.User1Details.allusergroups1 | Out-UDGridData }
New-UDGrid -Title $compareusers.User2Details.user2Headding -Endpoint { $compareusers.User2Details.allusergroups2 | Out-UDGridData }
}
)


}
        
} -Title "Compare Two Users" -FontColor black

New-UDCollapsibleItem  -Endpoint {
    New-UDInput -Title "Username" -Endpoint {
        param(
            [Parameter(Mandatory)]
            [UniversalDashboard.ValidationErrorMessage("Invalid user")]
            [ValidateScript( { Get-ADUser -Identity $_ })]
            [string]$Username)

        New-UDInputAction -Content @(
            $UserDetail = Get-CitrixUserAccessDetails -Username $Username -AdminServer $CTXDDC -Verbose
            $userDetailList = $UserDetail.UserDetail.psobject.Properties | Select-Object -Property Name, Value
        $DesktopsCombined = $UserDetail.DirectPublishedDesktops + $UserDetail.PublishedDesktops | sort -Property DesktopGroupName -Unique
    New-UDCard -Text (Get-Date -DisplayHint DateTime).ToString()-TextSize Medium -TextAlignment center
    New-UDLayout -Columns 4 -Content {
        New-UDGrid -Title 'User details' -Endpoint { $userDetailList | Out-UDGridData }
    New-UDGrid -Title 'Current Applications' -Endpoint { ($UserDetail.AccessPublishedApps | select PublishedName, Description, enabled) | Out-UDGridData }
New-UDGrid -Title 'Current Desktops' -Endpoint { $DesktopsCombined | Out-UDGridData }
New-UDGrid -Title 'Available Applications' -Endpoint { ($UserDetail.NoAccessPublishedApps | select PublishedName, Description, enabled) | Out-UDGridData }
}
)




}
}      -Title "Check User Access In Citrix" -FontColor black
}
}
#endregion

########################################
## Build dashboard
#########################################

Get-UDDashboard | Stop-UDDashboard

$Dashboard = New-UDDashboard -Title "XenDektop Universal Dashboard" -Pages @($CTXHomePage,$CTXAuditPage, $UserPage1) -EndpointInitialization $CTXFunctions -Theme $Theme

Start-UDDashboard -Dashboard $Dashboard -Port 10007
Start-Process http://localhost:10007