Public/Reporting/Initialize-CitrixUserCompare.ps1


<#PSScriptInfo
 
.VERSION 1.0.1
 
.GUID 310be7d5-f671-4eaa-8011-8552cdcfc75c
 
.AUTHOR Pierre Smit
 
.COMPANYNAME
 
.COPYRIGHT
 
.TAGS Citrix
 
.LICENSEURI
 
.PROJECTURI
 
.ICONURI
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
Created [07/06/2019_04:05]
Updated [09/06/2019_09:18]
 
.PRIVATEDATA
 
#>
 



<#
 
.DESCRIPTION
Reports on user details
 
#>
 

Param()
Function Compare-TwoADUsers {
    PARAM($Username1,$Username2)

$ValidUser1 = Get-ADUser $Username1  -Properties * | select Name,GivenName,Surname,UserPrincipalName, EmailAddress, EmployeeID, EmployeeNumber, HomeDirectory, Enabled, Created, Modified, LastLogonDate,samaccountname
$ValidUser2 = Get-ADUser $Username2  -Properties * | select Name,GivenName,Surname,UserPrincipalName, EmailAddress, EmployeeID, EmployeeNumber, HomeDirectory, Enabled, Created, Modified, LastLogonDate,samaccountname
$userDetailList1 = $ValidUser1.psobject.Properties | Select-Object -Property Name, Value
$userDetailList2 = $ValidUser2.psobject.Properties | Select-Object -Property Name, Value

$user1Headding = $ValidUser1.Name
$user2Headding = $ValidUser2.Name
$user1HeaddingMissing = $ValidUser1.Name + " Missing"
$user2HeaddingMissing = $ValidUser2.Name + " Missing"

$allusergroups1 = Get-ADUser $Username1 -Properties * | Select-Object -ExpandProperty memberof | ForEach-Object {Get-ADGroup $_} | select samaccountname
$allusergroups2 = Get-ADUser $Username2 -Properties * | Select-Object -ExpandProperty memberof | ForEach-Object {Get-ADGroup $_} | select samaccountname

$Compare = Compare-Object -ReferenceObject $allusergroups1 -DifferenceObject $allusergroups2 -Property samaccountname -IncludeEqual

$SameGroups = $Compare | where {$_.SideIndicator -eq '=='} | select samaccountname
$User1Missing = $Compare | where {$_.SideIndicator -eq '=>'} | select samaccountname
$User2Missing = $Compare | where {$_.SideIndicator -eq '<='} | select samaccountname


$User1Details = New-Object PSObject  -Property @{
        ValidUser1               = $ValidUser1
        userDetailList1          = $userDetailList1
        user1Headding            = $user1Headding
        user1HeaddingMissing     = $user1HeaddingMissing
        allusergroups1           = $allusergroups1
        User1Missing             = $User1Missing
        }
$User2Details = New-Object PSObject  -Property @{
        ValidUser2               = $ValidUser2
        userDetailList2          = $userDetailList2
        user2Headding            = $user2Headding
        user2HeaddingMissing     = $user2HeaddingMissing
        allusergroups2           = $allusergroups2
        User2Missing             = $User2Missing
        }

$Details = New-Object PSObject  -Property @{
User1Details = $User1Details
User2Details = $User2Details
SameGroups = $SameGroups
}
$Details

} #end Function

Function Initialize-CitrixUserReports {
    PARAM(
        [Parameter(Mandatory = $true, Position = 0)]
        [ValidateScript({(Test-Path $_) -and ((Get-Item $_).Extension -eq ".xml")})]
        [string]$XMLParameterFilePath,
        [ValidateNotNull()]
        [ValidateNotNullOrEmpty()]
        [string]$Username1,
        [ValidateNotNull()]
        [ValidateNotNullOrEmpty()]
        [string]$Username2)


Write-Verbose "$((get-date -Format HH:mm:ss).ToString()) [Proccessing] Importing Variables"

Write-Colour "Using these Variables"
[XML]$XMLParameter = Get-Content $XMLParameterFilePath
$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 }
    }

Set-Location $PSScriptRoot
if ((Test-Path -Path $ReportsFolder\XDUsers) -eq $false) { New-Item -Path "$ReportsFolder\XDUsers" -ItemType Directory -Force -ErrorAction SilentlyContinue }

