Public/Setup/Install-XDHealthCheckParameter.ps1


<#PSScriptInfo
 
.VERSION 1.0.0
 
.GUID ea771bac-90e2-4db5-b5f9-06fb61b98ba2
 
.AUTHOR Pierre Smit
 
.COMPANYNAME
 
.COPYRIGHT
 
.TAGS Powershell
 
.LICENSEURI
 
.PROJECTURI
 
.ICONURI
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
Created [15/06/2019_14:19] Initital Script Creating
 
.PRIVATEDATA
 
#>


<#
 
.DESCRIPTION
 Setup script for XDHealthCheck Module
 
#>
 

Param()



function Install-XDHealthCheckParameter {

    Write-Host 'Installing needed Modules' -ForegroundColor Cyan
    if ((Get-PSRepository -Name PSGallery).InstallationPolicy -notlike 'Trusted') { Set-PSRepository -Name PSGallery -InstallationPolicy Trusted }
    if ([bool](Get-Module -Name PSWriteColor) -eq $false) { Install-Module -Name PSWriteColor -RequiredVersion 0.85 -Repository PSGallery -AllowClobber -SkipPublisherCheck }

    Write-Color -Text 'Installing BetterCredentials Module' -Color DarkCyan -ShowTime
    if ([bool](Get-Module -Name BetterCredentials) -eq $false) { Install-Module -Name BetterCredentials -RequiredVersion 4.5 -Repository PSGallery -AllowClobber -SkipPublisherCheck }

    Write-Color -Text 'Installing ImportExcel Module' -Color DarkCyan -ShowTime
    if ([bool](Get-Module -Name ImportExcel) -eq $false) { Install-Module -Name ImportExcel -RequiredVersion 6.0.0 -Repository PSGallery -AllowClobber -SkipPublisherCheck }

    Write-Color -Text 'Installing PSWriteHTML Module' -Color DarkCyan -ShowTime
    if ([bool](Get-Module -Name PSWriteHTML) -eq $false) { Install-Module -Name PSWriteHTML -RequiredVersion 0.0.32 -Repository PSGallery -AllowClobber -SkipPublisherCheck }

    Import-Module PSWriteColor
    Import-Module BetterCredentials

    function Set-Parameter {
        [string]$setupemail = Read-Host -Prompt 'Would you like to setup SMTP Emails (y/n)'

        if ($setupemail[0] -like 'y') {
            [xml]$TempParm = Get-Content  $PSScriptRoot\Parameters-Template.xml
            $null = Find-Credential | Where-Object target -Like "*Healthcheck_smtp" | Remove-Credential
            $smtpClientCredentials = BetterCredentials\Get-Credential -Message "smtp login for HealthChecks email"
            Set-Credential -Credential $smtpClientCredentials -Target "Healthcheck_smtp" -Persistence LocalComputer -Description "Account used for XD health checks" -Verbose
        } else { [xml]$TempParm = Get-Content  $PSScriptRoot\Parameters-TemplateNoEmail.xml }

        Write-Color -Text 'Setting up credentials' -Color DarkCyan -ShowTime
        $XDAdmin = Find-Credential | Where-Object target -Like "*Healthcheck" | Get-Credential -Store
        if ($XDAdmin -eq $null) {
            $AdminAccount = BetterCredentials\Get-Credential -Message "Admin Account: DOMAIN\Username for XD HealthChecks"
            Set-Credential -Credential $AdminAccount -Target "Healthcheck" -Persistence LocalComputer -Description "Account used for XD health checks" -Verbose
        }

        Write-Color -Text 'Setting up Parameters.xml' -Color DarkCyan -ShowTime

        $TempParm.settings.Variables.Variable | ForEach-Object {
            [string]$getnew = Read-Host $_.#comment'
            $_.value = $getnew
        }

        $ParametersFolder = $TempParm.settings.Variables.Variable[5].Value.ToString()
        $PSParameters = $ParametersFolder + "\Parameters.xml"
        $xmlfile = New-Item -Path $ParametersFolder  -Name Parameters.xml -ItemType File -Force -Verbose
        $TempParm.Save($xmlfile.FullName)

        [System.Environment]::SetEnvironmentVariable('PSParameters', $PSParameters, [System.EnvironmentVariableTarget]::User)

        Write-Color -Text '_________________________________________' -Color Green
        Write-Color -Text 'Setup Complete' -Color green -ShowTime
    }
    function Test-Parameter {

        if ($PSParameters -eq $null) {
            $xmlpath = Read-Host 'Full Path to Parameters.xml file'
            if ((Get-Item $xmlpath).Extension -eq 'xml') { [xml]$Parameters = Get-Content $xmlpath }
            else { Write-Host 'Invalid xml file'; break }
        }


        Write-Color -Text 'Checking Credentials' -Color DarkCyan -ShowTime
        ########################################
        ## Getting Credentials
        #########################################

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


        ########################################
        ## Build other variables
        #########################################

        $Parameters.Settings.Variables.Variable | Format-Table
        Write-Verbose "$((Get-Date -Format HH:mm:ss).ToString()) [Starting] Variable Details"

        $Parameters.Settings.Variables.Variable | ForEach-Object {
            # 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 }
        }


        Write-Color -Text 'Checking PS Remoting to servers' -Color DarkCyan -ShowTime

        $DDC = Invoke-Command -ComputerName $XDDDC.ToString() -Credential $XDAdmin -ScriptBlock { [System.Net.Dns]::GetHostByName(($env:COMPUTERNAME)).Hostname }
        $StoreFront = Invoke-Command -ComputerName $XDStoreFront -Credential $XDAdmin -ScriptBlock { [System.Net.Dns]::GetHostByName(($env:COMPUTERNAME)).Hostname }
        $LicensServer = Invoke-Command -ComputerName $RDSLicensServer -Credential $XDAdmin -ScriptBlock { [System.Net.Dns]::GetHostByName(($env:COMPUTERNAME)).Hostname }

        if ($DDC -like '') { Write-Error '$XDDDC is not valid' }
        else { Write-Color -Text "$DDC is valid" -Color green -ShowTime }
        if ($StoreFront -like '') { Write-Error '$XDStoreFront is not valid' }
        else { Write-Color -Text "$StoreFront is valid" -Color green -ShowTime }
        if ($LicensServer -like '') { Write-Error '$RDSLicensServer is not valid' }
        else { Write-Color -Text "$LicensServer is valid" -Color green -ShowTime }

        if ($SendEmail) {
            Write-Color -Text 'Checking Sending Emails' -Color DarkCyan -ShowTime

            $smtpClientCredentials = Find-Credential | Where-Object target -Like "*Healthcheck_smtp" | Get-Credential -Store
            if ($smtpClientCredentials -eq $null) {
                $Account = BetterCredentials\Get-Credential -Message "smtp login for HealthChecks email"
                Set-Credential -Credential $Account -Target "Healthcheck_smtp" -Persistence LocalComputer -Description "Account used for XD health checks" -Verbose
            }


            $emailMessage = New-Object System.Net.Mail.MailMessage
            $emailMessage.From = $emailFrom
            $emailMessage.To.Add($emailTo)
            $emailMessage.Subject = "Test Healthcheck Email"
            $emailMessage.IsBodyHtml = $true
            $emailMessage.Body = "Test Healthcheck Email"


            $smtpClient = New-Object System.Net.Mail.SmtpClient( $smtpServer , $smtpServerPort )
            $smtpClient.Credentials = [Net.NetworkCredential]$smtpClientCredentials
            $smtpClient.EnableSsl = $smtpEnableSSL
            $smtpClient.Timeout = 30000000


            $smtpClient.Send( $emailMessage )

        }
        Write-Color -Text '_________________________________________' -Color Green
        Write-Color -Text 'Tests Complete' -Color green -ShowTime
    }

    #region
    Clear-Host
    Write-Color -Text 'Make a selection from below' -Color DarkGray
    Write-Color -Text '___________________________' -Color DarkGray -LinesAfter 1
    do {
        Write-Color "1: ", "Set Healthcheck Script Parameters"  -Color Yellow, Green
        Write-Color "2: ", "Test HealthCheck Script Parameters"  -Color Yellow, Green
        Write-Color "3: ", "Run the first HealthCheck"  -Color Yellow, Green
        Write-Color "Q: ", "Press 'Q' to quit."  -Color Yellow, DarkGray -LinesAfter 1

        $selection = Read-Host "Please make a selection"
        switch ($selection) {
            '1' { Set-Parameter }
            '2' { Test-Parameter }
            '3' { Initialize-CitrixHealthCheck -XMLParameterFilePath $PSParameters -Verbose }

        }
    }
    until ($selection.ToLower() -eq 'q')
}