<# KISPoolChecker.ps1 - Horizon Pool Monitoring Script Version: 1.5 Written by: Charlie Silverman Purpose: Detects Horizon pools that have provisioning disabled and sends e-mail to recipients. Command Line Options: -credential - Configure and store Horizon server credentials. This will only store the credentials under the current logged in user. -test - Output results to the screen and do not send e-mail. -help - Display command help. #> $ScriptName = "KISPoolChecker.ps1" $ScriptVersion = "1.5.1" $test = $false $debug = $false $now = Get-Date $mypath = Split-Path $MyInvocation.MyCommand.Path -Parent $configFile = $mypath + "\KISPoolChecker.cfg" $logFile = $mypath + "\KISPoolChecker.log" # Process command line parameters for ( $i = 0; $i -lt $args.count; $i++ ) { Switch ($args[$i]) { "-credential" { $credential = Get-Credential $credential | Export-Clixml -path $env:USERPROFILE\User-Horizon.cred Out-File -FilePath $logFile -Encoding ASCII -Append -InputObject "Credential entry stored`r`n`r`n" exit } "-smtpcredential" { $credential = Get-Credential $credential | Export-Clixml -path $env:USERPROFILE\User-SMTP.cred Out-File -FilePath $logFile -Encoding ASCII -Append -InputObject "Credential entry stored`r`n`r`n" exit } "-test" { $test = $true Out-File -FilePath $logFile -Encoding ASCII -Append -InputObject "Test flag set" } "-debug" { $debug = $true Out-File -FilePath $logFile -Encoding ASCII -Append -InputObject "Debug flag set" } "-help" { Write-Host Write-Host Write-Host "**********************************************************" -ForegroundColor Yellow Write-Host "** **" -ForegroundColor Yellow Write-Host "** KISPoolChecker.ps1 - Horizon Pool Monitoring Script **" -Foregroundcolor Yellow Write-Host "** Version: $ScriptVersion **" -Foregroundcolor Yellow Write-Host "** Written by: Charlie Silverman **" -Foregroundcolor Yellow Write-Host "** **" -ForegroundColor Yellow Write-Host "**********************************************************" -ForegroundColor Yellow Write-Host Write-Host "Purpose: Detects Horizon pools that have provisioning disabled and sends e-mail to recipients." Write-Host "Command Line Options:" Write-Host Write-Host " -credential - Configure and store Horizon server credentials. This will only store the credentials under" Write-Host " the current logged in user." Write-Host " -smtpcredential - (Optional) Configure and store SMTP server credentials. This will only store the credentials" Write-Host " under the current logged in user." Write-Host " -test - Output results to the screen and do not send e-mail." Write-Host " -help - Display command help." Write-Host Write-Host Out-File -FilePath $logFile -Encoding ASCII -Append -InputObject "Help info requested" exit } } } # Read configuration file try { $inifile = Get-Content($configFile) -ErrorAction Stop | ConvertFrom-StringData -ErrorAction SilentlyContinue } Catch { Write-Host "Error reading from $configFile configuration file." -Backgroundcolor Red -ForegroundColor Yellow Out-File -FilePath $logFile -Encoding ASCII -Append -InputObject "ERROR: Unable to read config file $configFile`r`n`r`n" exit } $orgName = $inifile.OrganizationName $hzServer = $inifile.HorizonServer $mailServer = $inifile.SMTPServer $mailFrom = $inifile.SMTPFromconnec.B $mailTo = $inifile.SMTPTo $mailSSL = $false $mailPort = 25 if (Test-Path Variable:\$inifile.SMTPSSL) { if ($inifile.SMTPSSL.ToLower() -eq "true") { $mailSSL = $true } if ($inifile.SMTPPort -ne $null) { $mailPort = $inifile.SMTPPort } } $logFile = $mypath + "\KISPoolChecker.log" # Reformat email recipient list $mtlist = $mailTo -split "," $mailRecipients = @() for ( $i = 0; $i -lt $mtlist.count; $i++ ) { $mailRecipients += $mtlist[$i].Trim(); } Out-File -FilePath $logFile -Encoding ASCII -Append -InputObject "*** Script initiated $now" # Load Credentials $credential = import-clixml -path $env:USERPROFILE\User-Horizon.cred try { $mailCredential = import-clixml -path $env:USERPROFILE\User-SMTP.cred -ErrorAction Stop } catch { $mailCredential = $null } # Log into Horizon try { $horizon = Connect-HVServer -server $hzServer -Credential $credential If ($debug) { Write-Host "Connected to Horizon Server $hzServer" } Out-File -FilePath $logFile -Encoding ASCII -Append -InputObject "Connected to Horizon Server $hzServer" } catch { Write-Host "ERROR: Failed to connect to Horizon Server $hzServer" -Backgroundcolor Red -ForegroundColor Yellow If ($debug) { Write-Host "Connected to Horizon Server $hzServer" } Out-File -FilePath $logFile -Encoding ASCII -Append -InputObject "ERROR: Failed to connect to Horizon Server $hzServer`r`n`r`n" } $Services1 = $Global:DefaultHVServers.ExtensionData # Get Horizon pool list $pools = Get-HVPool $results = "" If ($debug) { Write-Host "Inspecting pools" } Out-File -FilePath $logFile -Encoding ASCII -Append -InputObject "Inspecting pools" # Check each pool for enabled, automated pools with provisioning disabled foreach ($pool in $pools) { $poolName = $pool.Base.Name $poolType = $pool.Type $poolEnabled = $pool.DesktopSettings.Enabled $provisioningEnabled = $pool.AutomatedDesktopData.VirtualCenterProvisioningSettings.EnableProvisioning $poolError = $pool.AutomatedDesktopData.ProvisioningStatusData.LastProvisioningError $poolErrorTime = $pool.AutomatedDesktopData.ProvisioningStatusData.LastProvisioningErrorTime if (($poolType -eq "AUTOMATED") -and !$provisioningEnabled -and $poolEnabled) { $results = $results + "Pool " + $poolName + " has provisioning disabled.`r`n" $results = $results + "-- Last error: " + $poolError + "`r`n" $results = $results + "-- Error Time: " + $poolErrortime + "`r`n" If ($debug) { Write-Host "Found pool $poolName with provisioning disabled" Write-Host "-- Last error: " + $poolError Write-Host "-- Error Time: " + $poolErrortime } Out-File -FilePath $logFile -Encoding ASCII -Append -InputObject "Found pool $poolName with provisioning disabled" Out-File -FilePath $logFile -Encoding ASCII -Append -InputObject "-- Last error: $poolError" Out-File -FilePath $logFile -Encoding ASCII -Append -InputObject "-- Error Time: $poolErrortime" } } # Output test results or send e-mail if ($test) { if ($results -ne "") { Write-Host Results: Write-Host $results } else { Write-Host No pools found with provisioning disabled. } } else { if ($results -ne "") { try { $smtpCred = "" $smtpSSL = "" If ($mailCredential -ne $null) { $smtpCred = " -credential $mailCredential" } if ($mailSSL -eq $true) { $smtpSSL = " -UseSsl" } $results = $orgName + "KIS Pool Checker v" + $ScriptVersion + "`r`n`r`n" + $results $results = $results + "`r`n`r`n" + $now if ($debug) { If ($mailCredential -ne $null) { if ($mailSSL -eq $true) { Write-Host Send-MailMessage -SmtpServer $mailServer -UseSSL -Port $mailPort -credential $mailCredential -From $mailFrom -To $mailRecipients -subject "$orgName KIS Pool Checker - Pool Provisioing Disabled" -body $results -ErrorAction Stop } else { Write-Host Send-MailMessage -SmtpServer $mailServer -Port $mailPort -credential $mailCredential -From $mailFrom -To $mailRecipients -subject "$orgName KIS Pool Checker - Pool Provisioing Disabled" -body $results -ErrorAction Stop } } else { if ($mailSSL -eq $true) { Write-Host Send-MailMessage -SmtpServer $mailServer -UseSSL -Port $mailPort -From $mailFrom -To $mailRecipients -subject "$orgName KIS Pool Checker - Pool Provisioing Disabled" -body $results -ErrorAction Stop } else { Write-Host Send-MailMessage -SmtpServer $mailServer -Port $mailPort -From $mailFrom -To $mailRecipients -subject "$orgName KIS Pool Checker - Pool Provisioing Disabled" -body $results -ErrorAction Stop } } } If ($mailCredential -ne $null) { if ($mailSSL -eq $true) { Send-MailMessage -SmtpServer $mailServer -UseSSL -Port $mailPort -credential $mailCredential -From $mailFrom -To $mailRecipients -subject "$orgName KIS Pool Checker - Pool Provisioing Disabled" -body $results -ErrorAction Stop } else { Send-MailMessage -SmtpServer $mailServer -Port $mailPort -credential $mailCredential -From $mailFrom -To $mailRecipients -subject "$orgName KIS Pool Checker - Pool Provisioing Disabled" -body $results -ErrorAction Stop } } else { if ($mailSSL -eq $true) { Send-MailMessage -SmtpServer $mailServer -UseSSL -Port $mailPort -From $mailFrom -To $mailRecipients -subject "$orgName KIS Pool Checker - Pool Provisioing Disabled" -body $results -ErrorAction Stop } else { Send-MailMessage -SmtpServer $mailServer -Port $mailPort -From $mailFrom -To $mailRecipients -subject "$orgName KIS Pool Checker - Pool Provisioing Disabled" -body $results -ErrorAction Stop } } If ($debug) { Write-Host "E-mail sent successfully to $mailTo" } Out-File -FilePath $logFile -Encoding ASCII -Append -InputObject "E-mail sent successfully to $mailTo" } catch { Write-Host "Error: Unable to send e-mail." -Backgroundcolor Red -ForegroundColor Yellow Write-Host $_.Exception.Message -Backgroundcolor Red -ForegroundColor Yellow If ($debug) { Write-Host "ERROR: Unable to send e-mail`r`n" } Out-File -FilePath $logFile -Encoding ASCII -Append -InputObject "ERROR: Unable to send e-mail`r`n`r`n" Out-File -FilePath $logFile -Encoding ASCII -Append -InputObject $_.Exception.Message } } else { Out-File -FilePath $logFile -Encoding ASCII -Append -InputObject "No pools with issues found. No e-mail sent.`r`n`r`n" } } $now = Get-Date Out-File -FilePath $logFile -Encoding ASCII -Append -InputObject "*** Script completed $now`r`n`r`n"