[string]$Reportname = $ReportsFolder + "\XDUsers\XD_Users." + (Get-Date -Format yyyy.MM.dd-HH.mm) + ".html"

if ((Test-Path -Path $ReportsFolder\logs) -eq $false) { New-Item -Path "$ReportsFolder\logs" -ItemType Directory -Force -ErrorAction SilentlyContinue }
[string]$Transcriptlog ="$ReportsFolder\logs\XDUsers_TransmissionLogs." + (get-date -Format yyyy.MM.dd-HH.mm) + ".log"
Write-Verbose "$((get-date -Format HH:mm:ss).ToString()) [Starting] Data Collection"
Start-Transcript -Path $Transcriptlog -IncludeInvocationHeader -Force -NoClobber
$timer = [Diagnostics.Stopwatch]::StartNew();


########################################
## Getting Credentials
#########################################


$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
}
########################################
## Functions
#########################################

########################################
## Connect and get info
#########################################
$compareusers = Compare-TwoADUsers -Username1 $Username1 -Username2 $Username2 -Verbose


########################################
## Setting some table color and settings
########################################

$TableSettings = @{
    Style                  = 'cell-border'
    DisablePaging          = $true
    DisableOrdering        = $true
    DisableInfo            = $true
    DisableProcessing      = $true
    DisableResponsiveTable = $true
    DisableNewLine         = $true
    DisableSelect          = $true
    DisableSearch          = $true
    DisableColumnReorder   = $true
    OrderMulti             = $true
    DisableStateSave       = $true
    TextWhenNoData         = 'No Data to display here'
}
$SectionSettings = @{
    HeaderBackGroundColor = 'DarkGray'
    HeaderTextAlignment   = 'center'
    HeaderTextColor       = 'White'
    BackgroundColor       = 'LightGrey'
    CanCollapse           = $false
}

$TableSectionSettings = @{
    HeaderTextColor       = 'Black'
    HeaderTextAlignment   = 'center'
    HeaderBackGroundColor = 'LightSteelBlue'
    BackgroundColor       = 'WhiteSmoke'
}

#######################
## Building the report
#######################

$HeddingText = "Compared Users on: " + (Get-Date -Format dd) + " " + (Get-Date -Format MMMM) + "," + (Get-Date -Format yyyy) + " " + (Get-Date -Format HH:mm)
New-HTML -TitleText "XenDesktop Report"  -FilePath $Reportname {
    New-HTMLHeading -Heading h1 -HeadingText $HeddingText -Color Black
    New-HTMLSection -HeaderText 'User Details' @SectionSettings  -Content {
        New-HTMLSection -HeaderText $compareusers.User1Details.user1Headding @TableSectionSettings {New-HTMLTable @TableSettings -DataTable $compareusers.User1Details.userDetailList1 -HideFooter}
        New-HTMLSection -HeaderText $compareusers.User2Details.user2Headding @TableSectionSettings {New-HTMLTable @TableSettings -DataTable $compareusers.User2Details.userDetailList2 -HideFooter}
    }
    New-HTMLSection @SectionSettings -HeaderText 'Comparison of the User Groups'   -Content {
        New-HTMLSection -HeaderText $compareusers.User1Details.user1HeaddingMissing @TableSectionSettings {New-HTMLTable @TableSettings -DataTable $compareusers.User1Details.User1Missing -HideFooter}
        New-HTMLSection -HeaderText $compareusers.User1Details.user2HeaddingMissing @TableSectionSettings {New-HTMLTable @TableSettings -DataTable $compareusers.User2Details.User2Missing -HideFooter}
        New-HTMLSection -HeaderText 'Same Groups' @TableSectionSettings {New-HTMLTable @TableSettings -DataTable $compareusers.SameGroups -HideFooter}
    }
    New-HTMLSection @SectionSettings -HeaderText 'All User Groups'   -Content {
        New-HTMLSection -HeaderText $compareusers.User1Details.user1Headding @TableSectionSettings {New-HTMLTable @TableSettings -DataTable $compareusers.User1Details.allusergroups1  -HideFooter}
        New-HTMLSection -HeaderText  $compareusers.User2Details.user2Headding @TableSectionSettings {New-HTMLTable @TableSettings -DataTable $compareusers.User2Details.allusergroups2 -HideFooter}
    }
}

$timer.Stop()
$timer.Elapsed | select Days,Hours,Minutes,Seconds | fl
Stop-Transcript

} #end Function