From d1924ad87a29ebc63b61b223ed6363befbbe4b7c Mon Sep 17 00:00:00 2001
From: Tim Carman
Date: Thu, 13 Mar 2025 09:19:57 +1100
Subject: [PATCH 1/6] Fix Get-RequiredModule function
- Fix `Get-RequiredModule` script function to properly check for installed VMware PowerCLI versions ([Fix #36](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues/36))
---
AsBuiltReport.VMware.Horizon.psd1 | 2 +-
CHANGELOG.md | 7 ++-
Src/Private/Get-RequiredModule.ps1 | 48 ++++++++++++-------
.../Invoke-ASBuiltReport.VMware.Horizon.ps1 | 2 +-
4 files changed, 39 insertions(+), 20 deletions(-)
diff --git a/AsBuiltReport.VMware.Horizon.psd1 b/AsBuiltReport.VMware.Horizon.psd1
index 8265423..d850237 100644
--- a/AsBuiltReport.VMware.Horizon.psd1
+++ b/AsBuiltReport.VMware.Horizon.psd1
@@ -12,7 +12,7 @@
RootModule = 'AsBuiltReport.VMware.Horizon.psm1'
# Version number of this module.
- ModuleVersion = '1.1.5'
+ ModuleVersion = '1.1.5.1'
# Supported PSEditions
# CompatiblePSEditions = @()
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 612df69..4d4129f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,7 +5,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-## [1.1.5] - 2025-1-21
+## [1.1.5.1] - 2025-03-13
+
+### Fixed
+- Fix `Get-RequiredModule` script function to properly check for installed VMware PowerCLI versions ([Fix #36](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues/36))
+
+## [1.1.5] - 2025-01-21
### Added
diff --git a/Src/Private/Get-RequiredModule.ps1 b/Src/Private/Get-RequiredModule.ps1
index 9e814a5..ccec928 100644
--- a/Src/Private/Get-RequiredModule.ps1
+++ b/Src/Private/Get-RequiredModule.ps1
@@ -4,33 +4,47 @@ function Get-RequiredModule {
Function to check if the required version of VMware PowerCLI is installed
.DESCRIPTION
Function to check if the required version of VMware PowerCLI is installed
+ .NOTES
+ Version: 0.1.1
+ Author: Tim Carman
+ Twitter: @tpcarman
+ Github: tpcarman
.PARAMETER Name
The name of the required PowerShell module
.PARAMETER Version
The version of the required PowerShell module
#>
[CmdletBinding()]
-
- Param
- (
+ Param (
+ [CmdletBinding()]
[Parameter(Mandatory = $true, ValueFromPipeline = $false)]
[ValidateNotNullOrEmpty()]
- [String] $Name,
+ [String]$Name,
+ [CmdletBinding()]
[Parameter(Mandatory = $true, ValueFromPipeline = $false)]
[ValidateNotNullOrEmpty()]
- [String] $Version
+ [String]$Version
)
- process {
- # Check if the required version of VMware PowerCLI is installed
- $RequiredModule = Get-Module -ListAvailable -Name $Name | Sort-Object -Property Version -Descending | Select-Object -First 1
- $ModuleVersion = "$($RequiredModule.Version.Major)" + "." + "$($RequiredModule.Version.Minor)"
- if ($ModuleVersion -eq ".") {
- throw "VMware PowerCLI $Version or higher is required to run the VMware Horizon As Built Report. Run 'Install-Module -Name $Name -MinimumVersion $Version' to install the required modules."
- }
- if ($ModuleVersion -lt $Version) {
- throw "VMware PowerCLI $Version or higher is required to run the VMware Horizon As Built Report. Run 'Update-Module -Name $Name -MinimumVersion $Version' to update the required modules."
- }
+
+ # Convert required version to a [Version] object
+ $RequiredVersion = [Version]$Version
+
+ # Find the latest installed version of the module
+ $InstalledModule = Get-Module -ListAvailable -Name $Name |
+ Sort-Object -Property Version -Descending |
+ Select-Object -First 1
+
+ if ($null -eq $InstalledModule) {
+ throw "VMware PowerCLI $Version or higher is required. Run 'Install-Module -Name $Name -MinimumVersion $Version -Force' to install the required modules."
+ }
+
+ # Convert installed version to a [Version] object
+ $InstalledVersion = [Version]$InstalledModule.Version
+
+ Write-PScriboMessage -Plugin "Module" -IsWarning "$($InstalledModule.Name) $InstalledVersion is currently installed."
+
+ if ($InstalledVersion -lt $RequiredVersion) {
+ throw "VMware PowerCLI $Version or higher is required. Run 'Update-Module -Name $Name -MinimumVersion $Version -Force' to update the required modules."
}
- end {}
-}
+}
\ No newline at end of file
diff --git a/Src/Public/Invoke-ASBuiltReport.VMware.Horizon.ps1 b/Src/Public/Invoke-ASBuiltReport.VMware.Horizon.ps1
index 8b22d35..f1ebdcc 100644
--- a/Src/Public/Invoke-ASBuiltReport.VMware.Horizon.ps1
+++ b/Src/Public/Invoke-ASBuiltReport.VMware.Horizon.ps1
@@ -5,7 +5,7 @@
.DESCRIPTION
Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
.NOTES
- Version: 1.1.5
+ Version: 1.1.5.1
Author: Chris Hildebrandt, Karl Newick
Twitter: @childebrandt42, @karlnewick
Editor: Jonathan Colon, @jcolonfzenpr
From 4ffde8bc37b5634b7379c6f3768718f12c5faff4 Mon Sep 17 00:00:00 2001
From: Tim Carman
Date: Thu, 13 Mar 2025 09:26:22 +1100
Subject: [PATCH 2/6] Fix code formatting
---
Src/Private/Get-RequiredModule.ps1 | 30 ++++++++++++++++++------------
1 file changed, 18 insertions(+), 12 deletions(-)
diff --git a/Src/Private/Get-RequiredModule.ps1 b/Src/Private/Get-RequiredModule.ps1
index ccec928..b6ed335 100644
--- a/Src/Private/Get-RequiredModule.ps1
+++ b/Src/Private/Get-RequiredModule.ps1
@@ -27,24 +27,30 @@ function Get-RequiredModule {
[String]$Version
)
- # Convert required version to a [Version] object
- $RequiredVersion = [Version]$Version
+ begin {}
- # Find the latest installed version of the module
- $InstalledModule = Get-Module -ListAvailable -Name $Name |
+ process {
+ # Convert required version to a [Version] object
+ $RequiredVersion = [Version]$Version
+
+ # Find the latest installed version of the module
+ $InstalledModule = Get-Module -ListAvailable -Name $Name |
Sort-Object -Property Version -Descending |
Select-Object -First 1
- if ($null -eq $InstalledModule) {
- throw "VMware PowerCLI $Version or higher is required. Run 'Install-Module -Name $Name -MinimumVersion $Version -Force' to install the required modules."
- }
+ if ($null -eq $InstalledModule) {
+ throw "VMware PowerCLI $Version or higher is required. Run 'Install-Module -Name $Name -MinimumVersion $Version -Force' to install the required modules."
+ }
- # Convert installed version to a [Version] object
- $InstalledVersion = [Version]$InstalledModule.Version
+ # Convert installed version to a [Version] object
+ $InstalledVersion = [Version]$InstalledModule.Version
- Write-PScriboMessage -Plugin "Module" -IsWarning "$($InstalledModule.Name) $InstalledVersion is currently installed."
+ Write-PScriboMessage -Plugin "Module" -IsWarning "$($InstalledModule.Name) $InstalledVersion is currently installed."
- if ($InstalledVersion -lt $RequiredVersion) {
- throw "VMware PowerCLI $Version or higher is required. Run 'Update-Module -Name $Name -MinimumVersion $Version -Force' to update the required modules."
+ if ($InstalledVersion -lt $RequiredVersion) {
+ throw "VMware PowerCLI $Version or higher is required. Run 'Update-Module -Name $Name -MinimumVersion $Version -Force' to update the required modules."
+ }
}
+
+ end {}
}
\ No newline at end of file
From 065459cabf2493caa5f64a490f4b8b45bec20b8d Mon Sep 17 00:00:00 2001
From: Jonathan Colon
Date: Sat, 13 Sep 2025 12:08:48 -0400
Subject: [PATCH 3/6] feat: Enhance diagram support and update module
dependencies
- Added options for diagram generation in AsBuiltReport.VMware.Horizon.json.
- Introduced Export-AbrDiagram function to handle diagram exports in various formats.
- Created Get-AbrHRZInfrastructureDiagram function for generating infrastructure diagrams.
- Updated Invoke-ASBuiltReport to check for required module versions and provide user feedback.
- Added icons for branding in the report.
- Bumped module versions for AsBuiltReport.Core and added Diagrammer.Core as a dependency.
- Updated CHANGELOG.md to reflect recent changes and enhancements.
---
.github/workflows/Codeql.yml | 2 +-
.github/workflows/PSScriptAnalyzer.yml | 2 +-
.../workflows/PSScriptAnalyzerSettings.psd1 | 3 +-
.github/workflows/Release.yml | 10 +-
1.1.5/.github/ISSUE_TEMPLATE/bug_report.yml | 98 ++
.../.github/ISSUE_TEMPLATE/change_request.yml | 34 +
1.1.5/.github/ISSUE_TEMPLATE/config.yml | 1 +
1.1.5/.github/PULL_REQUEST_TEMPLATE.md | 34 +
1.1.5/.github/workflows/Codeql.yml | 47 +
1.1.5/.github/workflows/PSScriptAnalyzer.yml | 17 +
.../workflows/PSScriptAnalyzerSettings.psd1 | 8 +
1.1.5/.github/workflows/Release.yml | 53 +
1.1.5/.vscode/settings.json | 33 +
1.1.5/AsBuiltReport.VMware.Horizon.Style.ps1 | 109 ++
1.1.5/AsBuiltReport.VMware.Horizon.json | 104 ++
1.1.5/AsBuiltReport.VMware.Horizon.psd1 | 135 ++
1.1.5/AsBuiltReport.VMware.Horizon.psm1 | 14 +
1.1.5/CHANGELOG.md | 89 ++
1.1.5/LICENSE | 21 +
1.1.5/PSGetModuleInfo.xml | 163 +++
1.1.5/README.md | 208 +++
...Sample VMware Horizon As Built Report.html | 1212 +++++++++++++++++
1.1.5/Src/Private/Get-AbrHRZADDomain.ps1 | 70 +
1.1.5/Src/Private/Get-AbrHRZAccessGroup.ps1 | 131 ++
1.1.5/Src/Private/Get-AbrHRZAdminGroup.ps1 | 160 +++
.../Src/Private/Get-AbrHRZApplicationPool.ps1 | 171 +++
1.1.5/Src/Private/Get-AbrHRZCertMgmt.ps1 | 77 ++
1.1.5/Src/Private/Get-AbrHRZCloudPod.ps1 | 103 ++
.../Private/Get-AbrHRZConnectionServer.ps1 | 351 +++++
1.1.5/Src/Private/Get-AbrHRZDatastore.ps1 | 119 ++
1.1.5/Src/Private/Get-AbrHRZDesktopPool.ps1 | 710 ++++++++++
1.1.5/Src/Private/Get-AbrHRZDomain.ps1 | 113 ++
1.1.5/Src/Private/Get-AbrHRZESXi.ps1 | 117 ++
1.1.5/Src/Private/Get-AbrHRZEventConf.ps1 | 147 ++
1.1.5/Src/Private/Get-AbrHRZFarm.ps1 | 315 +++++
.../Get-AbrHRZFederationAccessGroup.ps1 | 135 ++
1.1.5/Src/Private/Get-AbrHRZGatewayCert.ps1 | 66 +
.../Private/Get-AbrHRZGlobalEntitlement.ps1 | 283 ++++
1.1.5/Src/Private/Get-AbrHRZGlobalPolicy.ps1 | 68 +
1.1.5/Src/Private/Get-AbrHRZGlobalSetting.ps1 | 161 +++
1.1.5/Src/Private/Get-AbrHRZHCConnection.ps1 | 81 ++
1.1.5/Src/Private/Get-AbrHRZHCDataStore.ps1 | 72 +
1.1.5/Src/Private/Get-AbrHRZHCDomain.ps1 | 95 ++
1.1.5/Src/Private/Get-AbrHRZHCESXiHost.ps1 | 78 ++
.../Src/Private/Get-AbrHRZHCEventDataBase.ps1 | 75 +
.../Src/Private/Get-AbrHRZHCGatewayServer.ps1 | 119 ++
.../Private/Get-AbrHRZHCLicenseService.ps1 | 79 ++
1.1.5/Src/Private/Get-AbrHRZHCRDSFarm.ps1 | 78 ++
1.1.5/Src/Private/Get-AbrHRZHCRemotePod.ps1 | 80 ++
1.1.5/Src/Private/Get-AbrHRZHCSAML2.ps1 | 72 +
1.1.5/Src/Private/Get-AbrHRZHCTrueSSO.ps1 | 75 +
1.1.5/Src/Private/Get-AbrHRZHCvCenter.ps1 | 86 ++
1.1.5/Src/Private/Get-AbrHRZHomeSite.ps1 | 108 ++
.../Src/Private/Get-AbrHRZInfrastructure.ps1 | 69 +
1.1.5/Src/Private/Get-AbrHRZInstantClone.ps1 | 70 +
1.1.5/Src/Private/Get-AbrHRZLicense.ps1 | 167 +++
.../Private/Get-AbrHRZLocalEntitlement.ps1 | 201 +++
1.1.5/Src/Private/Get-AbrHRZMachine.ps1 | 69 +
.../Private/Get-AbrHRZRegisteredMachine.ps1 | 151 ++
.../Src/Private/Get-AbrHRZRolePermission.ps1 | 132 ++
1.1.5/Src/Private/Get-AbrHRZRolePrivilege.ps1 | 95 ++
1.1.5/Src/Private/Get-AbrHRZSite.ps1 | 79 ++
1.1.5/Src/Private/Get-AbrHRZTSSO.ps1 | 91 ++
1.1.5/Src/Private/Get-AbrHRZUAG.ps1 | 76 ++
.../Private/Get-AbrHRZUnauthenticatedACL.ps1 | 92 ++
1.1.5/Src/Private/Get-AbrHRZVcenter.ps1 | 161 +++
1.1.5/Src/Private/Get-RequiredModule.ps1 | 36 +
1.1.5/Src/Private/SharedUtilsFunctions.ps1 | 153 +++
.../Invoke-ASBuiltReport.VMware.Horizon.ps1 | 483 +++++++
AsBuiltReport.VMware.Horizon.json | 18 +-
AsBuiltReport.VMware.Horizon.psd1 | 8 +-
CHANGELOG.md | 17 +
Src/Private/Export-AbrDiagram.ps1 | 133 ++
.../Get-AbrHRZInfrastructureDiagram.ps1 | 61 +
Src/Private/Get-RequiredModule.ps1 | 4 +-
.../Invoke-ASBuiltReport.VMware.Horizon.ps1 | 82 +-
icons/AsBuiltReport_Logo.png | Bin 0 -> 5154 bytes
icons/AsBuiltReport_Signature.png | Bin 0 -> 12338 bytes
icons/no_icon.png | Bin 0 -> 8183 bytes
79 files changed, 9205 insertions(+), 35 deletions(-)
create mode 100644 1.1.5/.github/ISSUE_TEMPLATE/bug_report.yml
create mode 100644 1.1.5/.github/ISSUE_TEMPLATE/change_request.yml
create mode 100644 1.1.5/.github/ISSUE_TEMPLATE/config.yml
create mode 100644 1.1.5/.github/PULL_REQUEST_TEMPLATE.md
create mode 100644 1.1.5/.github/workflows/Codeql.yml
create mode 100644 1.1.5/.github/workflows/PSScriptAnalyzer.yml
create mode 100644 1.1.5/.github/workflows/PSScriptAnalyzerSettings.psd1
create mode 100644 1.1.5/.github/workflows/Release.yml
create mode 100644 1.1.5/.vscode/settings.json
create mode 100644 1.1.5/AsBuiltReport.VMware.Horizon.Style.ps1
create mode 100644 1.1.5/AsBuiltReport.VMware.Horizon.json
create mode 100644 1.1.5/AsBuiltReport.VMware.Horizon.psd1
create mode 100644 1.1.5/AsBuiltReport.VMware.Horizon.psm1
create mode 100644 1.1.5/CHANGELOG.md
create mode 100644 1.1.5/LICENSE
create mode 100644 1.1.5/PSGetModuleInfo.xml
create mode 100644 1.1.5/README.md
create mode 100644 1.1.5/Samples/Sample VMware Horizon As Built Report.html
create mode 100644 1.1.5/Src/Private/Get-AbrHRZADDomain.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZAccessGroup.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZAdminGroup.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZApplicationPool.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZCertMgmt.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZCloudPod.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZConnectionServer.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZDatastore.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZDesktopPool.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZDomain.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZESXi.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZEventConf.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZFarm.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZFederationAccessGroup.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZGatewayCert.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZGlobalEntitlement.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZGlobalPolicy.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZGlobalSetting.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZHCConnection.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZHCDataStore.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZHCDomain.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZHCESXiHost.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZHCEventDataBase.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZHCGatewayServer.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZHCLicenseService.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZHCRDSFarm.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZHCRemotePod.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZHCSAML2.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZHCTrueSSO.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZHCvCenter.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZHomeSite.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZInfrastructure.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZInstantClone.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZLicense.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZLocalEntitlement.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZMachine.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZRegisteredMachine.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZRolePermission.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZRolePrivilege.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZSite.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZTSSO.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZUAG.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZUnauthenticatedACL.ps1
create mode 100644 1.1.5/Src/Private/Get-AbrHRZVcenter.ps1
create mode 100644 1.1.5/Src/Private/Get-RequiredModule.ps1
create mode 100644 1.1.5/Src/Private/SharedUtilsFunctions.ps1
create mode 100644 1.1.5/Src/Public/Invoke-ASBuiltReport.VMware.Horizon.ps1
create mode 100644 Src/Private/Export-AbrDiagram.ps1
create mode 100644 Src/Private/Get-AbrHRZInfrastructureDiagram.ps1
create mode 100644 icons/AsBuiltReport_Logo.png
create mode 100644 icons/AsBuiltReport_Signature.png
create mode 100644 icons/no_icon.png
diff --git a/.github/workflows/Codeql.yml b/.github/workflows/Codeql.yml
index cadfeb5..d826105 100644
--- a/.github/workflows/Codeql.yml
+++ b/.github/workflows/Codeql.yml
@@ -27,7 +27,7 @@ jobs:
name: PSScriptAnalyzer
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Run PSScriptAnalyzer
uses: microsoft/psscriptanalyzer-action@v1.1
diff --git a/.github/workflows/PSScriptAnalyzer.yml b/.github/workflows/PSScriptAnalyzer.yml
index 528cc2a..ef8806c 100644
--- a/.github/workflows/PSScriptAnalyzer.yml
+++ b/.github/workflows/PSScriptAnalyzer.yml
@@ -5,7 +5,7 @@ jobs:
name: Run PSScriptAnalyzer
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: lint
uses: devblackops/github-action-psscriptanalyzer@master
with:
diff --git a/.github/workflows/PSScriptAnalyzerSettings.psd1 b/.github/workflows/PSScriptAnalyzerSettings.psd1
index 24835e7..185edd8 100644
--- a/.github/workflows/PSScriptAnalyzerSettings.psd1
+++ b/.github/workflows/PSScriptAnalyzerSettings.psd1
@@ -3,6 +3,7 @@
'PSUseToExportFieldsInManifest',
'PSReviewUnusedParameter',
'PSUseDeclaredVarsMoreThanAssignments',
- 'PSAvoidGlobalVars'
+ 'PSAvoidGlobalVars',
+ 'PSAvoidUsingWriteHost'
)
}
\ No newline at end of file
diff --git a/.github/workflows/Release.yml b/.github/workflows/Release.yml
index ccddc65..c79e31e 100644
--- a/.github/workflows/Release.yml
+++ b/.github/workflows/Release.yml
@@ -6,9 +6,9 @@ on:
jobs:
publish-to-gallery:
- runs-on: windows-2019
+ runs-on: windows-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Set PSRepository to Trusted for PowerShell Gallery
shell: pwsh
run: |
@@ -17,6 +17,10 @@ jobs:
shell: pwsh
run: |
Install-Module -Name AsBuiltReport.Core -Repository PSGallery -Force
+ - name: Install Diagrammer.Core module
+ shell: pwsh
+ run: |
+ Install-Module -Name Diagrammer.Core -Repository PSGallery -Force
- name: Test Module Manifest
shell: pwsh
run: |
@@ -45,7 +49,7 @@ jobs:
needs: publish-to-gallery
runs-on: ubuntu-latest
steps:
- - uses: zentered/bluesky-post-action@v0.1.0
+ - uses: zentered/bluesky-post-action@v0.3.0
with:
post: "[New Release] ${{ github.event.repository.name }} ${{ github.event.release.tag_name }}! Check out what's new! ${{ github.event.release.html_url }} #Omnissa #VMware #Horizon #vExpert #AsBuiltReport #PowerShell"
env:
diff --git a/1.1.5/.github/ISSUE_TEMPLATE/bug_report.yml b/1.1.5/.github/ISSUE_TEMPLATE/bug_report.yml
new file mode 100644
index 0000000..f312290
--- /dev/null
+++ b/1.1.5/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -0,0 +1,98 @@
+name: Bug Report
+description: File a bug report
+labels: ["bug"]
+assignees:
+ - childebrandt42
+body:
+ - type: textarea
+ id: bug-description
+ attributes:
+ label: Bug description
+ description: >-
+ Please provide a clear and concise description of the bug.
+ validations:
+ required: true
+ - type: input
+ id: command-line-input
+ attributes:
+ label: Command-line input
+ description: >-
+ Please provide the command line input you are using to run AsBuiltReport. Please ensure that you obscure any sensitive information.
+ placeholder: New-AsBuiltReport -Report VMware.Horizon -Target xxxxxxx -Format Word,HTML -OutputFolderPath .\Documents\ -AsBuiltConfigFilePath .\AsBuiltReport\AsBuiltReport.json -ReportConfigFilePath .\AsBuiltReport\AsBuiltReport.VMware.Horizon.json -EnableHealthCheck -Verbose
+ validations:
+ required: true
+ - type: textarea
+ id: steps-to-reproduce
+ attributes:
+ label: Steps to reproduce
+ description: >-
+ Please provide a detailed list of steps to reproduce the bug.
+ placeholder: |-
+ 1. ....
+ 2. ....
+ 3. ....
+ validations:
+ required: true
+ - type: textarea
+ id: expected-behaviour
+ attributes:
+ label: Expected behaviour
+ description: >-
+ Please provide a clear and concise description of what you expected to happen.
+ validations:
+ required: true
+ - type: textarea
+ id: screenshots
+ attributes:
+ label: Screenshots
+ description: >-
+ Please attach any screenshots to help explain the problem. Please ensure that you obscure any sensitive information.
+ placeholder: |-
+ Drag and drop screenshots here.
+ - type: textarea
+ id: operating-system
+ attributes:
+ label: Operating System
+ description: Please provide information about the operating system are you using.
+ placeholder: macOS Big Sur, Windows 10, Ubuntu 20.04 LTS
+ validations:
+ required: true
+ - type: textarea
+ id: powershell-version
+ attributes:
+ label: PowerShell Version
+ description: Please provide information about the PowerShell version you are using. Please provide the output from the following PowerShell command `$PSVersionTable`.
+ placeholder: $PSVersionTable
+ validations:
+ required: true
+ - type: textarea
+ id: powershell-modules
+ attributes:
+ label: PowerShell Modules
+ description: Please provide information about the PowerShell modules are you using. Please provide the output from the following PowerShell command `Get-Module -ListAvailable @("AsBuiltReport.Core";"AsBuiltReport.VMware.Horizon";"PScribo") | Select Name, Version`
+ placeholder: Get-Module -ListAvailable @("AsBuiltReport.Core";"AsBuiltReport.VMware.Horizon";"PScribo") | Select Name, Version
+ validations:
+ required: true
+ - type: textarea
+ id: additional-context
+ attributes:
+ label: Additional Context
+ description: This field is optional. You may provide additional context for the bug you wish to report. You may wish to include links to any related [issues](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues) or other relevant information.
+ - type: checkboxes
+ id: checklist
+ attributes:
+ label: Before submitting
+ description: >-
+ Please ensure your bug report fulfills all of the following requirements.
+ If you are unsure of what a specific requirement means, please follow the links to learn about it and understand why it is necessary before submitting.
+ options:
+ - label: >-
+ I have read and followed the [bug reporting guidelines](https://www.asbuiltreport.com/about/contributing/#reporting-issues-and-bugs).
+ required: true
+ - label: >-
+ I have read [the documentation](https://www.asbuiltreport.com/user-guide/new-asbuiltconfig),
+ and referred to the [known issues](https://www.asbuiltreport.com/user-guide/known-issues/) before submitting this bug report.
+ required: true
+ - label: >-
+ I have checked for previously opened & closed [issues](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues) before submitting this bug report.
+ required: true
diff --git a/1.1.5/.github/ISSUE_TEMPLATE/change_request.yml b/1.1.5/.github/ISSUE_TEMPLATE/change_request.yml
new file mode 100644
index 0000000..bf8e2f9
--- /dev/null
+++ b/1.1.5/.github/ISSUE_TEMPLATE/change_request.yml
@@ -0,0 +1,34 @@
+name: Change Request
+description: Request a new change or an improvement
+labels: ["change request"]
+assignees:
+ - childebrandt42
+body:
+ - type: textarea
+ id: description
+ attributes:
+ label: Description
+ description: >-
+ Please provide a detailed description of your idea so that the project maintainers and contributors can fully understand what change, feature, or improvement you are proposing.
+ validations:
+ required: true
+ - type: textarea
+ id: additional-context
+ attributes:
+ label: Additional Context
+ description: This field is optional. You may provide additional context for the idea you wish to propose. You may wish to include links to any related [issues](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues) or other relevant information.
+ - type: checkboxes
+ id: checklist
+ attributes:
+ label: Before submitting
+ description: >-
+ Please ensure your change request fulfills all of the following requirements.
+ If you are unsure of what a specific requirement means, please follow the links to learn about it and understand why it is necessary before submitting.
+ options:
+ - label: >-
+ I have read [the documentation](https://www.asbuiltreport.com/user-guide/new-asbuiltconfig),
+ and referred to the [known issues](https://www.asbuiltreport.com/user-guide/known-issues/) before submitting this change request.
+ required: true
+ - label: >-
+ I have checked for previously opened & closed [issues](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues) before submitting this change request.
+ required: true
diff --git a/1.1.5/.github/ISSUE_TEMPLATE/config.yml b/1.1.5/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 0000000..ec4bb38
--- /dev/null
+++ b/1.1.5/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1 @@
+blank_issues_enabled: false
\ No newline at end of file
diff --git a/1.1.5/.github/PULL_REQUEST_TEMPLATE.md b/1.1.5/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000..96f7bdf
--- /dev/null
+++ b/1.1.5/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,34 @@
+
+
+## Description
+
+
+## Related Issue
+
+
+
+
+
+## Motivation and Context
+
+
+## How Has This Been Tested?
+
+
+
+
+## Screenshots (if appropriate):
+
+## Types of changes
+
+- [ ] Bug fix (non-breaking change which fixes an issue)
+- [ ] New feature (non-breaking change which adds functionality)
+- [ ] Breaking change (fix or feature that would cause existing functionality to change)
+
+## Checklist:
+
+
+- [ ] My code follows the code style of this project.
+- [ ] My change requires a change to the documentation.
+- [ ] I have updated the documentation accordingly.
+- [ ] I have read the [**CONTRIBUTING**](/CONTRIBUTING.md) document.
diff --git a/1.1.5/.github/workflows/Codeql.yml b/1.1.5/.github/workflows/Codeql.yml
new file mode 100644
index 0000000..e4c6e1c
--- /dev/null
+++ b/1.1.5/.github/workflows/Codeql.yml
@@ -0,0 +1,47 @@
+# This workflow uses actions that are not certified by GitHub.
+# They are provided by a third-party and are governed by
+# separate terms of service, privacy policy, and support
+# documentation.
+#
+# https://github.com/microsoft/action-psscriptanalyzer
+# For more information on PSScriptAnalyzer in general, see
+# https://github.com/PowerShell/PSScriptAnalyzer
+
+name: CodeQL
+
+on:
+ push:
+ branches: [ "dev" ]
+ pull_request:
+ branches: [ "dev" ]
+
+permissions:
+ contents: read
+
+jobs:
+ build:
+ permissions:
+ contents: read # for actions/checkout to fetch code
+ security-events: write # for github/codeql-action/upload-sarif to upload SARIF results
+ actions: read # only required for a private repository by github/codeql-action/upload-sarif to get the Action run status
+ name: PSScriptAnalyzer
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Run PSScriptAnalyzer
+ uses: microsoft/psscriptanalyzer-action@v1.1
+ with:
+ # Check https://github.com/microsoft/action-psscriptanalyzer for more info about the options.
+ # The below set up runs PSScriptAnalyzer to your entire repository and runs some basic security rules.
+ path: .\
+ recurse: true
+ # Include your own basic security rules. Removing this option will run all the rules
+ excludeRule: '"PSAvoidUsingPlainTextForPassword", "PSAvoidUsingUsernameAndPasswordParams", "PSAvoidUsingConvertToSecureStringWithPlainText"'
+ output: results.sarif
+
+ # Upload the SARIF file generated in the previous step
+ - name: Upload SARIF results file
+ uses: github/codeql-action/upload-sarif@v3
+ with:
+ sarif_file: results.sarif
diff --git a/1.1.5/.github/workflows/PSScriptAnalyzer.yml b/1.1.5/.github/workflows/PSScriptAnalyzer.yml
new file mode 100644
index 0000000..528cc2a
--- /dev/null
+++ b/1.1.5/.github/workflows/PSScriptAnalyzer.yml
@@ -0,0 +1,17 @@
+name: PSScriptAnalyzer
+on: [push, pull_request]
+jobs:
+ lint:
+ name: Run PSScriptAnalyzer
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - name: lint
+ uses: devblackops/github-action-psscriptanalyzer@master
+ with:
+ sendComment: true
+ failOnErrors: true
+ failOnWarnings: false
+ failOnInfos: false
+ repoToken: ${{ secrets.GITHUB_TOKEN }}
+ settingsPath: .github/workflows/PSScriptAnalyzerSettings.psd1
\ No newline at end of file
diff --git a/1.1.5/.github/workflows/PSScriptAnalyzerSettings.psd1 b/1.1.5/.github/workflows/PSScriptAnalyzerSettings.psd1
new file mode 100644
index 0000000..24835e7
--- /dev/null
+++ b/1.1.5/.github/workflows/PSScriptAnalyzerSettings.psd1
@@ -0,0 +1,8 @@
+@{
+ ExcludeRules = @(
+ 'PSUseToExportFieldsInManifest',
+ 'PSReviewUnusedParameter',
+ 'PSUseDeclaredVarsMoreThanAssignments',
+ 'PSAvoidGlobalVars'
+ )
+}
\ No newline at end of file
diff --git a/1.1.5/.github/workflows/Release.yml b/1.1.5/.github/workflows/Release.yml
new file mode 100644
index 0000000..ccddc65
--- /dev/null
+++ b/1.1.5/.github/workflows/Release.yml
@@ -0,0 +1,53 @@
+name: Publish PowerShell Module
+
+on:
+ release:
+ types: [published]
+
+jobs:
+ publish-to-gallery:
+ runs-on: windows-2019
+ steps:
+ - uses: actions/checkout@v4
+ - name: Set PSRepository to Trusted for PowerShell Gallery
+ shell: pwsh
+ run: |
+ Set-PSRepository -Name PSGallery -InstallationPolicy Trusted
+ - name: Install AsBuiltReport.Core module
+ shell: pwsh
+ run: |
+ Install-Module -Name AsBuiltReport.Core -Repository PSGallery -Force
+ - name: Test Module Manifest
+ shell: pwsh
+ run: |
+ Test-ModuleManifest .\AsBuiltReport.VMware.Horizon.psd1
+ - name: Publish module to PowerShell Gallery
+ shell: pwsh
+ run: |
+ Publish-Module -Path ./ -NuGetApiKey ${{ secrets.PSGALLERY_API_KEY }} -Verbose
+ tweet:
+ needs: publish-to-gallery
+ runs-on: ubuntu-latest
+ steps:
+ - uses: Eomm/why-don-t-you-tweet@v2
+ # We don't want to tweet if the repository is not a public one
+ if: ${{ !github.event.repository.private }}
+ with:
+ # GitHub event payload
+ # https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#release
+ tweet-message: "[New Release] ${{ github.event.repository.name }} ${{ github.event.release.tag_name }}! Check out what's new! ${{ github.event.release.html_url }} #VMware #Horizon #AsBuiltReport #PowerShell #vExpert"
+ env:
+ TWITTER_CONSUMER_API_KEY: ${{ secrets.TWITTER_CONSUMER_API_KEY }}
+ TWITTER_CONSUMER_API_SECRET: ${{ secrets.TWITTER_CONSUMER_API_SECRET }}
+ TWITTER_ACCESS_TOKEN: ${{ secrets.TWITTER_ACCESS_TOKEN }}
+ TWITTER_ACCESS_TOKEN_SECRET: ${{ secrets.TWITTER_ACCESS_TOKEN_SECRET }}
+ bsky-post:
+ needs: publish-to-gallery
+ runs-on: ubuntu-latest
+ steps:
+ - uses: zentered/bluesky-post-action@v0.1.0
+ with:
+ post: "[New Release] ${{ github.event.repository.name }} ${{ github.event.release.tag_name }}! Check out what's new! ${{ github.event.release.html_url }} #Omnissa #VMware #Horizon #vExpert #AsBuiltReport #PowerShell"
+ env:
+ BSKY_IDENTIFIER: ${{ secrets.BSKY_IDENTIFIER }}
+ BSKY_PASSWORD: ${{ secrets.BSKY_PASSWORD }}
\ No newline at end of file
diff --git a/1.1.5/.vscode/settings.json b/1.1.5/.vscode/settings.json
new file mode 100644
index 0000000..6f3e883
--- /dev/null
+++ b/1.1.5/.vscode/settings.json
@@ -0,0 +1,33 @@
+{
+ "powershell.codeFormatting.preset": "Custom",
+ "powershell.codeFormatting.useCorrectCasing": true,
+ "powershell.codeFormatting.autoCorrectAliases": true,
+ "powershell.codeFormatting.whitespaceBeforeOpenBrace": true,
+ "powershell.codeFormatting.whitespaceBeforeOpenParen": true,
+ "powershell.codeFormatting.whitespaceAroundOperator": true,
+ "powershell.codeFormatting.whitespaceAfterSeparator": true,
+ "powershell.codeFormatting.addWhitespaceAroundPipe": true,
+ "powershell.codeFormatting.ignoreOneLineBlock": true,
+ "powershell.codeFormatting.newLineAfterCloseBrace": false,
+ "powershell.codeFormatting.newLineAfterOpenBrace": true,
+ "powershell.codeFormatting.openBraceOnSameLine": true,
+ "powershell.codeFormatting.alignPropertyValuePairs": false,
+ "powershell.codeFolding.enable": true,
+ "powershell.scriptAnalysis.enable": true,
+ "powershell.scriptAnalysis.settingsPath": ".github/workflows/PSScriptAnalyzerSettings.psd1",
+ "editor.tabSize": 4,
+ "editor.insertSpaces": true,
+ "editor.detectIndentation": false,
+ "editor.rulers": [
+ 115
+ ],
+ "files.trimTrailingWhitespace": true,
+ "cSpell.words": [
+ "Hildebrandt",
+ "Iain",
+ "jcolonfzenpr",
+ "karlnewick",
+ "Newick",
+ "Scribo"
+ ]
+}
\ No newline at end of file
diff --git a/1.1.5/AsBuiltReport.VMware.Horizon.Style.ps1 b/1.1.5/AsBuiltReport.VMware.Horizon.Style.ps1
new file mode 100644
index 0000000..a8615c8
--- /dev/null
+++ b/1.1.5/AsBuiltReport.VMware.Horizon.Style.ps1
@@ -0,0 +1,109 @@
+# VMware Horizon Default Document Style
+
+# Configure document options
+DocumentOption -EnableSectionNumbering -PageSize A4 -DefaultFont 'Arial' -MarginLeftAndRight 71 -MarginTopAndBottom 71 -Orientation $Orientation
+
+# Configure Heading and Font Styles
+Style -Name 'Title' -Size 24 -Color '717074' -Align Center
+Style -Name 'Title 2' -Size 18 -Color 'A1A0A4' -Align Center
+Style -Name 'Title 3' -Size 12 -Color '006A91' -Align Center
+Style -Name 'Heading 1' -Size 16 -Color '00364D'
+Style -Name 'Heading 2' -Size 14 -Color '004B6B'
+Style -Name 'NO TOC Heading 2' -Size 14 -Color '004B6B'
+Style -Name 'Heading 3' -Size 12 -Color '00567A'
+Style -Name 'Heading 4' -Size 11 -Color '00648F'
+Style -Name 'Heading 5' -Size 10 -Color '0072A3'
+Style -Name 'NO TOC Heading 5' -Size 10 -Color '0072A3'
+Style -Name 'Heading 6' -Size 10 -Color '0072A3'
+Style -Name 'NO TOC Heading 6' -Size 10 -Color '0072A3'
+Style -Name 'Heading 7' -Size 10 -Color '0072A3'
+Style -Name 'Normal' -Size 10 -Color '565656' -Default
+Style -Name 'Caption' -Size 10 -Color '565656' -Italic -Align Center
+Style -Name 'Header' -Size 10 -Color '565656' -Align Center
+Style -Name 'Footer' -Size 10 -Color '565656' -Align Center
+Style -Name 'TOC' -Size 16 -Color '00364D'
+#Style -Name 'TableDefaultHeading' -Size 10 -Color '565656' -BackgroundColor 'FAFAFA' # Light Theme
+Style -Name 'TableDefaultHeading' -Size 10 -Color 'FAFAFA' -BackgroundColor '00364D' # Dark Theme
+Style -Name 'TableDefaultRow' -Size 10 -Color '565656'
+Style -Name 'Critical' -Size 10 -Color '565656' -BackgroundColor 'FEDDD7'
+Style -Name 'Warning' -Size 10 -Color '565656' -BackgroundColor 'FFF4C7'
+Style -Name 'Info' -Size 10 -Color '565656' -BackgroundColor 'E3F5FC'
+Style -Name 'OK' -Size 10 -Color '565656' -BackgroundColor 'DFF0D0'
+
+# Configure Table Styles
+$TableDefaultProperties = @{
+ Id = 'TableDefault'
+ HeaderStyle = 'TableDefaultHeading'
+ RowStyle = 'TableDefaultRow'
+ #BorderColor = 'A6A6A6' # Light Theme
+ BorderColor = '00364D' # Dark Theme
+ Align = 'Left'
+ CaptionStyle = 'Caption'
+ CaptionLocation = 'Below'
+ BorderWidth = 0.25
+ PaddingTop = 1
+ PaddingBottom = 1.5
+ PaddingLeft = 2
+ PaddingRight = 2
+}
+
+TableStyle @TableDefaultProperties -Default
+TableStyle -Id 'Borderless' -HeaderStyle Normal -RowStyle Normal -BorderWidth 0
+
+# VMware Cover Page Layout
+# Header & Footer
+if ($ReportConfig.Report.ShowHeaderFooter) {
+ Header -Default {
+ Paragraph -Style Header "$($ReportConfig.Report.Name) - v$($ReportConfig.Report.Version)"
+ }
+
+ Footer -Default {
+ Paragraph -Style Footer 'Page '
+ }
+}
+
+# Set position of report titles and information based on page orientation
+if (!($ReportConfig.Report.ShowCoverPageImage)) {
+ $LineCount = 5
+}
+if ($Orientation -eq 'Portrait') {
+ BlankLine -Count 11
+ $LineCount = 32 + $LineCount
+} else {
+ BlankLine -Count 7
+ $LineCount = 15 + $LineCount
+}
+
+# VMware Logo Image
+if ($ReportConfig.Report.ShowCoverPageImage) {
+ Try {
+ Image -Text 'VMware Logo' -Align 'Center' -Percent 5 -Base64 "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"
+ BlankLine -Count 2
+ } Catch {
+ Write-PScriboMessage -Message ".NET Core is required for cover page image support. Please install .NET Core or disable 'ShowCoverPageImage' in the report JSON configuration file."
+ }
+}
+
+# Add Report Name
+Paragraph -Style Title $ReportConfig.Report.Name
+
+if ($AsBuiltConfig.Company.FullName) {
+ # Add Company Name if specified
+ BlankLine -Count 2
+ Paragraph -Style Title2 $AsBuiltConfig.Company.FullName
+ BlankLine -Count $LineCount
+} else {
+ BlankLine -Count ($LineCount + 1)
+}
+Table -Name 'Cover Page' -List -Style Borderless -Width 0 -Hashtable ([Ordered] @{
+ 'Author:' = $AsBuiltConfig.Report.Author
+ 'Date:' = (Get-Date).ToLongDateString()
+ 'Version:' = $ReportConfig.Report.Version
+ })
+PageBreak
+
+if ($ReportConfig.Report.ShowTableOfContents) {
+ # Add Table of Contents
+ TOC -Name 'Table of Contents'
+ PageBreak
+}
\ No newline at end of file
diff --git a/1.1.5/AsBuiltReport.VMware.Horizon.json b/1.1.5/AsBuiltReport.VMware.Horizon.json
new file mode 100644
index 0000000..e084a0b
--- /dev/null
+++ b/1.1.5/AsBuiltReport.VMware.Horizon.json
@@ -0,0 +1,104 @@
+{
+ "Report": {
+ "Name": "Omnissa Horizon As Built Report",
+ "Version": "1.0",
+ "Status": "Released",
+ "ShowCoverPageImage": true,
+ "ShowTableOfContents": true,
+ "ShowHeaderFooter": true,
+ "ShowTableCaptions": true
+ },
+ "Options": {},
+ "InfoLevel": {
+ "_comment_": "0 = Disabled, 1 = Summary, 2 = Informative, 3 = Detailed",
+ "UsersAndGroups": {
+ "Entitlements": 1,
+ "HomeSiteAssignments": 1,
+ "UnauthenticatedAccess": 1
+ },
+ "Inventory": {
+ "Desktop": 1,
+ "Applications": 1,
+ "Farms": 1,
+ "Machines": 1,
+ "GlobalEntitlements": 1
+ },
+ "Settings": {
+ "Servers": {
+ "vCenterServers": {
+ "vCenter": 1,
+ "ESXiHosts": 1,
+ "DataStores": 1,
+ "ADDomains": 1
+ },
+ "UAG": {
+ "UAGServers": 1
+ },
+ "ConnectionServers": {
+ "ConnectionServers": 1,
+ "TrueSSO": 1
+ }
+ },
+ "InstantClone": {
+ "InstantCloneDomainAccounts": 1
+ },
+ "ProductLicensing": {
+ "ProductLicensingandUsage": 1
+ },
+ "GlobalSettings": {
+ "GlobalSettings": 1
+ },
+ "RegisteredMachines": {
+ "RDSHosts": 1
+ },
+ "Administrators": {
+ "AdministratorsandGroups": 1,
+ "RolePrivileges": 1,
+ "RolePermissions": 1,
+ "AccessGroup": 1,
+ "FederationAccessGroup": 1
+ },
+ "CloudPodArch": {
+ "CloudPodArch": 1
+ },
+ "Sites": {
+ "Sites": 1
+ },
+ "EventConfiguration": {
+ "EventDatabase": 1,
+ "Syslog": 1,
+ "EventstoFileSystem": 1
+ },
+ "GlobalPolicies": {
+ "GlobalPolicies": 1
+ }
+ }
+ },
+ "HealthCheck": {
+ "HealthCheck": {
+ "Overview": true
+ },
+ "Components": {
+ "ConnectionServers": true,
+ "GatewayServer": true,
+ "EventDataBase": true,
+ "TrueSSO": true
+ },
+ "RDSFarms": {
+ "RDSFarms": true
+ },
+ "vSphere": {
+ "DataStores": true,
+ "vCenter": true,
+ "ESXiHosts": true
+ },
+ "OtherComponents": {
+ "Domains": true,
+ "SAML2": true,
+ "LicenseService": true
+ },
+ "RemotePod": {
+ "RemotePod": true
+ }
+ }
+}
\ No newline at end of file
diff --git a/1.1.5/AsBuiltReport.VMware.Horizon.psd1 b/1.1.5/AsBuiltReport.VMware.Horizon.psd1
new file mode 100644
index 0000000..8265423
--- /dev/null
+++ b/1.1.5/AsBuiltReport.VMware.Horizon.psd1
@@ -0,0 +1,135 @@
+#
+# Module manifest for module 'AsBuiltReport.VMware.Horizon'
+#
+# Generated by: Chris.Hildebrandt
+#
+# Generated on: 7/6/2019
+#
+
+@{
+
+ # Script module or binary module file associated with this manifest.
+ RootModule = 'AsBuiltReport.VMware.Horizon.psm1'
+
+ # Version number of this module.
+ ModuleVersion = '1.1.5'
+
+ # Supported PSEditions
+ # CompatiblePSEditions = @()
+
+ # ID used to uniquely identify this module
+ GUID = '2d7d49b3-b010-453c-8a35-22b19f9b7a17'
+
+ # Author of this module
+ Author = 'Chris Hildebrandt'
+
+ # Company or vendor of this module
+ #CompanyName = 'Unknown'
+
+ # Copyright statement for this module
+ Copyright = '(c) 2025 Chris Hildebrandt. All rights reserved.'
+
+ # Description of the functionality provided by this module
+ Description = 'A PowerShell module to generate as built reports on the configuration of VMware Horizon'
+
+ # Minimum version of the Windows PowerShell engine required by this module
+ PowerShellVersion = '5.1'
+
+ # Name of the Windows PowerShell host required by this module
+ # PowerShellHostName = ''
+
+ # Minimum version of the Windows PowerShell host required by this module
+ # PowerShellHostVersion = ''
+
+ # Minimum version of Microsoft .NET Framework required by this module. This prerequisite is valid for the PowerShell Desktop edition only.
+ # DotNetFrameworkVersion = ''
+
+ # Minimum version of the common language runtime (CLR) required by this module. This prerequisite is valid for the PowerShell Desktop edition only.
+ # CLRVersion = ''
+
+ # Processor architecture (None, X86, Amd64) required by this module
+ # ProcessorArchitecture = ''
+
+ # Modules that must be imported into the global environment prior to importing this module
+ RequiredModules = @(
+ @{
+ ModuleName = 'AsBuiltReport.Core';
+ ModuleVersion = '1.4.2'
+ }
+ )
+ # Assemblies that must be loaded prior to importing this module
+ # RequiredAssemblies = @()
+
+ # Script files (.ps1) that are run in the caller's environment prior to importing this module.
+ # ScriptsToProcess = @()
+
+ # Type files (.ps1xml) to be loaded when importing this module
+ # TypesToProcess = @()
+
+ # Format files (.ps1xml) to be loaded when importing this module
+ # FormatsToProcess = @()
+
+ # Modules to import as nested modules of the module specified in RootModule/ModuleToProcess
+ # NestedModules = @()
+
+ # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export.
+ FunctionsToExport = @('Invoke-AsBuiltReport.VMware.Horizon')
+
+ # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export.
+ #CmdletsToExport = @()
+
+ # Variables to export from this module
+ #VariablesToExport = '*'
+
+ # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export.
+ #AliasesToExport = @()
+
+ # DSC resources to export from this module
+ # DscResourcesToExport = @()
+
+ # List of all modules packaged with this module
+ # ModuleList = @()
+
+ # List of all files packaged with this module
+ # FileList = @()
+
+ # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell.
+ PrivateData = @{
+
+ PSData = @{
+ # Tags applied to this module. These help with module discovery in online galleries.
+ Tags = 'AsBuiltReport', 'Report', 'VMware', 'Horizon', 'Documentation', 'PScribo', 'PSEdition_Desktop', 'Windows', 'Omnissa'
+
+ # A URL to the license for this module.
+ LicenseUri = 'https://raw.githubusercontent.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/master/LICENSE'
+
+ # A URL to the main website for this project.
+ ProjectUri = 'https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon'
+
+ # A URL to an icon representing this module.
+ IconUri = 'https://raw.githubusercontent.com/AsBuiltReport/AsBuiltReport/master/AsBuiltReport.png'
+
+ # ReleaseNotes of this module
+ ReleaseNotes = 'https://raw.githubusercontent.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/master/CHANGELOG.md'
+
+ # Prerelease string of this module
+ # Prerelease = ''
+
+ # Flag to indicate whether the module requires explicit user acceptance for install/update/save
+ # RequireLicenseAcceptance = $false
+
+ # External dependent modules of this module
+ # ExternalModuleDependencies = @()
+
+ } # End of PSData hashtable
+
+ } # End of PrivateData hashtable
+
+ # HelpInfo URI of this module
+ # HelpInfoURI = ''
+
+ # Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix.
+ # DefaultCommandPrefix = ''
+
+}
+
diff --git a/1.1.5/AsBuiltReport.VMware.Horizon.psm1 b/1.1.5/AsBuiltReport.VMware.Horizon.psm1
new file mode 100644
index 0000000..6519bad
--- /dev/null
+++ b/1.1.5/AsBuiltReport.VMware.Horizon.psm1
@@ -0,0 +1,14 @@
+# Get public and private function definition files and dot source them
+$Public = @(Get-ChildItem -Path $PSScriptRoot\Src\Public\*.ps1 -ErrorAction SilentlyContinue)
+$Private = @(Get-ChildItem -Path $PSScriptRoot\Src\Private\*.ps1 -ErrorAction SilentlyContinue)
+
+foreach ($Module in @($Public + $Private)) {
+ try {
+ . $Module.FullName
+ } catch {
+ Write-Error -Message "Failed to import function $($Module.FullName): $_"
+ }
+}
+
+Export-ModuleMember -Function $Public.BaseName
+Export-ModuleMember -Function $Private.BaseName
\ No newline at end of file
diff --git a/1.1.5/CHANGELOG.md b/1.1.5/CHANGELOG.md
new file mode 100644
index 0000000..612df69
--- /dev/null
+++ b/1.1.5/CHANGELOG.md
@@ -0,0 +1,89 @@
+# :arrows_clockwise: VMware Horizon As Built Report Changelog
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+## [1.1.5] - 2025-1-21
+
+### Added
+
+- Added TrueSSO Certificate details and Health Check Section
+
+### Changed
+
+- Tested with Horizon 2406
+- Added TrueSSO Cetificate details section
+- Added Health Check module
+- Increased AsBuiltReport.Core minimum requirements to v1.4.2
+- Increased Eomm/why-don-t-you-tweet Github action to v2
+
+### Fixed
+
+- Resolved the Following issues:
+- [#30](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues/30)
+
+## [1.1.4] - 2024-11-22
+
+### Added
+
+- Tested Report with Horizon 8.13
+
+### Changed
+
+- Changed Required Modules to AsBuiltReport.Core v1.4.0
+- Improved detection of empty fields in tables
+- Improved detection of true/false elements in tables
+- Updated GitHub release workflow to add post to Bluesky social platform
+- Updated sample report
+
+## [1.1.3] - 2024-02-14
+
+### Added
+
+- Added module version validation
+
+### Changed
+
+- Updated VMware PowerCLI requirements to v13.2
+- Updated Sample Reports
+- Updated CodeQL upload-sarif action requirement to v3
+- Updated PSScriptAnalyzer checkout action requirement to v4
+- Updated PublishPowerShellModule checkout action requirement to v4
+
+### Fixed
+
+- Resolved the Following issues:
+ - [#15](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues/15), [#16](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues/16), [#17](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues/17), [#18](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues/18), [#19](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues/19), [#20](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues/20), [#21](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues/21), [#22](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues/22), [#23](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues/23), [#24](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues/24)
+
+## [1.1.2] - 2024-02-02
+
+### Fixed
+
+- Renamed Domains Connection Server Section. Resolve [#13](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues/13)
+- Fixed Admin Users and Groups bug details reporting incorrectly. Resolve [#12](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues/12)
+
+## [1.1.0] - 2023-12-19
+
+### Added
+
+- Updated Report to work with Horizon 2309
+- Added Features for Certificates and Replication status
+- Improved functionaliy and layout.
+
+## [0.2.0] - 2022-08-17
+
+### Added
+
+- Migrate report to new module format
+ - Implement better error handling
+- Improve report layout
+- A set of Horizon infrastructure health checks has been introduced.
+
+## [0.1.0] - 2020-07-27
+
+### Added
+
+- Initial Release @childebrandt42
+ - Develop core horizon modules and sections
diff --git a/1.1.5/LICENSE b/1.1.5/LICENSE
new file mode 100644
index 0000000..8466cde
--- /dev/null
+++ b/1.1.5/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2025 AsBuiltReport
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/1.1.5/PSGetModuleInfo.xml b/1.1.5/PSGetModuleInfo.xml
new file mode 100644
index 0000000..dbbc079
--- /dev/null
+++ b/1.1.5/PSGetModuleInfo.xml
@@ -0,0 +1,163 @@
+
+
+
+ Microsoft.PowerShell.Commands.PSRepositoryItemInfo
+ System.Management.Automation.PSCustomObject
+ System.Object
+
+
+ AsBuiltReport.VMware.Horizon
+ 1.1.5
+ Module
+ A PowerShell module to generate as built reports on the configuration of VMware Horizon
+ Chris Hildebrandt
+ tpcarman
+ (c) 2025 Chris Hildebrandt. All rights reserved.
+ 2025-02-01T00:39:45-04:00
+
+ 2025-09-13T12:03:34.846732-04:00
+
+
+
+ Microsoft.PowerShell.Commands.DisplayHintType
+ System.Enum
+ System.ValueType
+ System.Object
+
+ DateTime
+ 2
+
+
+
+
+ https://raw.githubusercontent.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/master/LICENSE
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ https://raw.githubusercontent.com/AsBuiltReport/AsBuiltReport/master/AsBuiltReport.png
+
+
+ System.Object[]
+ System.Array
+ System.Object
+
+
+ AsBuiltReport
+ Report
+ VMware
+ Horizon
+ Documentation
+ PScribo
+ PSEdition_Desktop
+ Windows
+ Omnissa
+ PSModule
+
+
+
+
+ System.Collections.Hashtable
+ System.Object
+
+
+
+ RoleCapability
+
+
+
+
+
+
+ DscResource
+
+
+
+ Cmdlet
+
+
+
+ Function
+
+
+
+ Invoke-AsBuiltReport.VMware.Horizon
+
+
+
+
+ Command
+
+
+
+ Invoke-AsBuiltReport.VMware.Horizon
+
+
+
+
+ Workflow
+
+
+
+
+
+ https://raw.githubusercontent.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/master/CHANGELOG.md
+
+
+
+
+
+ System.Collections.Specialized.OrderedDictionary
+ System.Object
+
+
+
+ Name
+ AsBuiltReport.Core
+
+
+ MinimumVersion
+ 1.4.2
+
+
+ CanonicalId
+ nuget:AsBuiltReport.Core/1.4.2
+
+
+
+
+
+ https://www.powershellgallery.com/api/v2
+ PSGallery
+ NuGet
+
+
+ System.Management.Automation.PSCustomObject
+ System.Object
+
+
+ (c) 2025 Chris Hildebrandt. All rights reserved.
+ A PowerShell module to generate as built reports on the configuration of VMware Horizon
+ False
+ https://raw.githubusercontent.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/master/CHANGELOG.md
+ True
+ True
+ 17592
+ 36264
+ 278721
+ 2/1/2025 12:39:45 AM -04:00
+ 2/1/2025 12:39:45 AM -04:00
+ 9/13/2025 4:00:00 PM -04:00
+ AsBuiltReport Report VMware Horizon Documentation PScribo PSEdition_Desktop Windows Omnissa PSModule PSFunction_Invoke-AsBuiltReport.VMware.Horizon PSCommand_Invoke-AsBuiltReport.VMware.Horizon PSIncludes_Function
+ False
+ 2025-09-13T16:00:00Z
+ 1.1.5
+ Chris Hildebrandt
+ false
+ Module
+ AsBuiltReport.VMware.Horizon.nuspec|Samples\Sample VMware Horizon As Built Report.html|Src\Private\Get-AbrHRZGlobalEntitlement.ps1|Src\Private\Get-AbrHRZInfrastructure.ps1|AsBuiltReport.VMware.Horizon.json|Src\Private\Get-AbrHRZAccessGroup.ps1|Src\Private\Get-AbrHRZGlobalPolicy.ps1|Src\Private\Get-AbrHRZInstantClone.ps1|Src\Private\Get-AbrHRZADDomain.ps1|Src\Private\Get-AbrHRZGlobalSetting.ps1|Src\Private\Get-AbrHRZLicense.ps1|AsBuiltReport.VMware.Horizon.psd1|Src\Private\Get-AbrHRZAdminGroup.ps1|Src\Private\Get-AbrHRZHCConnection.ps1|Src\Private\Get-AbrHRZLocalEntitlement.ps1|AsBuiltReport.VMware.Horizon.psm1|Src\Private\Get-AbrHRZApplicationPool.ps1|Src\Private\Get-AbrHRZHCDataStore.ps1|Src\Private\Get-AbrHRZMachine.ps1|AsBuiltReport.VMware.Horizon.Style.ps1|Src\Private\Get-AbrHRZCertMgmt.ps1|Src\Private\Get-AbrHRZHCDomain.ps1|Src\Private\Get-AbrHRZRegisteredMachine.ps1|CHANGELOG.md|Src\Private\Get-AbrHRZCloudPod.ps1|Src\Private\Get-AbrHRZHCESXiHost.ps1|Src\Private\Get-AbrHRZRolePermission.ps1|LICENSE|Src\Private\Get-AbrHRZConnectionServer.ps1|Src\Private\Get-AbrHRZHCEventDataBase.ps1|Src\Private\Get-AbrHRZRolePrivilege.ps1|README.md|Src\Private\Get-AbrHRZDatastore.ps1|Src\Private\Get-AbrHRZHCGatewayServer.ps1|Src\Private\Get-AbrHRZSite.ps1|.github\PULL_REQUEST_TEMPLATE.md|Src\Private\Get-AbrHRZDesktopPool.ps1|Src\Private\Get-AbrHRZHCLicenseService.ps1|Src\Private\Get-AbrHRZTSSO.ps1|.github\ISSUE_TEMPLATE\bug_report.yml|Src\Private\Get-AbrHRZDomain.ps1|Src\Private\Get-AbrHRZHCRDSFarm.ps1|Src\Private\Get-AbrHRZUAG.ps1|.github\ISSUE_TEMPLATE\change_request.yml|Src\Private\Get-AbrHRZESXi.ps1|Src\Private\Get-AbrHRZHCRemotePod.ps1|Src\Private\Get-AbrHRZUnauthenticatedACL.ps1|.github\ISSUE_TEMPLATE\config.yml|Src\Private\Get-AbrHRZEventConf.ps1|Src\Private\Get-AbrHRZHCSAML2.ps1|Src\Private\Get-AbrHRZVcenter.ps1|.github\workflows\Codeql.yml|Src\Private\Get-AbrHRZFarm.ps1|Src\Private\Get-AbrHRZHCTrueSSO.ps1|Src\Private\Get-RequiredModule.ps1|.github\workflows\PSScriptAnalyzer.yml|Src\Private\Get-AbrHRZFederationAccessGroup.ps1|Src\Private\Get-AbrHRZHCvCenter.ps1|Src\Private\SharedUtilsFunctions.ps1|.github\workflows\PSScriptAnalyzerSettings.psd1|Src\Private\Get-AbrHRZGatewayCert.ps1|Src\Private\Get-AbrHRZHomeSite.ps1|Src\Public\Invoke-ASBuiltReport.VMware.Horizon.ps1|.github\workflows\Release.yml|.vscode\settings.json
+ 2d7d49b3-b010-453c-8a35-22b19f9b7a17
+ 5.1
+
+
+ /home/rebelinux/.local/share/powershell/Modules/AsBuiltReport.VMware.Horizon/1.1.5
+
+
+
diff --git a/1.1.5/README.md b/1.1.5/README.md
new file mode 100644
index 0000000..be2d26c
--- /dev/null
+++ b/1.1.5/README.md
@@ -0,0 +1,208 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Omnissa Horizon As Built Report
+
+Omnissa Horizon As Built Report is a PowerShell module which works in conjunction with [AsBuiltReport.Core](https://github.com/AsBuiltReport/AsBuiltReport.Core).
+
+[AsBuiltReport](https://github.com/AsBuiltReport/AsBuiltReport) is an open-sourced community project which utilises PowerShell to produce as-built documentation in multiple document formats for multiple vendors and technologies.
+
+Please refer to the AsBuiltReport [website](https://www.asbuiltreport.com) for more detailed information about this project.
+
+# :books: Sample Reports
+
+## Sample Report - Custom Style
+
+Sample Omnissa Horizon As Built report HTML file: [Sample VMware Horizon As-Built Report.html](https://htmlpreview.github.io/?https://raw.githubusercontent.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/dev/Samples/Sample%20VMware%20Horizon%20As%20Built%20Report.html)
+
+# :beginner: Getting Started
+
+Below are the instructions on how to install, configure and generate a Onmissa Horizon As Built report.
+
+## :floppy_disk: Supported Versions
+
+The Omnissa Horizon As Built Report supports the following Horizon versions;
+
+- Horizon 8+, 2+**
+
+### PowerShell
+
+This report is compatible with the following PowerShell versions;
+
+| Windows PowerShell 5.1 | PowerShell 7 |
+| :--------------------: | :----------------: |
+| :white_check_mark: | :white_check_mark: |
+
+## :wrench: System Requirements
+
+PowerShell 5.1 or PowerShell 7, and the following PowerShell modules are required for generating a VMware Horizon As Built Report.
+
+- [VMware PowerCLI Module](https://www.powershellgallery.com/packages/VMware.PowerCLI/) version 13.2.0.22643736 or older (VMware removed the "VMware.VimAutomation.HorizonView" in latest versions.)
+- [AsBuiltReport.VMware.Horizon Module](https://www.powershellgallery.com/packages/AsBuiltReport.VMware.Horizon/)
+
+### :closed_lock_with_key: Required Privileges
+
+- A Omnissa Horizon As Built Report can be generated with Administrators(Read only) privileges.
+
+## :package: Module Installation
+
+Open a PowerShell terminal window and install each of the required modules.
+
+:warning: VMware PowerCLI 13.2 is required. Please ensure older PowerCLI versions have been uninstalled.
+
+```powershell
+install-module VMware.PowerCLI -MaximumVersion 13.2.0.22643736 -AllowClobber
+install-module AsBuiltReport.VMware.Horizon
+```
+
+### GitHub
+
+If you are unable to use the PowerShell Gallery, you can still install the module manually. Ensure you repeat the following steps for the [system requirements](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon#wrench-system-requirements) also.
+
+1. Download the code package / [latest release](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/releases/latest) zip from GitHub
+2. Extract the zip file
+3. Copy the folder `AsBuiltReport.VMware.Horizon` to a path that is set in `$env:PSModulePath`.
+4. Open a PowerShell terminal window and unblock the downloaded files with
+ ```powershell
+ $path = (Get-Module -Name AsBuiltReport.VMware.Horizon -ListAvailable).ModuleBase; Unblock-File -Path $path\*.psd1; Unblock-File -Path $path\Src\Public\*.ps1; Unblock-File -Path $path\Src\Private\*.ps1
+ ```
+5. Close and reopen the PowerShell terminal window.
+
+_Note: You are not limited to installing the module to those example paths, you can add a new entry to the environment variable PSModulePath if you want to use another path._
+
+## :pencil2: Configuration
+
+The Omnissa Horizon As Built Report utilizes a JSON file to allow configuration of report information, options, detail and healthchecks.
+
+A Omnissa Horizon report configuration file can be generated by executing the following command;
+
+```powershell
+New-AsBuiltReportConfig -Report VMware.Horizon -FolderPath -Filename
+```
+
+Executing this command will copy the default Omnissa Horizon report JSON configuration to a user specified folder.
+
+All report settings can then be configured via the JSON file.
+
+The following provides information of how to configure each schema within the report's JSON file.
+
+
+### Report
+
+The **Report** schema provides configuration of the Omnissa Horizon report information.
+
+| Sub-Schema | Setting | Default | Description |
+| ------------------- | ------------ | ------------------------------ | ------------------------------------------------------------ |
+| Name | User defined | VMware Horizon As Built Report | The name of the As Built Report |
+| Version | User defined | 1.0 | The report version |
+| Status | User defined | Released | The report release status |
+| ShowCoverPageImage | true / false | true | Toggle to enable/disable the display of the cover page image |
+| ShowTableOfContents | true / false | true | Toggle to enable/disable table of contents |
+| ShowHeaderFooter | true / false | true | Toggle to enable/disable document headers & footers |
+| ShowTableCaptions | true / false | true | Toggle to enable/disable table captions/numbering |
+
+### Options
+
+The **Options** schema allows certain options within the report to be toggled on or off.
+
+
+### InfoLevel
+
+The **InfoLevel** schema allows configuration of each section of the report at a granular level. The following sections can be set.
+
+There are 3 levels (0-3) of detail granularity for each section as follows;
+
+| Setting | InfoLevel | Description |
+| :-----: | ----------------- | -------------------------------------------------------------------- |
+| 0 | Disabled | Does not collect or display any information |
+| 1 | Enabled / Summary | Provides summarized information for a collection of objects |
+| 2 | Adv Summary | Provides condensed, detailed information for a collection of objects |
+
+The table below outlines the default and maximum InfoLevel settings for each UsersandGroups section.
+
+| Sub-Schema | Default Setting | Maximum Setting |
+| --------------------- | :-------------: | :-------------: |
+| Entitlements | 1 | 2 |
+| HomeSiteAssignments | 1 | 1 |
+| UnauthenticatedAccess | 1 | 1 |
+
+The table below outlines the default and maximum InfoLevel settings for each Inventory section.
+
+| Sub-Schema | Default Setting | Maximum Setting |
+| ------------------ | :-------------: | :-------------: |
+| Desktop | 1 | 3 |
+| Applications | 1 | 2 |
+| Farms | 1 | 2 |
+| Machines | 1 | 1 |
+| GlobalEntitlements | 1 | 1 |
+
+The table below outlines the default and maximum InfoLevel settings for each Settings section.
+
+| Sub-Schema | Default Setting | Maximum Setting |
+| -------------------------- | :-------------: | :-------------: |
+| vCenter | 1 | 2 |
+| ESXiHosts | 1 | 2 |
+| DataStores | 1 | 2 |
+| ADDomains | 1 | 1 |
+| UAGServers | 1 | 1 |
+| ConnectionServers | 1 | 2 |
+| InstantCloneDomainAccounts | 1 | 1 |
+| ProductLicensingandUsage | 1 | 2 |
+| GlobalSettings | 1 | 1 |
+| RegisteredMachines | 1 | 2 |
+| AdministratorsandGroups | 1 | 2 |
+| RolePrivileges | 1 | 1 |
+| RolePermissions | 1 | 1 |
+| AccessGroup | 1 | 2 |
+| Cloud Pod | 1 | 2 |
+| Sites | 1 | 2 |
+| EventDatabase | 1 | 1 |
+| Syslog | 1 | 1 |
+| EventstoFileSystem | 1 | 1 |
+
+### Healthcheck
+
+The **Healthcheck** schema is used to toggle health checks on or off.
+
+## :computer: Examples
+
+```powershell
+# Generate a Horizon As Built Report for Horizon Connection Server 'horizon-cs-01.corp.local' using specified credentials. Export report to HTML & DOCX formats. Use default report style. Append timestamp to report filename. Save reports to 'C:\Users\Jon\Documents'
+PS C:\> New-AsBuiltReport -Report VMware.Horizon -Target 'Horizon-cs-01.corp.local' -Username 'administrator@domain.local' -Password 'VMware1!' -Format Html,Word -OutputFolderPath 'C:\Users\Jon\Documents' -Timestamp
+
+# Generate a Horizon As Built Report for Horizon Connection Server 'Horizon-cs-01.corp.local' using specified credentials and report configuration file. Export report to Text, HTML & DOCX formats. Use default report style. Save reports to 'C:\Users\Jon\Documents'. Display verbose messages to the console.
+PS C:\> New-AsBuiltReport -Report VMware.Horizon -Target 'Horizon-cs-01.corp.local' -Username 'administrator@domain.local' -Password 'VMware1!' -Format Text,Html,Word -OutputFolderPath 'C:\Users\Jon\Documents' -ReportConfigFilePath 'C:\Users\Jon\AsBuiltReport\AsBuiltReport.VMware.Horizon.json' -Verbose
+
+# Generate a Horizon As Built Report for Horizon Connection Server 'Horizon-cs-01.corp.local' using stored credentials. Export report to HTML & Text formats. Use default report style. Highlight environment issues within the report. Save reports to 'C:\Users\JOn\Documents'.
+PS C:\> $Creds = Get-Credential
+PS C:\> New-AsBuiltReport -Report VMware.Horizon -Target 'Horizon-cs-01.corp.local' -Credential $Creds -Format Html,Text -OutputFolderPath 'C:\Users\Jon\Documents' -EnableHealthCheck
+
+# Generate a single Horizon As Built Report for Horizon Connection Servers 'Horizon-cs-01.corp.local' and 'Horizon-cs-02.corp.local' using specified credentials. Report exports to WORD format by default. Apply custom style to the report. Reports are saved to the user profile folder by default.
+PS C:\> New-AsBuiltReport -Report VMware.Horizon -Target 'Horizon-cs-01.corp.local','Horizon-cs-02.corp.local' -Username 'administrator@domain.local' -Password 'VMware1!' -StyleFilePath 'C:\Scripts\Styles\MyCustomStyle.ps1'
+
+# Generate a Horizon As Built Report for Horizon Connection Server 'Horizon-cs-01.corp.local' using specified credentials. Export report to HTML & DOCX formats. Use default report style. Reports are saved to the user profile folder by default. Attach and send reports via e-mail.
+PS C:\> New-AsBuiltReport -Report VMware.Horizon -Target 'Horizon-cs-01.corp.local' -Username 'administrator@domain.local' -Password 'VMware1!' -Format Html,Word -OutputFolderPath 'C:\Users\Jon\Documents' -SendEmail
diff --git a/1.1.5/Samples/Sample VMware Horizon As Built Report.html b/1.1.5/Samples/Sample VMware Horizon As Built Report.html
new file mode 100644
index 0000000..ed7dce4
--- /dev/null
+++ b/1.1.5/Samples/Sample VMware Horizon As Built Report.html
@@ -0,0 +1,1212 @@
+
+
+VMware Horizon As Built Report
+
+
+
+
+

+
+
VMware Horizon As Built Report
ACME Inc.
+| Author: | Bugs Bunny |
+| Date: | Friday, November 22, 2024 |
+| Version: | 1.0 |
+
+
+
+
1 HORIZON-CS-01V.PHARMAX.LOCAL
1.1 Executive Summary for HORIZON-CS-01V.PHARMAX.LOCAL
+
+| Number of Local Entitlements | 0 |
+| Number of Global Entitlements | 2 |
+| Number of Desktop Pools | 0 |
+| Number of Application Pool | 0 |
+| Number of Farms Pools | 0 |
+| Number of vCenter Servers | 1 |
+| Number of ESXi Hosts | 0 |
+| Number of Datastores | 0 |
+| Number of Active Directory Domains | 5 |
+| Number of UAG Servers | 2 |
+| Number of Connection Servers | 2 |
+| Number of Instant Clone Accounts | 2 |
+| Number of RDS Hosts | 0 |
+| Number of Administrators and Groups | 8 |
+
+
Table 1 - Executive Summary - HORIZON-CS-01V.PHARMAX.LOCAL
+
2 Users and Groups
The following section provides information about the permissions that control which remote desktops and applications your users can access.
2.1 Home Site
The following section provide a summary of user and group home site configuration.
+| User or Group Name | Domain | Group | Email | Home Site | Global Entitlement | Global Application Entitlement |
+| dbuser | pharmax.local | No | -- | PHARMAX-HQ | -- | -- |
+
+
Table 2 - Home Site General - HORIZON-CS-01V.PHARMAX.LOCAL
+
2.2 Unauthenticated Access
The following section provide a summary of user and group unauthenticated access configuration.
+| Login Name | User ID | Description | Hybrid Logon | Pod Name |
+| 2254824036SA | pharmax.local\2254824036SA | -- | -- | Cluster-HORIZON-CS-01V |
+| 447284480SA | pharmax.local\447284480SA | -- | -- | Cluster-HORIZON-CS-01V |
+
+
Table 3 - Unauthenticated Access - HORIZON-CS-01V.PHARMAX.LOCAL
+
3 Inventory
The following section provides detailed information about desktop, application, farm pools and global entitlement permissions that control which remote desktops and applications your users can access.
3.1 Global Entitlements
The following section details the Global Entitlements configuration for HORIZON-CS-01V.PHARMAX.LOCAL server.
+| Name | Type | Number of Pods |
+| APPVol-FARM | -- | 0 |
+| GEZ-Linux | -- | 0 |
+| Group-Ent | -- | 0 |
+
+
Table 4 - Global Entitlements - HORIZON-CS-01V.PHARMAX.LOCAL
+
3.1.1 Global Entitlement Summary Details
3.1.1.1 Summary - Group-Ent
+
+| Display Name | Group-Ent |
+| Alias Name | Group Entitlement |
+| Description | -- |
+| Scope | SITE |
+| From Home Site | Yes |
+| Require Home Site | Yes |
+| Multiple Session Auto Clean | No |
+| Enabled | Yes |
+| Supported Display Protocols | PCOIP, BLAST, RDP |
+| Default Display Protocol | BLAST |
+| Allow Users to Choose Display Protocol | Yes |
+| Allow User to Reset Machines | Yes |
+| Enable HTML Access | Yes |
+| Allow Multiple Sessions Per User | No |
+| Enable Pre-Launch | -- |
+| Connection Server Restrictions | -- |
+| Enable Prelaunch | -- |
+| Category Folder Name | -- |
+| Client Restrictions | Yes |
+| Enable Collaboration | Yes |
+| Shortcut Locations | -- |
+| Multisession Mode | -- |
+| Backup GAE | -- |
+| Display Assigned Machine Name | No |
+| Display Machine Alias | No |
+| Global Access Group ID | Root |
+
+
Table 5 - Detailed Information - Group-Ent
+
3.1.1.2 Local Pools - Group-Ent
+
+| Local Desktop Count | 0 |
+| Local Application Count | -- |
+| Remote Desktop Count | 0 |
+| Remote Application Count | -- |
+| User Count | 0 |
+| User or Group Count | 2 |
+| User or Group Site Override Count | 0 |
+| Member Pods | -- |
+
+
Table 6 - Local Pools - HORIZON-CS-01V.PHARMAX.LOCAL
+
3.1.1.3 Users and Groups - Group-Ent
+| Name | User or Group | Domain |
+| SCCM_Admins | Group | pharmax.local |
+| AD - SRM Admin Group | Group | pharmax.local |
+
+
Table 7 - Users and Groups - Group-Ent
+
3.1.1.4 Summary - GEZ-Linux
+
+| Display Name | GEZ-Linux |
+| Alias Name | GEZ Linux |
+| Description | -- |
+| Scope | ANY |
+| From Home Site | No |
+| Require Home Site | No |
+| Multiple Session Auto Clean | No |
+| Enabled | Yes |
+| Supported Display Protocols | PCOIP, BLAST, RDP |
+| Default Display Protocol | PCOIP |
+| Allow Users to Choose Display Protocol | Yes |
+| Allow User to Reset Machines | No |
+| Enable HTML Access | Yes |
+| Allow Multiple Sessions Per User | No |
+| Enable Pre-Launch | -- |
+| Connection Server Restrictions | -- |
+| Enable Prelaunch | -- |
+| Category Folder Name | -- |
+| Client Restrictions | No |
+| Enable Collaboration | No |
+| Shortcut Locations | -- |
+| Multisession Mode | -- |
+| Backup GAE | -- |
+| Display Assigned Machine Name | No |
+| Display Machine Alias | No |
+| Global Access Group ID | Root |
+
+
Table 8 - Detailed Information - GEZ-Linux
+
3.1.1.5 Local Pools - GEZ-Linux
+
+| Local Desktop Count | 0 |
+| Local Application Count | -- |
+| Remote Desktop Count | 0 |
+| Remote Application Count | -- |
+| User Count | 1 |
+| User or Group Count | 2 |
+| User or Group Site Override Count | 0 |
+| Member Pods | -- |
+
+
Table 9 - Local Pools - HORIZON-CS-01V.PHARMAX.LOCAL
+
3.1.1.6 Users and Groups - GEZ-Linux
+| Name | User or Group | Domain |
+| Jonathan A. Colon Feliciano | User | pharmax.local |
+| AD - SRM Recovery Group | Group | pharmax.local |
+
+
Table 10 - Users and Groups - GEZ-Linux
+
3.1.1.7 Summary - APPVol-FARM
+
+| Display Name | APPVol-FARM |
+| Alias Name | APPVol-FARM |
+| Description | -- |
+| Scope | ANY |
+| From Home Site | No |
+| Require Home Site | No |
+| Multiple Session Auto Clean | No |
+| Enabled | Yes |
+| Supported Display Protocols | PCOIP, BLAST |
+| Default Display Protocol | PCOIP |
+| Allow Users to Choose Display Protocol | Yes |
+| Allow User to Reset Machines | -- |
+| Enable HTML Access | Yes |
+| Allow Multiple Sessions Per User | -- |
+| Enable Pre-Launch | No |
+| Connection Server Restrictions | -- |
+| Enable Prelaunch | No |
+| Category Folder Name | -- |
+| Client Restrictions | No |
+| Enable Collaboration | -- |
+| Shortcut Locations | -- |
+| Multisession Mode | ENABLED_DEFAULT_OFF |
+| Backup GAE | -- |
+| Display Assigned Machine Name | -- |
+| Display Machine Alias | -- |
+| Global Access Group ID | Root |
+
+
Table 11 - Detailed Information - APPVol-FARM
+
3.1.1.8 Local Pools - APPVol-FARM
+
+| Local Desktop Count | -- |
+| Local Application Count | 0 |
+| Remote Desktop Count | -- |
+| Remote Application Count | 0 |
+| User Count | 1 |
+| User or Group Count | 3 |
+| User or Group Site Override Count | 0 |
+| Member Pods | -- |
+
+
Table 12 - Local Pools - HORIZON-CS-01V.PHARMAX.LOCAL
+
3.1.1.9 Users and Groups - APPVol-FARM
+| Name | User or Group | Domain |
+| Jonathan A. Colon Feliciano | User | pharmax.local |
+| Administrators | Group | pharmax.local |
+| Backup Operators | Group | pharmax.local |
+
+
Table 13 - Users and Groups - APPVol-FARM
+
4 Settings
The following section provides detailed information about the configuration of the components that comprise the Horizon Server infrastructure.
4.1 Servers
4.1.1 vCenter Servers
The following section details the vCenter Servers configuration for HORIZON-CS-01V.PHARMAX.LOCAL server.
+| Name | Version | Build Number | API Version | Provisioning Enabled |
+| vcenter-01v.pharmax.local | -- | -- | -- | Yes |
+
+
Table 14 - vCenter - HORIZON-CS-01V
+
4.1.1.1 vcenter-01v.pharmax.local
+
+| Name | vcenter-01v.pharmax.local |
+| Description | -- |
+| Certificate Override | -- |
+| Provisioning Enabled | Yes |
+| Reclaim Disk Space | Yes |
+| Port | 443 |
+| User SSL | Yes |
+| User Name | administrator@vsphere.local |
+| Type | VIRTUAL_CENTER |
+| TCP Port Number | 443 |
+| Max Concurrent Provisioning Operations | 20 |
+| Max Concurrent Power Operations | 50 |
+| Max Concurrent View Composer Maintenance Operations | 0 |
+| Max Concurrent View Composer Provisioning Operations | 12 |
+| Max Concurrent Instant Clone Engine Provisioning Operations | 20 |
+| Storage Acceleration Enabled | Yes |
+| Storage Accelerator Default Cache Size | 1024MB |
+
+
Table 15 - vCenter Server Details - vcenter-01v.pharmax.local
+
Storage Accelerator Overrides
+| Datacenter | Cluster | Host | Cache Size |
+| PHARMAX-VSI-DC | RegionB01-vSAN | vsan-01b.pharmax.local | 2048MB |
+| PHARMAX-VSI-DC | RegionHQ-MGMT | esxsvr-00f.pharmax.local | 4096MB |
+
+
Table 16 - Storage Accelerator Overrides - vcenter-01v.pharmax.local
+
4.1.2 ESXi Hosts
The following section details the hardware information of ESXi Hosts for HORIZON-CS-01V.PHARMAX.LOCAL server.
4.1.3 Gateway Servers
The following section details the Gateway Servers information for HORIZON-CS-01V.PHARMAX.LOCAL.
+| Name | IP | Version | Type | Zone Internal |
+| Horizon-UAG-01V | -- | -- | -- | No |
+| Horizon-UAG-02V | -- | -- | -- | No |
+
+
Table 17 - Gateway Servers - HORIZON-CS-01V.PHARMAX.LOCAL
+
4.1.4 Connection Servers
The following section details the configuration of Connection Servers for HORIZON-CS-01V.PHARMAX.LOCAL server.
+| Name | Version | Enabled |
+| HORIZON-CS-01V | 8.13.0-10070698069 | Yes |
+| HORIZON-CS-02V | 8.13.0-10070698069 | Yes |
+
+
Table 18 - Connection Servers - HORIZON-CS-01V.PHARMAX.LOCAL
+
4.1.4.1 General HORIZON-CS-01V Details
+
+| Name | HORIZON-CS-01V |
+| FQDN | Horizon-CS-01V.pharmax.local |
+| Server Address | https://horizon-cs-01v.pharmax.local:443 |
+| Version | 8.13.0-10070698069 |
+| Enabled | Yes |
+| Tags | -- |
+| External URL | https://Horizon-CS-01V.pharmax.local:443 |
+| External PCoIP URL | 192.168.7.202:4172 |
+| Auxiliary External PCoIP IPv4 Address | -- |
+| External App Blast URL | https://Horizon-CS-01V.pharmax.local:8443 |
+| Local Connection Server | Yes |
+| Bypass Tunnel | No |
+| Bypass PCoIP Gateway | Yes |
+| Bypass App Blast Gateway | No |
+| IP Mode | IPv4 |
+| FIPs Mode Enabled | No |
+| Replication Status | OK |
+| Current CPU Usage Percentage | 11% |
+| Current Memory Usage Percentage | 89% |
+
+
Table 19 - Connection Servers - HORIZON-CS-01V
+
4.1.4.2 Authentication HORIZON-CS-01V Details
+
+| Smart Card Support | OPTIONAL |
+| Log off When Smart Card Removed | No |
+| RSA Secure ID Enabled | No |
+| RSA Secure ID Name Mapping | No |
+| RSA Secure ID Clear Node Secret | No |
+| RSA Secure ID Security File Data | -- |
+| RSA Secure ID Security File Uploaded | No |
+| Radius Enabled | No |
+| Radius Authenticator | -- |
+| Radius Name Mapping | No |
+| Radius SSO | No |
+| SAML Support | DISABLED |
+| SAML Authenticator | -- |
+| SAML Authenticator Description | -- |
+| SAML Trigger Mode | -- |
+| SAML Password Mode | -- |
+| SAML Authenticator Type | -- |
+| SAML Metadata URL | -- |
+| SAML Administrator URL | -- |
+| SAML Static Meta Data | -- |
+| Unauthenticated Access Config Enabled | No |
+| Unauthenticated Access Default User | -- |
+| Unauthenticated Access User Idle Timeout | 10 |
+| Unauthenticated Access Client Puzzle Difficulty | 21 |
+| Block Unsupported Clients | No |
+
+
Table 20 - Authentication - HORIZON-CS-01V
+
4.1.4.3 Backup HORIZON-CS-01V Details
+
+| Automatic Backup Frequency | Every day |
+| Max Number of Backups | 10 |
+| Last Backup Time | 12/15/2023 00:00:10 |
+| Last Backup Status | OK |
+| Folder Location | C:\ProgramData\VMware\VDM\backups |
+
+
Table 21 - Backup - HORIZON-CS-01V
+
4.1.4.4 Certificate Details for HORIZON-CS-01V Details
+
+| Connection Server | HORIZON-CS-01V |
+| Self-Signed Certificate | No |
+| Certificate Subject | CN=Horizon-CS-01V, OU=IT, O=PHARMAX, L=CAYEY, S=PR, C=US |
+| Certificate Issuer | CN=pharmax-SERVER-DC-01V-CA, DC=pharmax, DC=local |
+| Certificate Not Before | 04/10/2023 11:03:20 |
+| Certificate Not After | 01/25/2025 19:45:15 |
+| Certificate SANs | Horizon-CS-01V.pharmax.local, Horizon-CS-00V.pharmax.local |
+| Certificate Thumbprint | A9470E4EBEED26CB71BD870E6E1E4607809E5122 |
+
+
Table 22 - Certificate Details for - HORIZON-CS-01V
+
4.1.4.5 Replication Status for Connection Server HORIZON-CS-01V
+
+| Connection Server | HORIZON-CS-01V |
+| Replication Partner | HORIZON-CS-02V |
+| Status | OK |
+| Message | No Replication Issues |
+
+
Table 23 - Connection Servers Replication- HORIZON-CS-01V
+
4.1.4.6 General HORIZON-CS-02V Details
+
+| Name | HORIZON-CS-02V |
+| FQDN | Horizon-CS-02V.pharmax.local |
+| Server Address | https://horizon-cs-02v.pharmax.local:443 |
+| Version | 8.13.0-10070698069 |
+| Enabled | Yes |
+| Tags | -- |
+| External URL | https://Horizon-CS-02V.pharmax.local:443 |
+| External PCoIP URL | 192.168.7.63:4172 |
+| Auxiliary External PCoIP IPv4 Address | -- |
+| External App Blast URL | https://Horizon-CS-02V.pharmax.local:8443 |
+| Local Connection Server | No |
+| Bypass Tunnel | No |
+| Bypass PCoIP Gateway | Yes |
+| Bypass App Blast Gateway | No |
+| IP Mode | IPv4 |
+| FIPs Mode Enabled | No |
+| Replication Status | OK |
+| Current CPU Usage Percentage | 4% |
+| Current Memory Usage Percentage | 78% |
+
+
Table 24 - Connection Servers - HORIZON-CS-02V
+
4.1.4.7 Authentication HORIZON-CS-02V Details
+
+| Smart Card Support | OPTIONAL |
+| Log off When Smart Card Removed | No |
+| RSA Secure ID Enabled | No |
+| RSA Secure ID Name Mapping | No |
+| RSA Secure ID Clear Node Secret | No |
+| RSA Secure ID Security File Data | -- |
+| RSA Secure ID Security File Uploaded | No |
+| Radius Enabled | No |
+| Radius Authenticator | -- |
+| Radius Name Mapping | No |
+| Radius SSO | No |
+| SAML Support | DISABLED |
+| SAML Authenticator | -- |
+| SAML Authenticator Description | -- |
+| SAML Trigger Mode | -- |
+| SAML Password Mode | -- |
+| SAML Authenticator Type | -- |
+| SAML Metadata URL | -- |
+| SAML Administrator URL | -- |
+| SAML Static Meta Data | -- |
+| Unauthenticated Access Config Enabled | No |
+| Unauthenticated Access Default User | -- |
+| Unauthenticated Access User Idle Timeout | 10 |
+| Unauthenticated Access Client Puzzle Difficulty | 21 |
+| Block Unsupported Clients | No |
+
+
Table 25 - Authentication - HORIZON-CS-02V
+
4.1.4.8 Backup HORIZON-CS-02V Details
+
+| Automatic Backup Frequency | Every day |
+| Max Number of Backups | 10 |
+| Last Backup Time | 12/15/2023 00:00:10 |
+| Last Backup Status | OK |
+| Folder Location | C:\ProgramData\VMware\VDM\backups |
+
+
Table 26 - Backup - HORIZON-CS-02V
+
4.1.4.9 Certificate Details for HORIZON-CS-02V Details
+
+| Connection Server | HORIZON-CS-02V |
+| Self-Signed Certificate | Yes |
+| Certificate Subject | CN=Horizon-CS-02V.pharmax.local, OU=VMware Horizon View default certificate, O="VMware, Inc." |
+| Certificate Issuer | CN=Horizon-CS-02V.pharmax.local, OU=VMware Horizon View default certificate, O="VMware, Inc." |
+| Certificate Not Before | 04/10/2023 12:19:45 |
+| Certificate Not After | 07/13/2025 12:19:45 |
+| Certificate SANs | Horizon-CS-02V.pharmax.local |
+| Certificate Thumbprint | B9AE51BC10F4D3FDE367640A687DB24032290C9D |
+
+
Table 27 - Certificate Details for - HORIZON-CS-02V
+
4.1.4.10 Replication Status for Connection Server HORIZON-CS-02V
+
+| Connection Server | HORIZON-CS-02V |
+| Replication Partner | HORIZON-CS-01V |
+| Status | OK |
+| Message | No Replication Issues |
+
+
Table 28 - Connection Servers Replication- HORIZON-CS-02V
+
4.1.5 Gateway Certificate
The following section details on the gateway certificate information for HORIZON-CS-01V.PHARMAX.LOCAL.
+
+| Certificate Name | uag-01 |
+| Common Name | OU=self-signed, CN=192.168.1.17 |
+| Issuer | OU=self-signed, CN=192.168.1.17 |
+| Expiry Date | 03/23/2026 10:08:00 |
+| Serial Number | 72012228190 |
+
+
Table 29 - Gateway Certificate - HORIZON-CS-01V.PHARMAX.LOCAL
+
4.2 Domains
4.2.1 Domain Accounts
The following section details the Domain Accounts configuration for HORIZON-CS-01V.PHARMAX.LOCAL server.
+| User Name | Domain Name |
+| horizon-ic | pharmax.local |
+| jocolon | pharmax.local |
+
+
Table 30 - Domain Accounts - HORIZON-CS-01V.PHARMAX.LOCAL
+
4.2.2 Connection Server Domain Status
The following section shows connection servers domains for HORIZON-CS-01V.PHARMAX.LOCAL environment.
+| Domain DNS Name | Status | Trust Relationship | Connection Status |
+| pharmax.local | OK | PRIMARYDOMAIN | FULLYACCESSIBLE |
+| uia.local | ERROR | TWOWAY | UNCONTACTABLE |
+| lab.local | ERROR | TWOWAY | UNCONTACTABLE |
+| acad.pharmax.local | ERROR | TWOWAY_FOREST | UNCONTACTABLE |
+| b12.local | ERROR | FROMBROKER | UNCONTACTABLE |
+
+
Table 31 - Connection Server Domain Status- HORIZON-CS-01V.PHARMAX.LOCAL
+
4.3 Certificate Management
The following section details on the certificate management information for HORIZON-CS-01V.PHARMAX.LOCAL.
+
+| Self-Signed Certificate | No |
+| Certificate Subject | CN=Horizon-CS-01V, OU=IT, O=PHARMAX, L=CAYEY, S=PR, C=US |
+| Certificate Issuer | CN=pharmax-SERVER-DC-01V-CA, DC=pharmax, DC=local |
+| Certificate Not Before | 04/10/2023 11:03:20 |
+| Certificate Not After | 01/25/2025 19:45:15 |
+| Certificate SANs | Horizon-CS-01V.pharmax.local Horizon-CS-00V.pharmax.local |
+| Certificate Thumbprint | A9470E4EBEED26CB71BD870E6E1E4607809E5122 |
+
+
Table 32 - Certificate Management - HORIZON-CS-01V.PHARMAX.LOCAL
+
4.4 Product Licensing and Usage
The following section details the product license and usage information for HORIZON-CS-01V.PHARMAX.LOCAL server.
4.4.1 Licensing
+
+| Is Licensed | No |
+| License Key | Z428Q-XXXXX-XXXXX-XXXXX-C9K30 |
+| License Expiration | 4/10/2024 |
+| Composer enabled | No |
+| Desktop Launching enabled | Yes |
+| Application Launching enabled | Yes |
+| Instant Clone enabled | Yes |
+| Helpdesk enabled | Yes |
+| Collaboration enabled | Yes |
+| License Edition | HORIZON_ENTERPRISE_CONCURRENT_USER |
+| License Usage Model | CONCURRENT_USER |
+| License Mode | DEFAULT |
+| Grace Period Days | -196 |
+| Subscription Slice Expiry | -- |
+| License Health | -- |
+
+
Table 33 - Licensing - HORIZON-CS-01V.PHARMAX.LOCAL
+
4.4.2 Usage
+| Name | Current Usage | Highest Usage |
+| Total Concurrent Connections | 0 | 1 |
+| Total Named Users | 17 | -- |
+| Total Concurrent Sessions | 0 | 1 |
+| Concurrent Full Vm Sessions | 0 | 1 |
+| Concurrent Linked Clone Sessions | 0 | 0 |
+| Concurrent Unmanaged Vm Sessions | 0 | 1 |
+| Concurrent Application Sessions | 0 | 1 |
+| Concurrent Collaborative Sessions | 0 | 0 |
+| Total Collaborators | 0 | 0 |
+
+
Table 34 - Usage - HORIZON-CS-01V.PHARMAX.LOCAL
+
4.4.3 Customer Experience Program
+
+| CEIP Enabled | Yes |
+| Company Size | SIZE_1_100 |
+| Geolocation | AMERICA_NORTH |
+| Vertical | SERVICES |
+
+
Table 35 - Customer Experience Program - HORIZON-CS-01V.PHARMAX.LOCAL
+
4.5 Global Settings
The following section details the Global Settings configuration for HORIZON-CS-01V.PHARMAX.LOCAL server.
4.5.1 General Settings
+
+| Client Session Time Out Policy | NEVER |
+| Client Max Session Time Minutes | 600 |
+| Client Idle Session Timeout Policy | NEVER |
+| Client Idle Session Timeout Minutes | -- |
+| Client Session Timeout Minutes | 1200 |
+| Desktop SSO Timeout Policy | ALWAYS_ENABLED |
+| Desktop SSO Timeout Minutes | -- |
+| Application SSO Timeout Policy | ALWAYS_ENABLED |
+| Application SSO Timeout Minutes | -- |
+| View API Session Timeout Minutes | 10 |
+| Pre-Login Message | -- |
+| Display Warning Before Forced Logoff | Yes |
+| Forced Logoff Timeout Minutes | 5 |
+| Forced Logoff Message | Your desktop is scheduled for an important update and will shut down in 5 minutes. Please save any unsaved work now |
+| Enable Server in Single User Mode | No |
+| Store CAL on Broker | Yes |
+| Store CAL on Client | Yes |
+| Enable UI User Name Caching | Yes |
+| Console Session Timeout in Minutes | 30 |
+| Enable Automatic Status Updates | No |
+| Send Domain List | Yes |
+| Enable Credential Cleanup for HTML Access | No |
+| Hide Server Information In Client | No |
+| Hide Domain List In Client | No |
+| Enable Multi Factor Reauthentication | No |
+| Disconnect Warning Time | 0 |
+| Disconnect Warning Message | Your virtual session is going to be logged off. Please save your work. |
+| Disconnect Message | Your session has expired. Please re-connect to the portal and restart the session. |
+| Display Pre-login Admin Banner | No |
+| Pre-Login Admin Banner Header | Attention |
+| Pre-Login Admin Banner Message | On proceeding, you agree that you fully comply with the laws of this organisation. |
+| Enforce CSRF Protection | -- |
+| Enforce E2E Encryption | No |
+
+
Table 36 - Global Settings - HORIZON-CS-01V.PHARMAX.LOCAL
+
4.5.2 Security Settings
+
+| Reauthenticate Secure Tunnel After Interruption | No |
+| Disallow Enhanced Security Mode | No |
+| No Managed Certs | No |
+| Message Security Mode | ENHANCED |
+| Message Security Status | ENHANCED |
+| Enable IP Sec for Security Server Pairing | No |
+
+
Table 37 - Security Settings - HORIZON-CS-01V.PHARMAX.LOCAL
+
4.5.3 Client Restriction Settings
+| Type | Version | Warn Specific Versions | Block Specific Versions |
+| WINDOWS | -- | 5.5.0 | -- |
+| CHROME | -- | 5.5.0 | -- |
+| ANDROID | -- | 5.5.0 | -- |
+| IOS | -- | 5.5.0 | -- |
+| MAC | -- | 5.5.0 | -- |
+
+
Table 38 - Client Restriction Settings - HORIZON-CS-01V.PHARMAX.LOCAL
+
4.6 Administrators
4.6.1 Administrators and Groups
The following section details the configuration of Administrators and Groups for HORIZON-CS-01V.PHARMAX.LOCAL server.
+| Display Name | Type | Permission Role |
+| pharmax.local\12-051-distlist1 | Group | Local, Administrators, (Read, only) |
+| pharmax.local\4256122656SA | User | Inventory, Administrators |
+| pharmax.local\4362712809SA | User | Inventory, Administrators, (Read, only) |
+| pharmax.local\AD - SRM Admin Group | Group | Inventory, Administrators |
+| pharmax.local\Administrator | User | Administrators, |
+| pharmax.local\Domain Admins | Group | PHARMAX-God-Admin, |
+| pharmax.local\horizon-ic | User | Administrators, (Read, only), |
+| pharmax.local\jocolon | User | Local, Administrators, , Help, Desk, Inventory |
+
+
Table 39 - Administrators and Groups - HORIZON-CS-01V.PHARMAX.LOCAL
+
4.6.1.1 Administrators Users and Groups Details for Jonathan A. Colon Feliciano
Jonathan A. Colon Feliciano
+
+| Name | Jonathan A. Colon Feliciano |
+| First Name | Jonathan |
+| Last Name | Colon Feliciano |
+| Login Name | jocolon |
+| Display Name | pharmax.local\jocolon |
+| Long Display Name | jocolon@pharmax.local (Jonathan A. Colon Feliciano) |
+| Is Assignment a Group of User | User |
+| Domain | pharmax.local |
+| AD Distinguished Name | CN=Jonathan A. Colon Feliciano,CN=Users,DC=pharmax,DC=local |
+| Email | jocolon@pharmax.local |
+| Kiosk User | No |
+| Un-Authenticated User | -- |
+| Phone Number | -- |
+| Description | -- |
+| in Folder | -- |
+| UPN | jocolon@pharmax.local |
+| Permission Role | Local, Administrators, , Help, Desk, Inventory |
+
+
Table 40 - Administrator - Jonathan A. Colon Feliciano
+
4.6.1.2 Administrators Users and Groups Details for Administrator
Administrator
+
+| Name | Administrator |
+| First Name | -- |
+| Last Name | -- |
+| Login Name | Administrator |
+| Display Name | pharmax.local\Administrator |
+| Long Display Name | Administrator@pharmax.local (Administrator) |
+| Is Assignment a Group of User | User |
+| Domain | pharmax.local |
+| AD Distinguished Name | CN=Administrator,CN=Users,DC=pharmax,DC=local |
+| Email | -- |
+| Kiosk User | No |
+| Un-Authenticated User | -- |
+| Phone Number | -- |
+| Description | -- |
+| in Folder | -- |
+| UPN | Administrator@pharmax.local |
+| Permission Role | Administrators, |
+
+
Table 41 - Administrator - Administrator
+
4.6.1.3 Administrators Users and Groups Details for Domain Admins
Domain Admins
+
+| Name | Domain Admins |
+| First Name | -- |
+| Last Name | -- |
+| Login Name | Domain Admins |
+| Display Name | pharmax.local\Domain Admins |
+| Long Display Name | Domain Admins/pharmax.local |
+| Is Assignment a Group of User | Group |
+| Domain | pharmax.local |
+| AD Distinguished Name | CN=Domain Admins,CN=Users,DC=pharmax,DC=local |
+| Email | -- |
+| Kiosk User | No |
+| Un-Authenticated User | -- |
+| Phone Number | -- |
+| Description | -- |
+| in Folder | -- |
+| UPN | -- |
+| Permission Role | PHARMAX-God-Admin, |
+
+
Table 42 - Administrator - Domain Admins
+
4.6.1.4 Administrators Users and Groups Details for 12-051-distlist1
12-051-distlist1
+
+| Name | 12-051-distlist1 |
+| First Name | -- |
+| Last Name | -- |
+| Login Name | 12-051-distlist1 |
+| Display Name | pharmax.local\12-051-distlist1 |
+| Long Display Name | 12-051-distlist1/pharmax.local |
+| Is Assignment a Group of User | Group |
+| Domain | pharmax.local |
+| AD Distinguished Name | CN=12-051-distlist1,OU=Devices,OU=ESM,OU=Tier 1,DC=pharmax,DC=local |
+| Email | -- |
+| Kiosk User | No |
+| Un-Authenticated User | -- |
+| Phone Number | -- |
+| Description | -- |
+| in Folder | -- |
+| UPN | -- |
+| Permission Role | Local, Administrators, (Read, only) |
+
+
Table 43 - Administrator - 12-051-distlist1
+
4.6.1.5 Administrators Users and Groups Details for 4362712809SA
4362712809SA
+
+| Name | 4362712809SA |
+| First Name | -- |
+| Last Name | 4362712809SA |
+| Login Name | 4362712809SA |
+| Display Name | pharmax.local\4362712809SA |
+| Long Display Name | 4362712809SA@pharmax.local (4362712809SA) |
+| Is Assignment a Group of User | User |
+| Domain | pharmax.local |
+| AD Distinguished Name | CN=4362712809SA,OU=Test,OU=AWS,OU=Tier 2,DC=pharmax,DC=local |
+| Email | -- |
+| Kiosk User | No |
+| Un-Authenticated User | -- |
+| Phone Number | -- |
+| Description | -- |
+| in Folder | -- |
+| UPN | 4362712809SA@pharmax.local |
+| Permission Role | Inventory, Administrators, (Read, only) |
+
+
Table 44 - Administrator - 4362712809SA
+
4.6.1.6 Administrators Users and Groups Details for AD - SRM Admin Group
AD - SRM Admin Group
+
+| Name | AD - SRM Admin Group |
+| First Name | -- |
+| Last Name | -- |
+| Login Name | AD - SRM Admin Group |
+| Display Name | pharmax.local\AD - SRM Admin Group |
+| Long Display Name | AD - SRM Admin Group/pharmax.local |
+| Is Assignment a Group of User | Group |
+| Domain | pharmax.local |
+| AD Distinguished Name | CN=AD - SRM Admin Group,CN=Users,DC=pharmax,DC=local |
+| Email | -- |
+| Kiosk User | No |
+| Un-Authenticated User | -- |
+| Phone Number | -- |
+| Description | -- |
+| in Folder | -- |
+| UPN | -- |
+| Permission Role | Inventory, Administrators |
+
+
Table 45 - Administrator - AD - SRM Admin Group
+
4.6.1.7 Administrators Users and Groups Details for VMware IC Account
VMware IC Account
+
+| Name | VMware IC Account |
+| First Name | VMware IC Account |
+| Last Name | -- |
+| Login Name | horizon-ic |
+| Display Name | pharmax.local\horizon-ic |
+| Long Display Name | horizon-ic@pharmax.local (VMware IC Account) |
+| Is Assignment a Group of User | User |
+| Domain | pharmax.local |
+| AD Distinguished Name | CN=VMware IC Account,CN=Users,DC=pharmax,DC=local |
+| Email | -- |
+| Kiosk User | No |
+| Un-Authenticated User | -- |
+| Phone Number | -- |
+| Description | -- |
+| in Folder | -- |
+| UPN | horizon-ic@pharmax.local |
+| Permission Role | Administrators, (Read, only), |
+
+
Table 46 - Administrator - VMware IC Account
+
4.6.1.8 Administrators Users and Groups Details for 4256122656SA
4256122656SA
+
+| Name | 4256122656SA |
+| First Name | -- |
+| Last Name | 4256122656SA |
+| Login Name | 4256122656SA |
+| Display Name | pharmax.local\4256122656SA |
+| Long Display Name | 4256122656SA@pharmax.local (4256122656SA) |
+| Is Assignment a Group of User | User |
+| Domain | pharmax.local |
+| AD Distinguished Name | CN=4256122656SA,OU=Test,OU=AWS,OU=Tier 2,DC=pharmax,DC=local |
+| Email | -- |
+| Kiosk User | No |
+| Un-Authenticated User | -- |
+| Phone Number | -- |
+| Description | -- |
+| in Folder | -- |
+| UPN | 4256122656SA@pharmax.local |
+| Permission Role | Inventory, Administrators |
+
+
Table 47 - Administrator - 4256122656SA
+
4.6.2 Role Privileges
The following section details the Role Privileges information for HORIZON-CS-01V.PHARMAX.LOCAL server.
+| Name | Description |
+| Administrators | Administration users with full administrative rights |
+| Administrators (Read only) | Administration users with full read-only administrative rights |
+| Agent Registration Administrators | Administration users with rights to register View agents. |
+| Global Configuration and Policy Administrators | Administration users with rights for global and per Connection Server configuration settings. |
+| Global Configuration and Policy Administrators (Read Only) | Administration users with read only rights for global and per Connection Server configuration settings. |
+| Help Desk Administrators | Administration users with rights for Help Desk portal management. |
+| Help Desk Administrators (Read Only) | Administration users with rights for Help Desk portal view. |
+| Horizon Cloud Service | Allows subscription license activation and monitoring from horizon cloud. |
+| Inventory Administrators | Administration users with rights for inventory management. |
+| Inventory Administrators (Read only) | Administration users with rights to read inventory. |
+| Local Administrators | Administration users with rights on Local POD. |
+| Local Administrators (Read only) | Administration users with Read only rights on Local POD. |
+| PHARMAX-God-Admin | -- |
+
+
Table 48 - Role Privileges - HORIZON-CS-01V.PHARMAX.LOCAL
+
4.6.3 Role Privileges Details
The following section details the Role Privilege details for information for HORIZON-CS-01V.PHARMAX.LOCAL server.
+| Name | Description |
+| Administrators | ADMINISTRATOR
+ADMINISTRATOR_VIEW
+CAPACITY_PROVIDER_CONFIG_MANAGEMENT
+CAPACITY_PROVIDER_CONFIG_VIEW
+CLOUD_ADMIN
+CLOUD_ON_BOARDING_MANAGEMENT
+CLOUD_OPS_MANAGEMENT
+CVP_INTERACTIVE
+CVP_MANAGEMENT
+CVP_OWNERSHIP
+CVP_VIEW
+FEDERATED_LDAP_MANAGE
+FEDERATED_LDAP_VIEW
+FEDERATED_SESSIONS_MANAGE
+FEDERATED_SESSIONS_VIEW
+FOLDER_MANAGEMENT
+FOLDER_VIEW
+GLOBAL_ADMINISTRATOR
+GLOBAL_ADMINISTRATOR_VIEW
+GLOBAL_ADMIN_SDK_INTERACTIVE
+GLOBAL_ADMIN_UI_INTERACTIVE
+GLOBAL_CONFIG_MANAGEMENT
+GLOBAL_CONFIG_VIEW
+GLOBAL_CVP_PUBLICATION
+GLOBAL_CVP_REGISTER
+GLOBAL_MACHINE_REGISTER
+GLOBAL_PERMISSION_MANAGEMENT
+GLOBAL_PERMISSION_VIEW
+GLOBAL_ROLE_MANAGEMENT
+GLOBAL_ROLE_PERMISSION_MANAGEMENT
+GLOBAL_ROLE_VIEW
+HELPDESK_ADMINISTRATOR
+HELPDESK_ADMINISTRATOR_VIEW
+HORIZON_CLOUD_SERVICE
+INVENTORY_ADMINISTRATOR
+INVENTORY_ADMINISTRATOR_VIEW
+LOCAL_ADMINISTRATOR
+LOCAL_ADMINISTRATOR_VIEW
+MACHINE_MAINTENANCE
+MACHINE_MANAGEMENT
+MACHINE_MANAGE_OFFLINE_SESSION
+MACHINE_MANAGE_VDI_SESSION
+MACHINE_REBOOT
+MACHINE_SHUTDOWN
+MACHINE_USER_MANAGEMENT
+MACHINE_VIEW
+MANAGE_REMOTE_PROCESS
+POOL_ENABLE
+POOL_ENTITLE
+POOL_MANAGEMENT
+POOL_SVI_IMAGE_MANAGEMENT
+POOL_VIEW
+REMOTE_ASSISTANCE
+SUBSCRIPTION_LICENSE_ADD
+UDD_MANAGEMENT
+UDD_VIEW
+VC_CONFIG_VIEW |
+| Administrators (Read only) | ADMINISTRATOR_VIEW
+CAPACITY_PROVIDER_CONFIG_VIEW
+CVP_VIEW
+FEDERATED_LDAP_VIEW
+FEDERATED_SESSIONS_VIEW
+FOLDER_VIEW
+GLOBAL_ADMINISTRATOR_VIEW
+GLOBAL_ADMIN_SDK_INTERACTIVE
+GLOBAL_ADMIN_UI_INTERACTIVE
+GLOBAL_CONFIG_VIEW
+GLOBAL_PERMISSION_VIEW
+GLOBAL_ROLE_VIEW
+HELPDESK_ADMINISTRATOR_VIEW
+INVENTORY_ADMINISTRATOR_VIEW
+LOCAL_ADMINISTRATOR_VIEW
+MACHINE_VIEW
+POOL_VIEW
+UDD_VIEW
+VC_CONFIG_VIEW |
+| Agent Registration Administrators | GLOBAL_MACHINE_REGISTER |
+| Global Configuration and Policy Administrators | GLOBAL_ADMIN_UI_INTERACTIVE
+GLOBAL_CONFIG_MANAGEMENT
+GLOBAL_CONFIG_VIEW
+GLOBAL_CVP_PUBLICATION |
+| Global Configuration and Policy Administrators (Read Only) | GLOBAL_ADMIN_UI_INTERACTIVE
+GLOBAL_CONFIG_VIEW |
+| Help Desk Administrators | CVP_VIEW
+FEDERATED_LDAP_VIEW
+FEDERATED_SESSIONS_MANAGE
+FEDERATED_SESSIONS_VIEW
+FOLDER_VIEW
+GLOBAL_ADMIN_UI_INTERACTIVE
+GLOBAL_CONFIG_VIEW
+HELPDESK_ADMINISTRATOR
+HELPDESK_ADMINISTRATOR_VIEW
+MACHINE_MAINTENANCE
+MACHINE_MANAGEMENT
+MACHINE_MANAGE_OFFLINE_SESSION
+MACHINE_MANAGE_VDI_SESSION
+MACHINE_REBOOT
+MACHINE_SHUTDOWN
+MACHINE_USER_MANAGEMENT
+MACHINE_VIEW
+MANAGE_REMOTE_PROCESS
+POOL_VIEW
+REMOTE_ASSISTANCE
+UDD_VIEW |
+| Help Desk Administrators (Read Only) | CVP_VIEW
+FEDERATED_LDAP_VIEW
+FEDERATED_SESSIONS_VIEW
+FOLDER_VIEW
+GLOBAL_ADMIN_UI_INTERACTIVE
+GLOBAL_CONFIG_VIEW
+HELPDESK_ADMINISTRATOR_VIEW
+MACHINE_VIEW
+POOL_VIEW
+UDD_VIEW |
+| Horizon Cloud Service | CLOUD_ADMIN
+GLOBAL_ADMIN_SDK_INTERACTIVE
+GLOBAL_CONFIG_VIEW
+GLOBAL_CVP_REGISTER
+HORIZON_CLOUD_SERVICE
+POOL_VIEW
+SUBSCRIPTION_LICENSE_ADD |
+| Inventory Administrators | CVP_MANAGEMENT
+CVP_OWNERSHIP
+CVP_VIEW
+FOLDER_VIEW
+GLOBAL_ADMIN_UI_INTERACTIVE
+INVENTORY_ADMINISTRATOR
+INVENTORY_ADMINISTRATOR_VIEW
+MACHINE_MAINTENANCE
+MACHINE_MANAGEMENT
+MACHINE_MANAGE_OFFLINE_SESSION
+MACHINE_MANAGE_VDI_SESSION
+MACHINE_REBOOT
+MACHINE_SHUTDOWN
+MACHINE_USER_MANAGEMENT
+MACHINE_VIEW
+MANAGE_REMOTE_PROCESS
+POOL_ENABLE
+POOL_ENTITLE
+POOL_MANAGEMENT
+POOL_SVI_IMAGE_MANAGEMENT
+POOL_VIEW
+REMOTE_ASSISTANCE
+UDD_MANAGEMENT
+UDD_VIEW
+VC_CONFIG_VIEW |
+| Inventory Administrators (Read only) | CVP_VIEW
+FOLDER_VIEW
+GLOBAL_ADMIN_UI_INTERACTIVE
+INVENTORY_ADMINISTRATOR_VIEW
+MACHINE_VIEW
+POOL_VIEW
+UDD_VIEW
+VC_CONFIG_VIEW |
+| Local Administrators | CAPACITY_PROVIDER_CONFIG_MANAGEMENT
+CAPACITY_PROVIDER_CONFIG_VIEW
+CLOUD_ADMIN
+CLOUD_ON_BOARDING_MANAGEMENT
+CLOUD_OPS_MANAGEMENT
+CVP_INTERACTIVE
+CVP_MANAGEMENT
+CVP_OWNERSHIP
+CVP_VIEW
+FOLDER_MANAGEMENT
+FOLDER_VIEW
+GLOBAL_ADMIN_SDK_INTERACTIVE
+GLOBAL_ADMIN_UI_INTERACTIVE
+GLOBAL_CONFIG_MANAGEMENT
+GLOBAL_CONFIG_VIEW
+GLOBAL_CVP_PUBLICATION
+GLOBAL_CVP_REGISTER
+GLOBAL_MACHINE_REGISTER
+GLOBAL_PERMISSION_VIEW
+GLOBAL_ROLE_VIEW
+INVENTORY_ADMINISTRATOR
+INVENTORY_ADMINISTRATOR_VIEW
+LOCAL_ADMINISTRATOR
+LOCAL_ADMINISTRATOR_VIEW
+MACHINE_MAINTENANCE
+MACHINE_MANAGEMENT
+MACHINE_MANAGE_OFFLINE_SESSION
+MACHINE_MANAGE_VDI_SESSION
+MACHINE_REBOOT
+MACHINE_SHUTDOWN
+MACHINE_USER_MANAGEMENT
+MACHINE_VIEW
+MANAGE_REMOTE_PROCESS
+POOL_ENABLE
+POOL_ENTITLE
+POOL_MANAGEMENT
+POOL_SVI_IMAGE_MANAGEMENT
+POOL_VIEW
+REMOTE_ASSISTANCE
+SUBSCRIPTION_LICENSE_ADD
+UDD_MANAGEMENT
+UDD_VIEW
+VC_CONFIG_VIEW |
+| Local Administrators (Read only) | CAPACITY_PROVIDER_CONFIG_VIEW
+CVP_VIEW
+FOLDER_VIEW
+GLOBAL_ADMIN_SDK_INTERACTIVE
+GLOBAL_ADMIN_UI_INTERACTIVE
+GLOBAL_CONFIG_VIEW
+GLOBAL_PERMISSION_VIEW
+GLOBAL_ROLE_VIEW
+INVENTORY_ADMINISTRATOR_VIEW
+LOCAL_ADMINISTRATOR_VIEW
+MACHINE_VIEW
+POOL_VIEW
+UDD_VIEW
+VC_CONFIG_VIEW |
+| PHARMAX-God-Admin | CVP_VIEW
+FEDERATED_LDAP_MANAGE
+FEDERATED_LDAP_VIEW
+FEDERATED_SESSIONS_MANAGE
+FEDERATED_SESSIONS_VIEW
+FOLDER_MANAGEMENT
+FOLDER_VIEW
+GLOBAL_ADMIN_SDK_INTERACTIVE
+GLOBAL_ADMIN_UI_INTERACTIVE
+GLOBAL_CONFIG_MANAGEMENT
+GLOBAL_CONFIG_VIEW
+GLOBAL_CVP_PUBLICATION
+GLOBAL_MACHINE_REGISTER
+GLOBAL_PERMISSION_MANAGEMENT
+GLOBAL_PERMISSION_VIEW
+GLOBAL_ROLE_MANAGEMENT
+GLOBAL_ROLE_PERMISSION_MANAGEMENT
+GLOBAL_ROLE_VIEW
+HELPDESK_ADMINISTRATOR_VIEW
+LOG_COLLECTION
+MACHINE_MAINTENANCE
+MACHINE_MANAGEMENT
+MACHINE_MANAGE_OFFLINE_SESSION
+MACHINE_MANAGE_VDI_SESSION
+MACHINE_REBOOT
+MACHINE_SHUTDOWN
+MACHINE_USER_MANAGEMENT
+MACHINE_VIEW
+MANAGE_REMOTE_PROCESS
+POOL_ENABLE
+POOL_ENTITLE
+POOL_MANAGEMENT
+POOL_SVI_IMAGE_MANAGEMENT
+POOL_VIEW
+REMOTE_ASSISTANCE
+UDD_VIEW
+VC_CONFIG_VIEW |
+
+
Table 49 - Role Privileges Details - Inventory Administrators (Read only)
+
4.6.4 Role Permissions
The following section details the Role Permissions information for HORIZON-CS-01V.PHARMAX.LOCAL server.
+| User or Group Name | Role | Access Group |
+| 12-051-distlist1 | Local Administrators (Read only) | /Root/Gurabo-Sites |
+| 4256122656SA | Inventory Administrators | /Root/Gurabo-Sites |
+| 4362712809SA | Inventory Administrators (Read only) | /Root/CISA |
+| AD - SRM Admin Group | Inventory Administrators | /Root/Prueba |
+| Administrator | Administrators | /Root |
+| Domain Admins | PHARMAX-God-Admin | /Root |
+| Jonathan A. Colon Feliciano | Local Administrators | /Root/Gurabo-Sites |
+| Jonathan A. Colon Feliciano | Inventory Administrators | /Root |
+| Jonathan A. Colon Feliciano | Help Desk Administrators | /Root |
+| VMware IC Account | Administrators (Read only) | /Root |
+
+
Table 50 - Role Permissions - HORIZON-CS-01V.PHARMAX.LOCAL
+
4.6.5 Access Groups
The following section summarizes the configuration of Access Groups for HORIZON-CS-01V.PHARMAX.LOCAL server.
+| Name | Description |
+| CISA | -- |
+| Gurabo-Sites | -- |
+| Prueba | Prueba Description |
+| Root | ROOT FOLDER |
+
+
Table 51 - Access Groups - HORIZON-CS-01V.PHARMAX.LOCAL
+
4.6.5.1 Access Groups Details
Root
+| Name | Permissions |
+| Administrator | Administrators |
+| Domain Admins | PHARMAX-God-Admin |
+| Jonathan A. Colon Feliciano | Local Administrators, Help Desk Administrators, Inventory Administrators |
+| VMware IC Account | Administrators (Read only) |
+
+
Table 52 - Access Groups - Root
+
CISA
+| Name | Permissions |
+| 4362712809SA | Inventory Administrators (Read only) |
+
+
Table 53 - Access Groups - CISA
+
Prueba
+| Name | Permissions |
+| AD - SRM Admin Group | Inventory Administrators |
+
+
Table 54 - Access Groups - Prueba
+
Gurabo-Sites
+| Name | Permissions |
+| 12-051-distlist1 | Local Administrators (Read only) |
+| 4256122656SA | Inventory Administrators |
+| Jonathan A. Colon Feliciano | Local Administrators, Help Desk Administrators, Inventory Administrators |
+
+
Table 55 - Access Groups - Gurabo-Sites
+
4.6.6 Federation Access Groups
The following section details the Federation Access Group information for HORIZON-CS-01V.PHARMAX.LOCAL server.
+| User or Group Name | Role | Global Access Group |
+| Administrator | Administrators | Root |
+| Domain Admins | PHARMAX-God-Admin | Root |
+| Jonathan A. Colon Feliciano | Help Desk Administrators | Root |
+| VMware IC Account | Administrators (Read only) | Root |
+
+
Table 56 - Role Permissions - HORIZON-CS-01V.PHARMAX.LOCAL
+
4.7 Cloud Pod Architecture
The following section details on the cloud pod architecture information for HORIZON-CS-01V.PHARMAX.LOCAL.
+
+| Pod Name | Cluster-HORIZON-CS-01V |
+| Pod Local | Yes |
+| Pod Site | PHARMAX-HQ |
+| Pod Description | -- |
+| Pod Cloud Managed | No |
+| Pod Connection Servers | HORIZON-CS-01V HORIZON-CS-02V
|
+| Pod Active Global Entitlements | -- |
+| Pod Active Global Application Entitlements | -- |
+
+
Table 57 - Cloud Pod Architecture - HORIZON-CS-01V.PHARMAX.LOCAL
+
4.8 Site
The following section details on the Cloud Pod Site information for HORIZON-CS-01V.PHARMAX.LOCAL.
+
+| Cloud Pod Sites Name | PHARMAX-HQ |
+| Cloud Pod Sites Description | -- |
+| Cloud Pod Site Pod Name | Cluster-HORIZON-CS-01V |
+
+
+
4.9 Event Configuration
The following section details on the events configuration information for HORIZON-CS-01V.PHARMAX.LOCAL.
4.9.1 Event Database
+
+| Server | horizon-sql-01v |
+| Type | SQLSERVER |
+| Port | 1433 |
+| Name | HZ-Event-DB |
+| User Name | hz-event-user |
+| Table Prefix | PHM |
+| Show Events for | THREE_MONTHS |
+| Classify Events as New for | 2 Days |
+| Timing Profiler Events | 7 Days |
+| Enabled | Yes |
+
+
Table 58 - Event Database - HORIZON-CS-01V
+
4.9.2 Syslog Configuration
+| Server | Port |
+| 10.10.10.33 | 514 |
+| 192.168.5.1 | 514 |
+
+
Table 59 - Syslog Configuration - HORIZON-CS-01V
+
4.9.3 Events to File System
+
+| Enabled | Yes |
+| Enabled on Error | No |
+| Path | \\192.168.5.1\WsusContent\HorizonEvents |
+| User name | administrator |
+| Domain | pharmax.local |
+
+
Table 60 - Events to File System - HORIZON-CS-01V
+
4.10 Global Policies
The following section details on the Global Policies information for HORIZON-CS-01V.PHARMAX.LOCAL.
+
+| Allow Multimedia Redirection | Deny |
+| Allow USB Access | Allow |
+| Allow Remote Mode | Allow |
+| Allow PCoIP Hardware Acceleration | Allow |
+| PCoIP Hardware Acceleration Priority | Medium |
+
+
Table 61 - Global Policies - HORIZON-CS-01V.PHARMAX.LOCAL
+
+
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZADDomain.ps1 b/1.1.5/Src/Private/Get-AbrHRZADDomain.ps1
new file mode 100644
index 0000000..d02a904
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZADDomain.ps1
@@ -0,0 +1,70 @@
+function Get-AbrHRZADDomain {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+ begin {
+ Write-PScriboMessage "ADDomains InfoLevel set at $($InfoLevel.Settings.Servers.vCenterServers.ADDomains)."
+ Write-PScriboMessage "Collecting Active Directory Domain information."
+ }
+ process {
+ try {
+ if ($Domains) {
+ if ($InfoLevel.Settings.Servers.vCenterServers.ADDomains -ge 1) {
+ Section -Style Heading4 "Active Directory Domains" {
+ Paragraph "The following section summarizes the configuration of Active Directory Domains for $($HVEnvironment.split('.')[0]) server."
+ BlankLine
+ $OutObj = @()
+ foreach ($Domain in $Domains) {
+ try {
+ Write-PScriboMessage "Discovered Domain Information $($Domain.DNSName)."
+ $inObj = [ordered] @{
+ 'Domain DNS Name' = $Domain.DNSName
+ 'Status' = $Domain.ConnectionServerState[0].Status
+ 'Trust Relationship' = $Domain.ConnectionServerState[0].TrustRelationship
+ 'Connection Status' = $Domain.ConnectionServerState[0].Contactable
+ }
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ if ($HealthCheck.DataStores.Status) {
+ $OutObj | Where-Object { $_.'Status' -eq 'ERROR' } | Set-Style -Style Warning
+ }
+ $TableParams = @{
+ Name = "Active Directory Domains - $($HVEnvironment.split(".").toUpper()[0])"
+ List = $false
+ ColumnWidths = 25, 25, 25, 25
+ }
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Sort-Object -Property 'Name' | Table @TableParams
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZAccessGroup.ps1 b/1.1.5/Src/Private/Get-AbrHRZAccessGroup.ps1
new file mode 100644
index 0000000..43dd353
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZAccessGroup.ps1
@@ -0,0 +1,131 @@
+function Get-AbrHRZAccessGroup {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "AccessGroup InfoLevel set at $($InfoLevel.Settings.Administrators.AccessGroup)."
+ Write-PScriboMessage "Collecting Access Group information."
+ }
+
+ process {
+ try {
+ if ($AccessGroups) {
+ if ($InfoLevel.Settings.Administrators.AccessGroup -ge 1) {
+ Section -Style Heading3 "Access Groups" {
+ Paragraph "The following section summarizes the configuration of Access Groups for $($HVEnvironment.toUpper()) server."
+ BlankLine
+ $OutObj = @()
+ $AccessGroupJoined = @()
+ $AccessGroupJoined += $AccessGroups
+ $AccessGroupJoined += $AccessGroups.Children
+ foreach ($AccessGroup in $AccessGroupJoined) {
+ Write-PScriboMessage "Discovered $($AccessGroup.base.Name) Access Groups Information."
+ $inObj = [ordered] @{
+ 'Name' = $AccessGroup.base.Name
+ 'Description' = $AccessGroup.base.Description
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+
+ $TableParams = @{
+ Name = "Access Groups - $($HVEnvironment.toUpper())"
+ List = $false
+ ColumnWidths = 35, 65
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Sort-Object -Property 'Name' | Table @TableParams
+ try {
+ if ($InfoLevel.Settings.Administrators.AccessGroup -ge 2) {
+ Section -Style Heading4 "Access Groups Details" {
+ $AccessGroupJoined = @()
+ $AccessGroupJoined += $AccessGroups
+ $AccessGroupJoined += $AccessGroups.Children
+ foreach ($AccessGroup in $AccessGroupJoined) {
+ Write-PScriboMessage "Discovered $($AccessGroup.base.Name) Access Groups Detailed Information."
+ $AdministratorIDNameResults = @()
+ # Find Administrator ID Name
+ foreach ($AccessGroupID in $AccessGroup.data.Permissions.id) {
+ foreach ($Permission in $Permissions) {
+ if ($AccessGroupID -eq $Permission.id.id) {
+ foreach ($PermissionGroup in $Permission.base.UserOrGroup.id) {
+ foreach ($Administrator in $Administrators) {
+ if ($Administrator.Id.id -eq $PermissionGroup) {
+ $AdministratorIDNameResults += $Administrator.base.name
+ break
+ }
+ }
+ $AdministratorIDName = $AdministratorIDNameResults
+ }
+ }
+ }
+ }
+ if ($AdministratorIDName) {
+ Section -ExcludeFromTOC -Style NOTOCHeading5 $AccessGroup.base.Name {
+ $OutObj = @()
+ foreach ($Principal in ($AdministratorIDName | Select-Object -Unique)) {
+ $PrincipalPermissionsName = @()
+ $PrincipalID = ($Administrators | Where-Object { $_.Base.Name -eq $Principal }).Id.Id
+ $PrincipalPermissions = ($Permissions.Base | Where-Object { $_.UserOrGroup.Id -eq $PrincipalID }).Role.Id
+ foreach ($PrincipalPermission in $PrincipalPermissions) {
+ $PrincipalPermissionsName += $(($Roles | Where-Object { $_.Id.id -eq $PrincipalPermission }).Base.Name)
+ }
+
+ $inObj = [ordered] @{
+ 'Name' = $Principal
+ 'Permissions' = [string](($PrincipalPermissionsName | Select-Object -Unique) -join ', ')
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+
+ $TableParams = @{
+ Name = "Access Groups - $($AccessGroup.base.Name)"
+ List = $false
+ ColumnWidths = 35, 65
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Sort-Object -Property 'Name' | Table @TableParams
+ }
+ }
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
diff --git a/1.1.5/Src/Private/Get-AbrHRZAdminGroup.ps1 b/1.1.5/Src/Private/Get-AbrHRZAdminGroup.ps1
new file mode 100644
index 0000000..dfe0395
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZAdminGroup.ps1
@@ -0,0 +1,160 @@
+function Get-AbrHRZAdminGroup {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "Administrators InfoLevel set at $($InfoLevel.Settings.Administrators.AdministratorsandGroups)."
+ Write-PScriboMessage "Collecting Registered Machines information."
+ }
+
+ process {
+ try {
+ if ($Administrators) {
+ if ($InfoLevel.Settings.Administrators.AdministratorsandGroups -ge 1) {
+ Section -Style Heading3 "Administrators and Groups" {
+ Paragraph "The following section details the configuration of Administrators and Groups for $($HVEnvironment.toUpper()) server."
+ BlankLine
+ $OutObj = @()
+ foreach ($Administrator in $Administrators) {
+ $RoleIDNameResults = ''
+ foreach ($Permission in $Permissions) {
+ if ($Administrator.PermissionData.Permissions.id -eq $Permission.id.id) {
+ # Find Role ID Name
+ $RoleIDName = ''
+ $PermissionGroups = $Permission.base.Role.id
+ foreach ($PermissionGroup in $PermissionGroups) {
+ foreach ($Role in $Roles) {
+ if ($Role.Id.id -eq $PermissionGroup) {
+ $RoleIDName = $Role.base.name
+ break
+ }
+ }
+ if ($Administrator.PermissionData.Permissions.id.count -gt 1) {
+ $RoleIDNameResults += "$RoleIDName, "
+ $RoleIDName = $RoleIDNameResults.TrimEnd(', ')
+ }
+ }
+ }
+ }
+
+ Write-PScriboMessage "Discovered Administrators and Groups Information."
+ $inObj = [ordered] @{
+ 'Display Name' = $Administrator.base.DisplayName
+ 'Type' = Switch ($Administrator.base.Group) {
+ $False { 'User' }
+ $True { 'Group' }
+ }
+ 'Permission Role' = [string](($RoleIDName.split(', ') | Select-Object -Unique) -join ', ')
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+
+ $TableParams = @{
+ Name = "Administrators and Groups - $($HVEnvironment.toUpper())"
+ List = $false
+ ColumnWidths = 42, 15, 43
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Sort-Object -Property 'Display Name' | Table @TableParams
+ try {
+ if ($InfoLevel.Settings.Administrators.AdministratorsandGroups -ge 2) {
+ foreach ($Administrator in $Administrators) {
+ Section -Style Heading4 "Administrators Users and Groups Details for $($Administrator.base.Name)" {
+ Write-PScriboMessage "Discovered $($Administrator.base.Name) Information."
+ $RoleIDNameResults = ''
+ foreach ($Permission in $Permissions) {
+ if ($Administrator.PermissionData.Permissions.id -eq $Permission.id.id) {
+ # Find Role ID Name
+ $RoleIDName = ''
+ $PermissionGroups = $Permission.base.Role.id
+ foreach ($PermissionGroup in $PermissionGroups) {
+ foreach ($Role in $Roles) {
+ if ($Role.Id.id -eq $PermissionGroup) {
+ $RoleIDName = $Role.base.name
+ break
+ }
+ }
+ if ($Administrator.PermissionData.Permissions.id.count -gt 1) {
+ $RoleIDNameResults += "$RoleIDName, "
+ $RoleIDName = $RoleIDNameResults.TrimEnd(', ')
+ }
+ }
+ }
+ }
+ Switch ($Administrator.base.Group) {
+ 'True' { $Administratorbasegroup = 'Group' }
+ 'False' { $Administratorbasegroup = 'User' }
+ }
+ Section -ExcludeFromTOC -Style NOTOCHeading6 $Administrator.Base.Name {
+ $OutObj = @()
+ $inObj = [ordered] @{
+ 'Name' = $Administrator.base.Name
+ 'First Name' = $Administrator.base.FirstName
+ 'Last Name' = $Administrator.base.LastName
+ 'Login Name' = $Administrator.base.LoginName
+ 'Display Name' = $Administrator.base.DisplayName
+ 'Long Display Name' = $Administrator.base.LongDisplayName
+ 'Is Assignment a Group of User' = $Administratorbasegroup
+ 'Domain' = $Administrator.base.Domain
+ 'AD Distinguished Name' = $Administrator.base.AdDistinguishedName
+ 'Email' = $Administrator.base.Email
+ 'Kiosk User' = $Administrator.base.KioskUser
+ 'Un-Authenticated User' = $Administrator.base.UnauthenticatedUser
+ 'Phone Number' = $Administrator.base.Phone
+ 'Description' = $Administrator.base.Description
+ 'in Folder' = $Administrator.base.InFolder
+ 'UPN' = $Administrator.base.UserPrincipalName
+ 'Permission Role' = [string](($RoleIDName.split(', ') | Select-Object -Unique) -join ', ')
+ }
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+
+ $TableParams = @{
+ Name = "Administrator - $($Administrator.base.Name)"
+ List = $true
+ ColumnWidths = 40, 60
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZApplicationPool.ps1 b/1.1.5/Src/Private/Get-AbrHRZApplicationPool.ps1
new file mode 100644
index 0000000..adfb120
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZApplicationPool.ps1
@@ -0,0 +1,171 @@
+function Get-AbrHRZApplicationPool {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "Applications InfoLevel set at $($InfoLevel.Inventory.Applications)."
+ Write-PScriboMessage "Collecting Applications information."
+ }
+
+ process {
+ try {
+ if ($Apps) {
+ if ($InfoLevel.Inventory.Applications -ge 1) {
+ Section -Style Heading3 "Application Pool" {
+ Paragraph "The following section details the configuration of Application Pool for $($HVEnvironment.toUpper()) server."
+ BlankLine
+ $OutObj = @()
+ foreach ($App in $Apps) {
+ Write-PScriboMessage "Discovered Applications Information for $($App.Data.DisplayName)."
+ $inObj = [ordered] @{
+ 'Name' = $App.Data.DisplayName
+ 'Version' = $App.ExecutionData.Version
+ 'Enabled' = $App.Data.Enabled
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+
+ $TableParams = @{
+ Name = "Applications - $($HVEnvironment.toUpper())"
+ List = $false
+ ColumnWidths = 34, 33, 33
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Sort-Object -Property 'Name' | Table @TableParams
+ try {
+ if ($InfoLevel.Inventory.Applications -ge 2) {
+ Section -Style Heading4 "Application Pool Details" {
+ foreach ($App in $Apps) {
+ # Find out Farm Name for Applications
+ $farmMatch = $false
+ foreach ($farm in $farms) {
+ if ($farm.Id.id -eq $app.executiondata.farm.id) {
+ $ApplicationFarmName = $farm.data.name
+ $farmMatch = $true
+ }
+ if ($farmMatch) {
+ break
+ }
+ }
+ # Find out Access Group for Applications
+ $AccessgroupMatch = $false
+ foreach ($Accessgroup in $Accessgroups) {
+ if ($Accessgroup.Id.id -eq $app.accessgroup.id) {
+ $AccessGroupName = $Accessgroup.base.name
+ $AccessgroupMatch = $true
+ }
+ if ($AccessgroupMatch) {
+ break
+ }
+ }
+ # Find out Global Application Entitlement Group for Applications
+ $GlobalApplicationEntitlementGroupDisplayName = ('')
+ $GlobalApplicationEntitlementGroupMatch = $false
+ foreach ($GlobalApplicationEntitlementGroup in $GlobalApplicationEntitlementGroups) {
+ if ($GlobalApplicationEntitlementGroup.Id.id -eq $app.data.GlobalApplicationEntitlement.id) {
+ $GlobalApplicationEntitlementGroupDisplayName = $GlobalApplicationEntitlementGroup.base.DisplayName
+ $GlobalApplicationEntitlementGroupMatch = $true
+ } else {
+ $GlobalApplicationEntitlementGroupDisplayName = "No Global Application Entitlement"
+ }
+ if ($GlobalApplicationEntitlementGroupMatch) {
+ break
+ }
+ }
+ If ([string]::IsNullOrEmpty($App.Data.AvApplicationPackageGuid)) {
+
+ $AppVolumesApp = "False"
+ } else {
+ $AppVolumesApp = "True"
+ }
+ $ApplicationFileTypes = $App.ExecutionData.FileTypes | ForEach-Object { $_.FileType }
+ $ApplicationFileTypesresult = $ApplicationFileTypes -join ', '
+ $OtherApplicationFileTypes = $App.ExecutionData.OtherFileTypes | ForEach-Object { $_.FileType }
+ $OtherApplicationFileTypesresult = $OtherApplicationFileTypes -join ', '
+
+ Section -Style NOTOCHeading5 "Application Summary - $($App.Data.DisplayName)" {
+ $OutObj = @()
+ Write-PScriboMessage "Discovered $($App.Data.DisplayName) Applications Information."
+ $inObj = [ordered] @{
+ 'Display Name' = $App.Data.DisplayName
+ 'Description' = $App.Data.Description
+ 'Enabled' = $App.Data.Enabled
+ 'Global Application Entitlement' = $GlobalApplicationEntitlementGroupDisplayName
+ 'Enable Anti Affinity Rules' = $App.Data.EnableAntiAffinityRules
+ 'Anti-Affinity Patterns' = $App.Data.AntiAffinityPatterns
+ 'Anti-Affinity Count' = $App.Data.AntiAffinityCount
+ 'Enable Pre-Launch' = $App.Data.EnablePreLaunch
+ 'Connection Server Restrictions' = $App.Data.ConnectionServerRestrictions
+ 'Category Folder' = $App.Data.CategoryFolder
+ 'Client Restrictions' = $App.Data.ClientRestrictions
+ 'Shortcut Location' = $App.Data.ShortcutLocation
+ 'Multi Session Mode' = $App.Data.MultiSessionMode
+ 'Max Multi Sessions' = $App.Data.MaxMultiSessions
+ 'Cloud Brokered' = $App.Data.CloudBrokered
+ 'App Volumes App' = $AppVolumesApp
+ 'App Volumes Package' = $App.Data.AvApplicationPackageGuid
+ 'Executable Path' = $App.ExecutionData.ExecutablePath
+ 'Version' = $App.ExecutionData.Version
+ 'Publisher' = $App.ExecutionData.Publisher
+ 'Start Folder' = $App.ExecutionData.StartFolder
+ 'Argument' = $App.ExecutionData.Args
+ 'Farm' = $ApplicationFarmName
+ 'File Types' = $ApplicationFileTypesresult
+ 'Auto Update File Types' = $App.ExecutionData.AutoUpdateFileTypes
+ 'Other File Types' = $OtherApplicationFileTypesresult
+ 'Auto Update Other File Types' = $App.ExecutionData.AutoUpdateFileTypes
+ 'Access Group' = $AccessGroupName
+ }
+
+ $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
+
+ $TableParams = @{
+ Name = "Application Summary - $($App.Data.DisplayName)"
+ List = $true
+ ColumnWidths = 50, 50
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZCertMgmt.ps1 b/1.1.5/Src/Private/Get-AbrHRZCertMgmt.ps1
new file mode 100644
index 0000000..33b709f
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZCertMgmt.ps1
@@ -0,0 +1,77 @@
+function Get-AbrHRZCertMgmt {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "Certificate Management InfoLevel set at $($InfoLevel.Settings.Servers.ConnectionServers.ConnectionServers)."
+ Write-PScriboMessage "Collecting Certificate Management information."
+ }
+
+ process {
+ try {
+ if ($ConnectionServersHealth) {
+ if ($InfoLevel.Settings.CloudPodArch.CloudPodArch -ge 1) {
+ # Connection Server Health Data
+ $ConnectionServerHealthData = $ConnectionServersHealth | Select-Object -First 1
+
+ Section -Style Heading2 "Certificate Management" {
+ Paragraph "The following section details on the certificate management information for $($HVEnvironment.toUpper())."
+ BlankLine
+ $OutObj = @()
+ Write-PScriboMessage "Working on Certificate Information for $($ConnectionServerHealthData.Name)."
+
+ $Cert = $ConnectionServerHealthData.CertificateHealth.ConnectionServerCertificate
+ $Bytes = [System.Text.Encoding]::UTF8.GetBytes($Cert)
+ $PodCert = [System.Security.Cryptography.X509Certificates.X509Certificate2]::new($Bytes)
+
+ $inObj = [ordered] @{
+ 'Self-Signed Certificate' = $ConnectionServerHealthData.DefaultCertificate
+ 'Certificate Subject' = $PodCert.Subject
+ 'Certificate Issuer' = $PodCert.Issuer
+ 'Certificate Not Before' = $PodCert.NotBefore
+ 'Certificate Not After' = $PodCert.NotAfter
+ 'Certificate SANs' = $PodCert.DnsNameList
+ 'Certificate Thumbprint' = $PodCert.Thumbprint
+ }
+ $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
+ if ($HealthCheck.ConnectionServers.Status) {
+ $OutObj | Where-Object { $_.'Enabled' -eq 'No' } | Set-Style -Style Warning -Property 'Enabled'
+ }
+ $TableParams = @{
+ Name = "Certificate Management - $($HVEnvironment.toUpper())"
+ List = $true
+ ColumnWidths = 30, 70
+ }
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZCloudPod.ps1 b/1.1.5/Src/Private/Get-AbrHRZCloudPod.ps1
new file mode 100644
index 0000000..5af9930
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZCloudPod.ps1
@@ -0,0 +1,103 @@
+function Get-AbrHRZCloudPod {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "Cloud Pod Architecture InfoLevel set at $($InfoLevel.Settings.CloudPodArch.CloudPodArch)."
+ Write-PScriboMessage "Collecting Cloud Pod Architecture information."
+ }
+
+ process {
+ try {
+ if ($CloudPodFederation) {
+ if ($InfoLevel.Settings.CloudPodArch.CloudPodArch -ge 1) {
+ Section -Style Heading2 "Cloud Pod Architecture" {
+ Paragraph "The following section details on the cloud pod architecture information for $($HVEnvironment.toUpper())."
+ BlankLine
+ $OutObj = @()
+ foreach ($CloudPodList in $CloudPodLists) {
+ if ($CloudPodList) {
+
+ # CP Site Info
+ $CloudPodSiteInfo = $hzServices.Site.Site_Get($CloudPodList.site)
+
+ # Connection Server Info
+ $CloudPodListEndpoints = $CloudPodList.Endpoints
+ $CloudPodListEndpointConnectionServerList = ''
+ foreach ($CloudPodListEndpoint in $CloudPodListEndpoints) {
+ $CloudPodListEndpointConnectionServer = $hzServices.PodEndpoint.PodEndpoint_Get($CloudPodListEndpoint)
+ $CloudPodListEndpointConnectionServerList += $CloudPodListEndpointConnectionServer.name -join "`r`n" | Out-String
+ }
+
+ # Active Global Entitlements
+ $CloudPodListActiveGlobalEntitlements = $CloudPodList.ActiveGlobalEntitlements
+ $CloudPodListActiveGlobalEntitlementList = ''
+ foreach ($CloudPodListActiveGlobalEntitlement in $CloudPodListActiveGlobalEntitlements) {
+ $CloudPodListActiveGlobalEntitlementInfo = $hzServices.GlobalEntitlement.GlobalEntitlement_Get($CloudPodListActiveGlobalEntitlement)
+ $CloudPodListActiveGlobalEntitlementList += $CloudPodListActiveGlobalEntitlementInfo.Base.DisplayName -join "`r`n" | Out-String
+ }
+
+ # Active Global Application Entitlements
+ $CloudPodListActiveGlobalApplicationEntitlements = $CloudPodList.ActiveGlobalApplicationEntitlements
+ $CloudPodListActiveGlobalApplicationEntitlementList = ''
+ foreach ($CloudPodListActiveGlobalApplicationEntitlement in $CloudPodListActiveGlobalApplicationEntitlements) {
+ $CloudPodListActiveGlobalApplicationEntitlementInfo = $hzServices.GlobalApplicationEntitlement.GlobalApplicationEntitlement_Get($CloudPodListActiveGlobalApplicationEntitlement)
+ $CloudPodListActiveGlobalApplicationEntitlementList += $CloudPodListActiveGlobalApplicationEntitlementInfo.Base.DisplayName -join "`r`n" | Out-String
+ }
+
+
+ Write-PScriboMessage "Discovered Cloud Pod Federation Information."
+ $inObj = [ordered] @{
+ 'Pod Name' = $CloudPodList.DisplayName
+ 'Pod Local' = $CloudPodList.Localpod
+ 'Pod Site' = $CloudPodSiteInfo.Base.DisplayName
+ 'Pod Description' = $CloudPodList.Description
+ 'Pod Cloud Managed' = $CloudPodList.CloudManaged
+ 'Pod Connection Servers' = $CloudPodListEndpointConnectionServerList
+ 'Pod Active Global Entitlements' = $CloudPodListActiveGlobalEntitlementList
+ 'Pod Active Global Application Entitlements' = $CloudPodListActiveGlobalApplicationEntitlementList
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+ }
+
+ $TableParams = @{
+ Name = "Cloud Pod Architecture - $($HVEnvironment.toUpper())"
+ List = $true
+ ColumnWidths = 50, 50
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZConnectionServer.ps1 b/1.1.5/Src/Private/Get-AbrHRZConnectionServer.ps1
new file mode 100644
index 0000000..b8e82ad
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZConnectionServer.ps1
@@ -0,0 +1,351 @@
+function Get-AbrHRZConnectionServer {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "ConnectionServers InfoLevel set at $($InfoLevel.Settings.Servers.ConnectionServers.ConnectionServers)."
+ Write-PScriboMessage "Collecting Connection Servers information."
+ }
+
+ process {
+ try {
+ if ($ConnectionServers) {
+ if ($InfoLevel.Settings.Servers.ConnectionServers.ConnectionServers -ge 1) {
+ Section -Style Heading3 "Connection Servers" {
+ Paragraph "The following section details the configuration of Connection Servers for $($HVEnvironment.toUpper()) server."
+ BlankLine
+ $OutObj = @()
+ foreach ($ConnectionServer in $ConnectionServers) {
+ try {
+ Write-PScriboMessage "Discovered Connection Servers Information $($ConnectionServer.General.Name)."
+ #Switch ($GatewayServer.Type)
+ #{
+ # 'AP' {$GatewayType = 'UAG' }
+ #}
+ $inObj = [ordered] @{
+ 'Name' = $ConnectionServer.General.Name
+ 'Version' = $ConnectionServer.General.Version
+ 'Enabled' = $ConnectionServer.General.Enabled
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+
+ if ($HealthCheck.ConnectionServers.Status) {
+ $OutObj | Where-Object { $_.'Enabled' -eq 'No' } | Set-Style -Style Warning -Property 'Enabled'
+ }
+
+ $TableParams = @{
+ Name = "Connection Servers - $($HVEnvironment.toUpper())"
+ List = $false
+ ColumnWidths = 42, 43, 15
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Sort-Object -Property 'Name' | Table @TableParams
+ if ($InfoLevel.Settings.Servers.ConnectionServers.ConnectionServers -ge 2) {
+ try {
+ $OutObj = @()
+ foreach ($ConnectionServer in $ConnectionServers) {
+ Section -Style NOTOCHeading5 "General $($ConnectionServer.General.Name) Details" {
+ try {
+ $ConnectionServerTags = $ConnectionServer.General | ForEach-Object { $_.Tags }
+ $ConnectionServerTagsresult = $ConnectionServerTags -join ', '
+
+ # Connection Server Health Data
+ $ConnectionServerHealthMatch = $false
+ foreach ($ConnectionServerHealth in $ConnectionServersHealth) {
+ if ($ConnectionServerHealth.id.id -eq $ConnectionServer.id.id) {
+ $ConnectionServerHealthData = $ConnectionServerHealth
+ $ConnectionServerHealthMatch = $true
+ }
+ if ($ConnectionServerHealthMatch) {
+ break
+ }
+ }
+
+ Write-PScriboMessage "Discovered Connection Servers Information $($ConnectionServer.General.Name)."
+ $inObj = [ordered] @{
+ 'Name' = $ConnectionServer.General.Name
+ 'FQDN' = $ConnectionServer.General.Fqhn
+ 'Server Address' = $ConnectionServer.General.ServerAddress
+ 'Version' = $ConnectionServer.General.Version
+ 'Enabled' = $ConnectionServer.General.Enabled
+ 'Tags' = $ConnectionServerTagsresult
+ 'External URL' = $ConnectionServer.General.ExternalURL
+ 'External PCoIP URL' = $ConnectionServer.General.ExternalPCoIPURL
+ 'Auxiliary External PCoIP IPv4 Address' = $ConnectionServer.General.AuxillaryExternalPCoIPIPv4Address
+ 'External App Blast URL' = $ConnectionServer.General.ExternalAppblastURL
+ 'Local Connection Server' = $ConnectionServer.General.LocalConnectionServer
+ 'Bypass Tunnel' = $ConnectionServer.General.BypassTunnel
+ 'Bypass PCoIP Gateway' = $ConnectionServer.General.BypassPCoIPGateway
+ 'Bypass App Blast Gateway' = $ConnectionServer.General.BypassAppBlastGateway
+ 'IP Mode' = $ConnectionServer.General.IpMode
+ 'FIPs Mode Enabled' = $ConnectionServer.General.FipsModeEnabled
+ 'Replication Status' = $ConnectionServerHealthData.ReplicationStatus.Status
+ 'Current CPU Usage Percentage' = $($ConnectionServerHealthData.ResourcesData.CpuUsagePercentage).ToString() + '%'
+ 'Current Memory Usage Percentage' = $($ConnectionServerHealthData.ResourcesData.MemoryUsagePercentage).ToString() + '%'
+ }
+
+ $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
+
+ if ($HealthCheck.ConnectionServers.Status) {
+ $OutObj | Where-Object { $_.'Enabled' -eq 'No' } | Set-Style -Style Warning -Property 'Enabled'
+ }
+
+ $TableParams = @{
+ Name = "Connection Servers - $($ConnectionServer.General.Name)"
+ List = $true
+ ColumnWidths = 50, 50
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+
+
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+
+ try {
+ $OutObj = @()
+ Section -Style NOTOCHeading5 "Authentication $($ConnectionServer.General.Name) Details" {
+ try {
+ Write-PScriboMessage "Discovered Connection Servers Authentication Information $($ConnectionServer.General.Name)."
+
+ if ($connectionserver.authentication.samlconfig.SamlAuthenticators) {
+ $SAMLAuth = $hzServices.SAMLAuthenticator.SAMLAuthenticator_Get($connectionserver.authentication.samlconfig.SamlAuthenticator)
+ #$SAMLAuthList = $hzServices.SAMLAuthenticator.SAMLAuthenticator_list()
+ }
+
+ $inObj = [ordered] @{
+ 'Smart Card Support' = $ConnectionServer.Authentication.SmartCardSupport
+ 'Log off When Smart Card Removed' = $ConnectionServer.Authentication.LogoffWhenRemoveSmartCard
+ 'RSA Secure ID Enabled' = $ConnectionServer.Authentication.RsaSecureIdConfig.SecureIdEnabled
+ 'RSA Secure ID Name Mapping' = $ConnectionServer.Authentication.RsaSecureIdConfig.NameMapping
+ 'RSA Secure ID Clear Node Secret' = $ConnectionServer.Authentication.RsaSecureIdConfig.ClearNodeSecret
+ 'RSA Secure ID Security File Data' = $ConnectionServer.Authentication.RsaSecureIdConfig.SecurityFileData
+ 'RSA Secure ID Security File Uploaded' = $ConnectionServer.Authentication.RsaSecureIdConfig.SecurityFileUploaded
+ 'Radius Enabled' = $ConnectionServer.Authentication.RadiusConfig.RadiusEnabled
+ 'Radius Authenticator' = $ConnectionServer.Authentication.RadiusConfig.RadiusAuthenticator
+ 'Radius Name Mapping' = $ConnectionServer.Authentication.RadiusConfig.RadiusNameMapping
+ 'Radius SSO' = $ConnectionServer.Authentication.RadiusConfig.RadiusSSO
+ 'SAML Support' = $ConnectionServer.Authentication.SamlConfig.SamlSupport
+ 'SAML Authenticator' = $SAMLAuth.General.Label
+ 'SAML Authenticator Description' = $SAMLAuth.General.Description
+ 'SAML Trigger Mode' = $SAMLAuth.General.CertificateSSOData.TriggerMode
+ 'SAML Password Mode' = $SAMLAuth.General.CertificateSSOData.PasswordMode
+ 'SAML Authenticator Type' = $SAMLAuth.server.AuthenticatorType
+ 'SAML Metadata URL' = $SAMLAuth.server.MetadataURL
+ 'SAML Administrator URL' = $SAMLAuth.server.AdministratorURL
+ 'SAML Static Meta Data' = $SAMLAuth.server.StaticMetaData
+ 'Unauthenticated Access Config Enabled' = $ConnectionServer.Authentication.UnauthenticatedAccessConfig.Enabled
+ 'Unauthenticated Access Default User' = $ConnectionServer.Authentication.UnauthenticatedAccessConfig.DefaultUser
+ 'Unauthenticated Access User Idle Timeout' = $ConnectionServer.Authentication.UnauthenticatedAccessConfig.UserIdleTimeout
+ 'Unauthenticated Access Client Puzzle Difficulty' = $ConnectionServer.Authentication.UnauthenticatedAccessConfig.ClientPuzzleDifficulty
+ 'Block Unsupported Clients' = $ConnectionServer.Authentication.UnauthenticatedAccessConfig.BlockUnsupportedClients
+ }
+ $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
+ $TableParams = @{
+ Name = "Authentication - $($ConnectionServer.General.Name)"
+ List = $true
+ ColumnWidths = 40, 60
+ }
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ try {
+ $OutObj = @()
+ Section -Style NOTOCHeading5 "Backup $($ConnectionServer.General.Name) Details" {
+ try {
+ Write-PScriboMessage "Discovered Connection Servers Authentication Information $($ConnectionServer.General.Name)."
+ $inObj = [ordered] @{
+ 'Automatic Backup Frequency' = Switch ($ConnectionServer.Backup.LdapBackupFrequencyTime) {
+ 'DAY_1' { 'Every day' }
+ 'DAY_2' { 'Every 2 day' }
+ 'HOUR_1' { 'Every hour' }
+ 'HOUR_12' { 'Every 12 hours' }
+ 'WEEK_1' { 'Every week' }
+ 'WEEK_2' { 'Every 2 week' }
+ 'HOUR_0' { 'Disabled' }
+
+ }
+ 'Max Number of Backups' = $ConnectionServer.Backup.LdapBackupMaxNumber
+ 'Last Backup Time' = $ConnectionServer.Backup.LastLdapBackupTime
+ 'Last Backup Status' = $ConnectionServer.Backup.LastLdapBackupStatus
+ 'Folder Location' = $ConnectionServer.Backup.LdapBackupFolder
+ }
+
+ $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
+
+ if ($HealthCheck.ConnectionServers.Status) {
+ $OutObj | Where-Object { $_.'Last Backup Status' -ne 'OK' } | Set-Style -Style Warning -Property 'Last Backup Status'
+ $OutObj | Where-Object { $_.'Automatic Backup Frequency' -eq 'Disabled' } | Set-Style -Style Critical -Property 'Automatic Backup Frequency'
+ }
+
+ $TableParams = @{
+ Name = "Backup - $($ConnectionServer.General.Name)"
+ List = $true
+ ColumnWidths = 50, 50
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ try {
+ $OutObj = @()
+ Section -Style NOTOCHeading5 "Certificate Details for $($ConnectionServer.General.Name) Details" {
+ try {
+
+ # Connection Server Health Data
+ $ConnectionServerHealthMatch = $false
+ foreach ($ConnectionServerHealth in $ConnectionServersHealth) {
+ if ($ConnectionServerHealth.id.id -eq $ConnectionServer.id.id) {
+ $ConnectionServerHealthData = $ConnectionServerHealth
+ $ConnectionServerHealthMatch = $true
+ }
+ if ($ConnectionServerHealthMatch) {
+ break
+ }
+ }
+
+ Write-PScriboMessage "Working on Certificate Information for $($ConnectionServerHealthData.Name)."
+
+ if (![string]::IsNullOrEmpty($ConnectionServerHealthData.CertificateHealth.ConnectionServerCertificate)) {
+ $Cert = $ConnectionServerHealthData.CertificateHealth.ConnectionServerCertificate
+ $Bytes = [System.Text.Encoding]::UTF8.GetBytes($Cert)
+ $PodCert = [System.Security.Cryptography.X509Certificates.X509Certificate2]::new($Bytes)
+ }
+
+ $inObj = [ordered] @{
+ 'Connection Server' = $ConnectionServerHealthData.Name
+ 'Self-Signed Certificate' = $ConnectionServerHealthData.DefaultCertificate
+ 'Certificate Subject' = $PodCert.Subject
+ 'Certificate Issuer' = $PodCert.Issuer
+ 'Certificate Not Before' = $PodCert.NotBefore
+ 'Certificate Not After' = $PodCert.NotAfter
+ 'Certificate SANs' = $(($PodCert.DnsNameList | ForEach-Object { $_.Punycode }) -join ', ')
+ 'Certificate Thumbprint' = $PodCert.Thumbprint
+ }
+ $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
+ if ($HealthCheck.ConnectionServers.Status) {
+ $OutObj | Where-Object { $_.'Enabled' -eq 'No' } | Set-Style -Style Warning -Property 'Enabled'
+ }
+ $TableParams = @{
+ Name = "Certificate Details for - $($ConnectionServerHealthData.Name)"
+ List = $true
+ ColumnWidths = 30, 70
+ }
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ if ($ConnectionServersHealth.replicationstatus) {
+ if ($InfoLevel.settings.servers.ConnectionServers.ConnectionServers -ge 2) {
+ try {
+ $OutObj = @()
+ Section -Style NOTOCHeading5 "Replication Status for Connection Server $($connectionserver.General.Name)" {
+ try {
+ Write-PScriboMessage "Working on Replication Information for $($connectionserver.General.Name)."
+
+ If ($CSHealth.Message) {
+ $CSHealthMessage = $CSHealth.Message
+ } else {
+ $CSHealthMessage = "No Replication Issues"
+ }
+
+ foreach ($CSHealth in ($ConnectionServersHealth | Where-Object { $_.Name -EQ $connectionserver.General.Name })) {
+ $inObj = [ordered] @{
+ 'Connection Server' = $CSHealth.Name
+ 'Replication Partner' = $($CSHealth.ReplicationStatus | ForEach-Object { $_.ServerName }) -join ','
+ 'Status' = $($CSHealth.ReplicationStatus | ForEach-Object { $_.Status }) -join ','
+ 'Message' = $CSHealthMessage
+ }
+ $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+
+ $TableParams = @{
+ Name = "Connection Servers Replication- $($connectionserver.General.Name)"
+ List = $true
+ ColumnWidths = 30, 70
+ }
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZDatastore.ps1 b/1.1.5/Src/Private/Get-AbrHRZDatastore.ps1
new file mode 100644
index 0000000..86b6ff6
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZDatastore.ps1
@@ -0,0 +1,119 @@
+function Get-AbrHRZDatastore {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "Datastore InfoLevel set at $($InfoLevel.Settings.Servers.vCenterServers.DataStores)."
+ Write-PScriboMessage "Collecting DataStores information."
+ }
+
+ process {
+ try {
+ if ($vCenterHealth) {
+ if ($InfoLevel.Settings.Servers.vCenterServers.DataStores -ge 1) {
+ Section -Style NOTOCHeading5 "Datastores" {
+ $OutObj = @()
+ $Datastores = $vCenterHealth.datastoredata
+ foreach ($DataStore in $Datastores) {
+ if ($DataStore.Name) {
+ try {
+ Write-PScriboMessage "Discovered Datastore Information from $($DataStore.name)."
+ $inObj = [ordered] @{
+ 'Name' = $DataStore.name
+ 'Accessible' = $DataStore.Accessible
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ }
+
+ if ($HealthCheck.DataStores.Status) {
+ $OutObj | Where-Object { $_.'Accessible' -eq 'No' } | Set-Style -Style Warning
+ }
+
+ $TableParams = @{
+ Name = "Datastores - $($HVEnvironment.toUpper())"
+ List = $false
+ ColumnWidths = 50, 50
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Sort-Object -Property 'Name' | Table @TableParams
+ try {
+ if ($InfoLevel.Settings.Servers.vCenterServers.DataStores -ge 2) {
+ Section -Style NOTOCHeading6 "Datastores Detailed" {
+ foreach ($DataStore in $Datastores) {
+ if ($DataStore) {
+ try {
+ Section -ExcludeFromTOC -Style NOTOCHeading6 "$($DataStore.Name)" {
+ $OutObj = @()
+ Write-PScriboMessage "Discovered Datastore Information from $($DataStore.Name)."
+ $inObj = [ordered] @{
+ 'Path' = $DataStore.Path
+ 'Type' = $DataStore.DataStoreType
+ 'Capacity' = "$([math]::round($DataStore.CapacityMB / 1KB))GB"
+ 'Free Space' = "$([math]::round($DataStore.FreeSpaceMB / 1KB))GB"
+ 'Accessible' = $DataStore.Accessible
+ }
+
+ $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
+
+ if ($HealthCheck.DataStores.Status) {
+ $OutObj | Where-Object { $_.'Accessible' -eq 'No' } | Set-Style -Style Warning -Property 'Accessible'
+ }
+
+ $TableParams = @{
+ Name = "Datastores Details - $($DataStore.Name)"
+ List = $true
+ ColumnWidths = 50, 50
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZDesktopPool.ps1 b/1.1.5/Src/Private/Get-AbrHRZDesktopPool.ps1
new file mode 100644
index 0000000..8968840
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZDesktopPool.ps1
@@ -0,0 +1,710 @@
+function Get-AbrHRZDesktopPool {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "Pool Desktop InfoLevel set at $($InfoLevel.Inventory.Desktop)."
+ Write-PScriboMessage "Collecting Pool Desktop information."
+ }
+
+ process {
+ try {
+ if ($Pools) {
+ if ($InfoLevel.Inventory.Desktop -ge 1) {
+ Section -Style Heading3 "Desktop Pools" {
+ Paragraph "The following section details the Desktop Pools configuration for $($HVEnvironment.toUpper()) server."
+ BlankLine
+ $OutObj = @()
+ foreach ($Pool in $Pools) {
+ Write-PScriboMessage "Discovered Desktop Pool Information for Pool $($Pool.Base.Name)."
+ Switch ($Pool.Automateddesktopdata.ProvisioningType) {
+ 'INSTANT_CLONE_ENGINE' { $ProvisioningType = 'Instant Clone' }
+ 'VIRTUAL_CENTER' { $ProvisioningType = 'Full Virtual Machines' }
+ }
+
+ if ($Pool.Type -eq "MANUAL") {
+ $UserAssign = $Pool.ManualDesktopData.UserAssignment.UserAssignment
+ } else { $UserAssign = $Pool.AutomatedDesktopData.UserAssignment.UserAssignment }
+
+ $inObj = [ordered] @{
+ 'Name' = $Pool.Base.Name
+ 'Type' = $Pool.Type
+ 'Provisioning Type' = $ProvisioningType
+ 'User Assignment' = $UserAssign
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+
+ $TableParams = @{
+ Name = "Desktop Pools - $($HVEnvironment.toUpper())"
+ List = $false
+ ColumnWidths = 25, 25, 25, 25
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Sort-Object -Property 'Name' | Table @TableParams
+ try {
+ if ($InfoLevel.Inventory.Desktop -ge 2) {
+ Section -Style Heading4 "Desktop Pools Details" {
+ foreach ($Pool in $Pools) {
+ # Find Access Group for Desktop Pool
+ $AccessgroupsJoined = $hzServices.AccessGroup.AccessGroup_List() + $hzServices.AccessGroup.AccessGroup_List().Children
+ $AccessGroupMatch = $AccessgroupsJoined | Where-Object { $_.Id.id -eq $Pool.base.accessgroup.id }
+
+ if ($AccessGroupMatch) {
+ $AccessGroupName = $AccessGroupMatch.base.name
+ } else {
+ $AccessGroupName = '' # Set to a default value if no match is found
+ }
+ <#
+ # Find out Global Entitlement Group for Applications
+ $InstantCloneDomainAdminGroupMatch = $false
+ foreach ($InstantCloneDomainAdminGroup in $InstantCloneDomainAdminGroups) {
+ if ($InstantCloneDomainAdminGroup.Id.id -eq $Pool.automateddesktopdata.CustomizationSettings.CloneprepCustomizationSettings.InstantCloneEngineDomainAdministrator.id) {
+ $InstantCloneDomainAdminGroupDisplayName = $InstantCloneDomainAdmins.base.username
+ $InstantCloneDomainAdminGroupMatch = $true
+ }
+ if ($InstantCloneDomainAdminGroupMatch) {
+ break
+ }
+ }
+
+ # Find out Global Entitlement Group for Applications
+ $GlobalEntitlementMatch = $false
+ foreach ($GlobalEntitlement in $GlobalEntitlements) {
+ if ($GlobalEntitlement.Id.id -eq $Pool.globalentitlementdata.globalentitlement.id) {
+ $GlobalEntitlementDisplayName = $GlobalEntitlement.base.DisplayName
+ $GlobalEntitlementMatch = $true
+ }
+ if ($GlobalEntitlementMatch) {
+ break
+ }
+ }
+
+ $farmMatch = $false
+ foreach ($farm in $farms) {
+ if ($farm.Id.id -eq $Pool.rdsdesktopdata.farm.id) {
+ $FarmIDName = $farm.data.name
+ $farmMatch = $true
+ }
+ if ($farmMatch) {
+ break
+ }
+ }
+ #>
+ # Desktop OS Data
+ $DesktopAssignmentViewResultsDataMatch = $false
+ foreach ($DesktopAssignmentViewResult in $DesktopAssignmentViewResultsData.DesktopAssignmentData) {
+ if ($DesktopAssignmentViewResult.name -eq $Pool.Base.Name) {
+ $NumberofPoolMachines = $DesktopAssignmentViewResult.Name
+ $PooLOpperatingSystem = $DesktopAssignmentViewResult.OperatingSystem
+ $PoolOpperatingSystemArch = $DesktopAssignmentViewResult.OperatingSystemArchitecture
+ $DesktopAssignmentViewResultsDataMatch = $true
+ }
+ if ($DesktopAssignmentViewResultsDataMatch) {
+ break
+ }
+ }
+
+ # Find vCenter ID Name
+ $vCenterServerIDName = ''
+ $PoolGroups = $pool.manualdesktopdata.virtualcenter.id
+ foreach ($PoolGroup in $PoolGroups) {
+ foreach ($vCenterServer in $vCenterServers) {
+ if ($vCenterServer.Id.id -eq $PoolGroup) {
+ $vCenterServerIDName = $vCenterServer.serverspec.ServerName
+ break
+ }
+ }
+ if ($PoolGroups.count -gt 1) {
+ $vCenterServerIDNameResults += "$vCenterServerIDName, "
+ $vCenterServerIDName = $vCenterServerIDNameResults.TrimEnd(', ')
+ }
+ }
+
+ # Find vCenter Auto ID Name
+ $vCenterServerAutoIDName = ''
+ $PoolGroups = $Pool.automateddesktopdata.virtualcenter.id
+ foreach ($PoolGroup in $PoolGroups) {
+ foreach ($vCenterServer in $vCenterServers) {
+ if ($vCenterServer.Id.id -eq $PoolGroup) {
+ $vCenterServerAutoIDName = $vCenterServer.serverspec.ServerName
+ break
+ }
+
+ }
+ if ($PoolGroups.count -gt 1) {
+ $vCenterServerAutoIDNameResults += "$vCenterServerAutoIDName, "
+ $vCenterServerAutoIDName = $vCenterServerAutoIDNameResults.TrimEnd(', ')
+ }
+ }
+
+ # Find Base Image ID Name
+ $PoolBaseImage = ''
+ $PoolBaseImagePath = ''
+ if ($Pool.automateddesktopdata.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.ParentVM.id) {
+ foreach ($CompatibleBaseImageVM in $CompatibleBaseImageVMs) {
+ if ($CompatibleBaseImageVM.id.id -eq $Pool.automateddesktopdata.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.ParentVM.id) {
+ $PoolBaseImage = $CompatibleBaseImageVM.name
+ $PoolBaseImagePath = $CompatibleBaseImageVM.Path
+ break
+ }
+ }
+ }
+
+ # Get Pool Base Image Snapshot
+ $BaseImageSnapshotListLast = ''
+ if ( $Pool.automateddesktopdata.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.Snapshot.id) {
+ $BaseImageSnapshotList = $hzServices.BaseImageSnapshot.BaseImageSnapshot_List($Pool.automateddesktopdata.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.ParentVM)
+ $BaseImageSnapshotListLast = $BaseImageSnapshotList | Select-Object -Last 1
+ }
+
+ # DataCenters
+ $PoolDataCenterName = ''
+ $PoolDatacenterPath = ''
+ if ($Pool.automateddesktopdata.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.Datacenter.id) {
+ $DataCenterList = $hzServices.Datacenter.Datacenter_List($Pool.automateddesktopdata.virtualcenter)
+
+ # Find DataCenter ID Name
+ foreach ($DataCenter in $DataCenterList) {
+ if ($DataCenter.id.id -eq $Pool.automateddesktopdata.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.Datacenter.id) {
+ $PoolDataCenterName = $DataCenter.base.name
+ $PoolDatacenterPath = $DataCenter.base.Path
+ break
+ }
+ }
+ }
+
+ # VM Folder List
+ $VMFolder = ''
+ $VMFolderPath = ''
+ if ($Pool.automateddesktopdata.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.VmFolder.id) {
+
+ $VMFolderPath = $Pool.automateddesktopdata.VirtualCenterNamesData.VmFolderPath
+ $VMFolder = $VMFolderPath -replace '^(.*[\\\/])'
+ }
+
+ # VM Host or Cluster
+ $VMhostandCluter = ''
+ if ($Pool.automateddesktopdata.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.HostOrCluster.id) {
+ #$HostAndCluster = $hzServices.HostOrCluster.HostOrCluster_GetHostOrClusterTree($Pool.automateddesktopdata.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.Datacenter)
+ $VMhostandCluterPath = $Pool.automateddesktopdata.VirtualCenterNamesData.HostOrClusterPath
+ $VMhostandCluter = $VMhostandCluterPath -replace '^(.*[\\\/])'
+ }
+
+ # VM Resource Pool
+ $VMResourcePool = ''
+ if ($Pool.automateddesktopdata.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.ResourcePool.id) {
+ #$ResourcePoolTree = $hzServices.ResourcePool.ResourcePool_GetResourcePoolTree($Pool.automateddesktopdata.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.Datacenter)
+ $VMResourcePoolPath = $Pool.automateddesktopdata.VirtualCenterNamesData.ResourcePoolPath
+ $VMResourcePool = $VMResourcePoolPath -replace '^(.*[\\\/])'
+ }
+
+ <#
+ # VM Persistent Disk DataStores
+ if ($Pool.automateddesktopdata.VirtualCenterNamesData.PersistentDiskDatastorePaths){
+ $VMPersistentDiskDatastorePath = $Pool.automateddesktopdata.VirtualCenterNamesData.PersistentDiskDatastorePaths
+ $VMPersistentDiskDatastore = $VMPersistentDiskDatastorePath -replace '^(.*[\\\/])'
+ }
+ #>
+
+ # VM Network Card
+ if ($Pool.automateddesktopdata.VirtualCenterProvisioningSettings.VirtualCenterNetworkingSettings.nics.nic.id) {
+ $NetworkInterfaceCardList = $hzServices.NetworkInterfaceCard.NetworkInterfaceCard_ListBySnapshot($BaseImageSnapshotListLast.Id)
+ }
+
+ # VM AD Container
+ $PoolContainerName = ''
+ if ($Pool.automateddesktopdata.CustomizationSettings.AdContainer.id) {
+ foreach ($ADDomain in $ADDomains) {
+ $ADDomainID = ($ADDomain.id.id -creplace '^[^/]*/', '')
+ if ($Pool.automateddesktopdata.CustomizationSettings.AdContainer.id -like "ADContainer/$ADDomainID/*") {
+ $ADContainers = $hzServices.ADContainer.ADContainer_ListByDomain($ADDomain.id)
+ foreach ($ADContainer in $ADContainers) {
+ if ($ADContainer.id.id -eq $Pool.automateddesktopdata.CustomizationSettings.AdContainer.id) {
+ $PoolContainerName = $ADContainer.rdn
+ break
+ }
+ }
+ }
+ }
+ }
+
+ # Black out Times
+ $BlackOutDates = $pool.ManualDesktopData.ViewStorageAcceleratorSettings.BlackoutTimes
+ $BlackOutDateString = $BlackOutDates | Format-Table | Out-String
+
+ # Pool Customization Type
+ $Customizations = ('')
+ If ($pool.AutomatedDesktopData.CustomizationSettings.CustomizationType -eq "SYS_PREP") {
+ Foreach ($vCenterServer in $vCenterServers) {
+ $Customizations = $hzServices.CustomizationSpec.CustomizationSpec_List($vCenterServer.id)
+ Foreach ($Customization in $Customizations) {
+ if ($pool.AutomatedDesktopData.CustomizationSettings.SysprepCustomizationSettings.CustomizationSpec.id -eq $Customization.id.id) {
+ $PoolCustomization = $($Customization.CustomizationSpecData.Name)
+ }
+ }
+ }
+ }
+ # VM Template
+ $PoolTemplateName = ''
+ if ($Pool.automateddesktopdata.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.Template.id) {
+ foreach ($Template in $CompatibleTemplateVMs) {
+ if ($Template.id.id -eq $Pool.automateddesktopdata.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.Template.id) {
+ $PoolTemplateName = $Template.name
+ break
+ }
+ }
+ }
+ try {
+ Section -Style NOTOCHeading5 "Pool - $($Pool.Base.name)" {
+ $SupportedDisplayProtocolsresult = ''
+ $SupportedDisplayProtocols = $Pool.DesktopSettings.DisplayProtocolSettings | ForEach-Object { $_.SupportedDisplayProtocols }
+ $SupportedDisplayProtocolsresult = $SupportedDisplayProtocols -join ', '
+
+ $StorageOvercommitsresult = ''
+ $StorageOvercommit = $Pool.automateddesktopdata.VirtualCenterProvisioningSettings.VirtualCenterStorageSettings.datastores | ForEach-Object { $_.StorageOvercommit }
+ $StorageOvercommitsresult = $StorageOvercommit -join ', '
+
+ $DatastoreFinal = ''
+ Switch ($Pool.Type) {
+ 'MANUAL' { $POOLDST = $Pool.ManualDesktopData.VirtualCenterNamesData }
+ default { $POOLDST = $Pool.automateddesktopdata.VirtualCenterNamesData }
+ }
+ $DatastorePaths = $POOLDST | ForEach-Object { $_.DatastorePaths }
+ foreach ($Datastore in $DatastorePaths) {
+ $Datastorename = $Datastore -replace '^(.*[\\\/])'
+ $DatastoreFinal += $DatastoreName -join "`r`n" | Out-String
+ }
+ #$DatastorePathsresult = $DatastorePaths -join ', '
+ try {
+ Section -ExcludeFromTOC -Style NOTOCHeading5 "General Summary - $($Pool.Base.name)" {
+ $OutObj = @()
+ Write-PScriboMessage "Discovered $($Pool.Base.name) General Information."
+ $inObj = [ordered] @{
+ 'Name' = $Pool.Base.name
+ 'Display Name' = $Pool.base.displayName
+ 'Description' = $Pool.base.description
+ 'Access Group' = $AccessGroupName
+ 'Enabled' = $Pool.DesktopSettings.Enabled
+ 'Type' = $Pool.Type
+ 'Machine Source' = Switch ($pool.Source) {
+ 'INSTANT_CLONE_ENGINE' { 'vCenter(Instant Clone)' }
+ 'VIRTUAL_CENTER' { 'vCenter' }
+ default { $pool.Source }
+ }
+ 'Provisioning Type' = Switch ($Pool.Automateddesktopdata.ProvisioningType) {
+ 'INSTANT_CLONE_ENGINE' { 'Instant Clone' }
+ 'VIRTUAL_CENTER' { 'Full Virtual Machines' }
+ default { $Pool.Automateddesktopdata.ProvisioningType }
+ }
+ 'Enabled for Provisioning' = $Pool.automateddesktopdata.VirtualCenterProvisioningSettings.EnableProvisioning
+ 'Client Restrictions Enabled' = $Pool.DesktopSettings.ClientRestrictions
+ }
+
+ if ($Pool.Type -eq 'MANUAL') {
+ $inObj.Remove('Provisioning Type')
+ $inObj.Remove('Enabled for Provisioning')
+ }
+
+ $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
+
+ $TableParams = @{
+ Name = "General - $($Pool.Base.name)"
+ List = $true
+ ColumnWidths = 50, 50
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ try {
+ Section -ExcludeFromTOC -Style NOTOCHeading5 "Detailed Settings - $($Pool.Base.name)" {
+ $OutObj = @()
+ Write-PScriboMessage "Discovered $($Pool.Base.name) Pool Setting Information."
+ $inObj = [ordered] @{
+ 'Name' = $Pool.Base.name
+ 'Display Name' = $Pool.base.displayName
+ 'Description' = $Pool.base.description
+ 'Access Group' = $AccessGroupName
+ 'Enabled' = $Pool.DesktopSettings.Enabled
+ 'Type' = $Pool.Type
+ 'Machine Source' = Switch ($pool.Source) {
+ 'INSTANT_CLONE_ENGINE' { 'vCenter(Instant Clone)' }
+ 'VIRTUAL_CENTER' { 'vCenter' }
+ default { $pool.Source }
+ }
+ 'Provisioning Type' = Switch ($Pool.Automateddesktopdata.ProvisioningType) {
+ 'INSTANT_CLONE_ENGINE' { 'Instant Clone' }
+ 'VIRTUAL_CENTER' { 'Full Virtual Machines' }
+ default { $Pool.Automateddesktopdata.ProvisioningType }
+ }
+ 'Enabled for Provisioning' = $Pool.automateddesktopdata.VirtualCenterProvisioningSettings.EnableProvisioning
+ 'Client Restrictions Enabled' = $Pool.DesktopSettings.ClientRestrictions
+
+ 'Max Number of Machines' = $pool.automateddesktopdata.vmnamingsettings.patternnamingsettings.MaxNumberOfMachines
+ 'Min number of Machines' = $pool.automateddesktopdata.vmnamingsettings.patternnamingsettings.MinNumberOfMachines
+ 'Number of Spare Machines' = $pool.automateddesktopdata.vmnamingsettings.patternnamingsettings.NumberOfSpareMachines
+ 'Connection Server Restrictions' = [string]($Pool.DesktopSettings.ConnectionServerRestrictions -join ",")
+ 'Stop Provisioning on Error' = $Pool.automateddesktopdata.VirtualCenterProvisioningSettings.StopProvisioningOnError
+ 'Add Virtual TPM' = $Pool.automateddesktopdata.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.AddVirtualTPM
+ 'Minimum Number of Machines Ready' = $Pool.automateddesktopdata.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.MinReadyVMsOnVComposerMaintenance
+ 'Naming Method' = $Pool.automateddesktopdata.VmNamingSettings.NamingMethod
+ 'Naming Pattern' = $pool.automateddesktopdata.vmnamingsettings.patternnamingsettings.namingpattern
+ 'Power Policy' = $Pool.DesktopSettings.LogoffSettings.PowerPolicy
+ 'Provisioning Time' = $pool.automateddesktopdata.vmnamingsettings.patternnamingsettings.ProvisioningTime
+ 'Automatic Logoff Policy' = $Pool.DesktopSettings.LogoffSettings.AutomaticLogoffPolicy
+ 'Automatic Logoff Minutes' = $Pool.DesktopSettings.LogoffSettings.AutomaticLogoffMinutes
+ 'Allow Users to Reset Machines' = $Pool.DesktopSettings.LogoffSettings.AllowUsersToResetMachines
+ 'Allow Multiple Sessions Per User' = $Pool.DesktopSettings.LogoffSettings.AllowMultipleSessionsPerUser
+ 'Delete or Refresh Machine After Logoff' = $Pool.DesktopSettings.LogoffSettings.DeleteOrRefreshMachineAfterLogoff
+ 'Refresh OS Disk After Logoff' = $Pool.DesktopSettings.LogoffSettings.RefreshOsDiskAfterLogoff
+ 'Refresh Period Days for Replica OS Disk' = $Pool.DesktopSettings.LogoffSettings.RefreshPeriodDaysForReplicaOsDisk
+ 'Refresh Threshold Percentage For Replica OS Disk' = $Pool.DesktopSettings.LogoffSettings.RefreshThresholdPercentageForReplicaOsDisk
+ 'Empty Session Timeout Policy' = $Pool.DesktopSettings.LogoffSettings.EmptySessionTimeoutPolicy
+ 'Empty Session Timeout Minutes' = $Pool.DesktopSettings.LogoffSettings.EmptySessionTimeoutMinutes
+ 'Log off After Timeout' = $Pool.DesktopSettings.LogoffSettings.LogoffAfterTimeout
+ 'Prelaunch Session Timeout Policy' = $Pool.DesktopSettings.LogoffSettings.PreLaunchSessionTimeoutPolicy
+ 'Prelaunch Session Timeout Minutes' = $Pool.DesktopSettings.LogoffSettings.PreLaunchSessionTimeoutMinutes
+ 'Session Timeout Policy' = $Pool.DesktopSettings.LogoffSettings.SessionTimeoutPolicy
+ 'Category Folder Name' = $pool.DesktopSettings.CategoryFolderName
+ 'Client Restrictions' = $Pool.DesktopSettings.ClientRestrictions
+ 'Shortcut Locations' = $Pool.DesktopSettings.ShortcutLocations
+ 'Allow Users to use Multiple Sessions Per User' = $Pool.DesktopSettings.LogoffSettings.AllowMultipleSessionsPerUser
+ 'Supported Session Types' = $Pool.DesktopSettings.SupportedSessionTypes
+ 'Cloud Managed' = $Pool.DesktopSettings.CloudManaged
+ 'Cloud Assigned' = $Pool.DesktopSettings.CloudAssigned
+ 'Display Assigned Machine Name' = $Pool.DesktopSettings.DisplayAssignedMachineName
+ 'Display Machine Alias' = $Pool.DesktopSettings.DisplayMachineAlias
+ 'Supported Display Protocols' = $SupportedDisplayProtocolsresult
+ 'Default Display Protocol' = $Pool.DesktopSettings.DisplayProtocolSettings.DefaultDisplayProtocol
+ 'Allow Users to Choose Protocol' = $Pool.DesktopSettings.DisplayProtocolSettings.AllowUsersToChooseProtocol
+ 'Enable HTML Access' = $Pool.DesktopSettings.DisplayProtocolSettings.EnableHTMLAccess
+ 'Enable Collaboration' = $Pool.DesktopSettings.DisplayProtocolSettings.EnableCollaboration
+ 'Renderer 3D' = $Pool.DesktopSettings.DisplayProtocolSettings.PcoipDisplaySettings.Renderer3D
+ 'Enable GRID vGPUs' = $Pool.DesktopSettings.DisplayProtocolSettings.PcoipDisplaySettings.EnableGRIDvGPUs
+ 'vGPU Grid Profile' = $Pool.DesktopSettings.DisplayProtocolSettings.PcoipDisplaySettings.VGPUGridProfile
+ 'vRam Size MB' = $Pool.DesktopSettings.DisplayProtocolSettings.PcoipDisplaySettings.VRamSizeMB
+ 'Max Number of Monitors' = $Pool.DesktopSettings.DisplayProtocolSettings.PcoipDisplaySettings.MaxNumberOfMonitors
+ 'Max Resolution of Any One Monitor' = $Pool.DesktopSettings.DisplayProtocolSettings.PcoipDisplaySettings.MaxResolutionOfAnyOneMonitor
+ 'Use View Storage Accelerator' = $pool.ManualDesktopData.ViewStorageAcceleratorSettings.UseViewStorageAccelerator
+ 'Regenerate View Storage Accelerator Days' = $pool.ManualDesktopData.ViewStorageAcceleratorSettings.RegenerateViewStorageAcceleratorDays
+ 'Black Out Times' = $BlackOutDateString
+ 'Transparent Page Sharing Scope' = $Pool.ManualDesktopData.VirtualCenterManagedCommonSettings.TransparentPageSharingScope
+ }
+ if ($Pool.Type -eq 'AUTOMATED') {
+ $inObj.Remove('Use View Storage Accelerator')
+ $inObj.Remove('Regenerate View Storage Accelerator Days')
+ $inObj.Remove('Black Out Times')
+ $inObj.Remove('Transparent Page Sharing Scope')
+ }
+
+ if ($Pool.Type -eq 'MANUAL') {
+ $inObj.Remove('Max Number of Machines')
+ $inObj.Remove('Min number of Machines')
+ $inObj.Remove('Number of Spare Machines')
+ $inObj.Remove('Connection Server Restrictions')
+ $inObj.Remove('Stop Provisioning on Error')
+ $inObj.Remove('Naming Method')
+ $inObj.Remove('Naming Pattern')
+ $inObj.Remove('Provisioning Time')
+ $inObj.Remove('Refresh Period Days for Replica OS Disk')
+ $inObj.Remove('Refresh Threshold Percentage For Replica OS Disk')
+ }
+
+ if ($Pool.Type -eq 'RDS') {
+ $inObj.Remove('Max Number of Machines')
+ $inObj.Remove('Min number of Machines')
+ $inObj.Remove('Number of Spare Machines')
+ $inObj.Remove('Stop Provisioning on Error')
+ $inObj.Remove('Naming Method')
+ $inObj.Remove('Naming Pattern')
+ $inObj.Remove('Provisioning Time')
+ $inObj.Remove('Refresh Period Days for Replica OS Disk')
+ $inObj.Remove('Refresh Threshold Percentage For Replica OS Disk')
+ }
+
+ $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
+
+ $TableParams = @{
+ Name = "Pool Settings - $($Pool.Base.name)"
+ List = $true
+ ColumnWidths = 50, 50
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ try {
+ Section -ExcludeFromTOC -Style NOTOCHeading5 "vCenter Server Settings - $($Pool.Base.name)" {
+ $OutObj = @()
+ Write-PScriboMessage "Discovered $($Pool.Base.name) vCenter Server Information."
+ $inObj = [ordered] @{
+ 'Virtual Center' = Switch ($Pool.Type) {
+ 'MANUAL' { $vCenterServerIDName }
+ default { $vCenterServerAutoIDName }
+ }
+ 'Template' = $PoolTemplateName
+ 'Parent VM' = $PoolBaseImage
+ 'Parent VM Path' = $PoolBaseImagePath
+ 'Current Number of Machines' = $NumberofPoolMachines
+ 'Parent Operating System' = $PooLOpperatingSystem
+ 'Parent Operating System Architecture' = $PoolOpperatingSystemArch
+ 'Snapshot' = $BaseImageSnapshotListLast.name
+ 'Snapshot Path' = $BaseImageSnapshotListLast.path
+ 'Datacenter' = $PoolDataCenterName
+ 'Datacenter Path' = $PoolDatacenterPath
+ 'VM Folder' = $VMFolder
+ 'VM Folder Path' = Switch ($Pool.Type) {
+ 'MANUAL' { $Pool.ManualDesktopData.VirtualCenterNamesData.VmFolderPath }
+ default { $Pool.automateddesktopdata.VirtualCenterNamesData.VmFolderPath }
+ }
+ 'Host or Cluster' = $VMhostandCluter
+ 'Host or Cluster Path' = Switch ($Pool.Type) {
+ 'MANUAL' { $Pool.ManualDesktopData.VirtualCenterNamesData.HostOrClusterPath }
+ default { $Pool.automateddesktopdata.VirtualCenterNamesData.HostOrClusterPath }
+ }
+ 'Resource Pool' = $VMResourcePool
+ 'Resource Pool Path' = Switch ($Pool.Type) {
+ 'MANUAL' { $Pool.ManualDesktopData.VirtualCenterNamesData.ResourcePoolPath }
+ default { $Pool.automateddesktopdata.VirtualCenterNamesData.ResourcePoolPath }
+ }
+ 'Datastores' = $DatastoreFinal
+ 'Datastores Storage Over-Commit' = $StorageOvercommitsresult
+ 'Use VSAN' = $pool.AutomatedDesktopData.VirtualCenterProvisioningSettings.VirtualCenterStorageSettings.usevsan
+ 'Storage Cluster Path' = $pool.AutomatedDesktopData.VirtualCenterNamesData.SdrsClusterPath
+ 'View Storage Accelerator' = Switch ($Pool.Type) {
+ 'MANUAL' { $Pool.ManualDesktopData.ViewStorageAcceleratorSettings.UseViewStorageAccelerator }
+ 'AUTOMATED' { $Pool.AutomatedDesktopData.VirtualCenterProvisioningSettings.VirtualCenterStorageSettings.ViewStorageAcceleratorSettings.UseViewStorageAccelerator }
+ default { 'Not Supported' }
+ }
+ 'Transparent Page Sharing Scope' = Switch ($Pool.Type) {
+ 'MANUAL' { $Pool.ManualDesktopData.VirtualCenterManagedCommonSettings.TransparentPageSharingScope }
+ 'AUTOMATED' { $Pool.AutomatedDesktopData.VirtualCenterManagedCommonSettings.TransparentPageSharingScope }
+ default { 'Not Supported' }
+ }
+ 'Replica Disk Datastore Path' = $Pool.automateddesktopdata.VirtualCenterNamesData.ReplicaDiskDatastorePath
+ 'Networks' = Switch ($Pool.AutomatedDesktopData.VirtualCenterNamesData.NetworkLabelNames) {
+ $null { 'Golden Image network selected' }
+ default { $Pool.AutomatedDesktopData.VirtualCenterNamesData.NetworkLabelNames }
+ }
+ 'Network Card' = $NetworkInterfaceCardList.data.name
+ 'Network Label Enabled' = $pool.AutomatedDesktopData.VirtualCenterProvisioningSettings.VirtualCenterNetworkingSettings.nics.NetworkLabelAssignmentSpecs.Enabled
+ 'Network Nic Name' = $pool.AutomatedDesktopData.VirtualCenterProvisioningSettings.VirtualCenterNetworkingSettings.nics.NicName
+ 'Network Label Names' = [string]($Pool.DesktopSettings.ConnectionServerRestrictions -join ",")
+ 'Network Max Label Type' = $pool.AutomatedDesktopData.VirtualCenterProvisioningSettings.VirtualCenterNetworkingSettings.nics.NetworkLabelAssignmentSpecs.MaxLabelType
+ 'Network Max Label' = $pool.AutomatedDesktopData.VirtualCenterProvisioningSettings.VirtualCenterNetworkingSettings.nics.NetworkLabelAssignmentSpecs.MaxLabel
+ 'Customization Type' = $Pool.automateddesktopdata.CustomizationSettings.CustomizationType
+ 'Customization Spec Name' = $Pool.automateddesktopdata.CustomizationSettings.CustomizationSpecName
+ 'Power off Script Name' = $pool.AutomatedDesktopData.CustomizationSettings.CloneprepCustomizationSettings.PowerOffScriptName
+ 'Power off Script Parameters' = $pool.AutomatedDesktopData.CustomizationSettings.CloneprepCustomizationSettings.PowerOffScriptParameters
+ 'Post Synchronization Script Name' = $pool.AutomatedDesktopData.CustomizationSettings.CloneprepCustomizationSettings.PostSynchronizationScriptName
+ 'Post Synchronization Script Parameters' = $pool.AutomatedDesktopData.CustomizationSettings.CloneprepCustomizationSettings.PostSynchronizationScriptParameters
+ 'Priming Computer Account' = $pool.AutomatedDesktopData.CustomizationSettings.CloneprepCustomizationSettings.PrimingComputerAccount
+ 'Guest Customization Account' = ($InstantCloneDomainAdmins | Where-Object { $_.id.id -eq $Pool.automateddesktopdata.CustomizationSettings.InstantCloneEngineDomainAdministrator.id }).Base.Username
+ 'No Customization Settings' = $pool.AutomatedDesktopData.CustomizationSettings.NoCustomizationSettings
+ 'Sysprep Customization Settings' = $PoolCustomization
+ 'Quick Prep Customization Settings' = $pool.AutomatedDesktopData.CustomizationSettings.QuickprepCustomizationSettings
+ 'Ad Container' = $PoolContainerName
+ 'Reuse Pre-Existing Accounts' = $Pool.automateddesktopdata.CustomizationSettings.ReusePreExistingAccounts
+ 'Image Management Stream' = $pool.AutomatedDesktopData.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.ImageManagementStream
+ 'Image Management Tag' = $pool.AutomatedDesktopData.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.ImageManagementTag
+ 'Compute Profile' = $pool.AutomatedDesktopData.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.ComputeProfile
+ }
+
+ if ($Pool.Automateddesktopdata.ProvisioningType -eq 'VIRTUAL_CENTER') {
+ $inObj.Remove('Parent VM')
+ $inObj.Remove('Parent VM Path')
+ $inObj.Remove('Snapshot')
+ $inObj.Remove('Snapshot Path')
+ $inObj.Remove('VM Folder')
+ $inObj.Remove('VM Folder Path')
+ $inObj.Remove('Datastores')
+ $inObj.Remove('Datastores Storage Over-Commit')
+ $inObj.Remove('Replica Disk Datastore Path')
+ $inObj.Remove('Pool Customization Type')
+ $inObj.Remove('Pool Domain Administrator')
+ $inObj.Remove('Pool Reuse Pre-Existing Accounts')
+ $inObj.Remove('Ad Container')
+ $inObj.Remove('Reuse Pre-Existing Accounts')
+ $inObj.Remove('Customization Type')
+ }
+
+ if ($Pool.Type -eq 'MANUAL') {
+ $inObj.Remove('Template')
+ $inObj.Remove('Parent VM')
+ $inObj.Remove('Parent VM Path')
+ $inObj.Remove('Snapshot')
+ $inObj.Remove('Snapshot Path')
+ $inObj.Remove('VM Folder')
+ $inObj.Remove('VM Folder Path')
+ $inObj.Remove('Datastores')
+ $inObj.Remove('Datastores Storage Over-Commit')
+ $inObj.Remove('Replica Disk Datastore Path')
+ $inObj.Remove('Pool Customization Type')
+ $inObj.Remove('Pool Domain Administrator')
+ $inObj.Remove('Pool Reuse Pre-Existing Accounts')
+ $inObj.Remove('Ad Container')
+ $inObj.Remove('Reuse Pre-Existing Accounts')
+ $inObj.Remove('Customization Type')
+ $inObj.Remove('Datacenter')
+ $inObj.Remove('Datacenter Path')
+ $inObj.Remove('Host or Cluster')
+ $inObj.Remove('Host or Cluster Path')
+ $inObj.Remove('Resource Pool')
+ $inObj.Remove('Resource Pool Path')
+ $inObj.Remove('Networks')
+ $inObj.Remove('Guest Customization Account')
+ }
+
+ if ($Pool.Automateddesktopdata.ProvisioningType -eq 'INSTANT_CLONE_ENGINE') {
+ $inObj.Remove('Template')
+
+ }
+
+ if ([string]::IsNullOrEmpty($pool.AutomatedDesktopData.CustomizationSettings.CloneprepCustomizationSettings)) {
+ $inObj.Remove('Power off Script Name')
+ $inObj.Remove('Power Off Script Parameters')
+ $inObj.Remove('Post Synchronization Script Name')
+ $inObj.Remove('Post Synchronization Script Parameters')
+ $inObj.Remove('Priming Computer Account')
+ }
+
+ $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
+
+ $TableParams = @{
+ Name = "vCenter Server Settings - $($Pool.Base.name)"
+ List = $true
+ ColumnWidths = 40, 60
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+
+ if ($InfoLevel.Inventory.Desktop -ge 3) {
+ try {
+ Section -ExcludeFromTOC -Style NOTOCHeading6 "Pool Machine Summary - $($Pool.Base.name)" {
+ $OutObj = @()
+ foreach ($Machine in $Machines) {
+ if($Machine.Base.Name) {
+ If ($Machine.Base.DesktopName -like $Pool.base.Name) {
+ $inObj = [ordered] @{
+ 'Machine Name' = $Machine.Base.Name
+ 'Agent Version' = $Machine.Base.AgentVersion
+ 'User' = $Machine.Base.User
+ 'Host' = $Machine.ManagedMachineData.VirtualCenterData.Hostname
+ 'Data Store' = $Machine.ManagedMachineData.VirtualCenterData.VirtualDisks.DatastorePath
+ 'Basic State' = $Machine.Base.BasicState
+ }
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+ }
+ }
+ $TableParams = @{
+ Name = "Pool Machine Summary - $($Pool.Base.Name)"
+ List = $false
+ ColumnWidths = 15, 10, 20, 25, 15, 15
+ }
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Sort-Object -Property 'Name' | Table @TableParams
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+
+ }
+
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ try {
+ if($EntitledUserOrGrouplocalMachines | Where-Object { $_.localData.Desktops.id -eq $Pool.Id.id }){
+ Section -ExcludeFromTOC -Style NOTOCHeading6 "Desktop Pools Entitlements - $($Pool.Base.Name)" {
+ try {
+ $OutObj = @()
+ Write-PScriboMessage "Discovered Desktop Pool Entitlements Information for - $($Pool.Base.Name)."
+ foreach ($Principal in ($EntitledUserOrGrouplocalMachines | Where-Object { $_.localData.Desktops.id -eq $Pool.Id.id })) {
+ if($Principal.Base.LoginName){
+ Write-PScriboMessage "Discovered Desktop Pool Entitlements Name for - $($Principal.Base.LoginName)."
+ $inObj = [ordered] @{
+ 'Name' = $Principal.Base.LoginName
+ 'Domain' = $Principal.Base.Domain
+ 'Is Group?' = $Principal.Base.Group
+ }
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+ }
+ $TableParams += @{
+ Name = "Desktop Pools Entitlements - $($Pool.Base.Name)"
+ List = $false
+ ColumnWidths = 34, 33, 33
+ }
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Sort-Object -Property 'Name' | Table @TableParams
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZDomain.ps1 b/1.1.5/Src/Private/Get-AbrHRZDomain.ps1
new file mode 100644
index 0000000..bc21697
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZDomain.ps1
@@ -0,0 +1,113 @@
+function Get-AbrHRZDomain {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "InstantCloneDomainAccounts InfoLevel set at $($InfoLevel.Settings.InstantClone.InstantCloneDomainAccounts)."
+ Write-PScriboMessage "Collecting Instant Clone Domain Accounts information."
+ }
+
+ process {
+ try {
+ Section -Style Heading2 "Domains" {
+ if ($InstantCloneDomainAdmins) {
+ if ($InfoLevel.Settings.InstantClone.InstantCloneDomainAccounts -ge 1) {
+ Section -Style Heading3 "Domain Accounts" {
+ Paragraph "The following section details the Domain Accounts configuration for $($HVEnvironment.toUpper()) server."
+ BlankLine
+ $OutObj = @()
+ foreach ($InstantCloneDomainAdmin in $InstantCloneDomainAdmins) {
+ try {
+ Write-PScriboMessage "Discovered Domain Accounts Information."
+ $inObj = [ordered] @{
+ 'User Name' = $InstantCloneDomainAdmin.Base.UserName
+ 'Domain Name' = $InstantCloneDomainAdmin.NamesData.DnsName
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+
+ $TableParams = @{
+ Name = "Domain Accounts - $($HVEnvironment.toUpper())"
+ List = $false
+ ColumnWidths = 50, 50
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Sort-Object -Property 'User Name' | Table @TableParams
+ }
+ }
+ }
+ if ($Domains) {
+ if ($InfoLevel.Settings.Servers.vCenterServers.ADDomains -ge 1) {
+ Section -Style Heading3 "Connection Server Domain Status" {
+ Paragraph "The following section shows connection servers domains for $($HVEnvironment.toUpper()) environment."
+ BlankLine
+ $OutObj = @()
+ foreach ($Domain in $Domains) {
+ try {
+ Write-PScriboMessage "Discovered Domain Information $($Domain.DNSName)."
+ $inObj = [ordered] @{
+ 'Domain DNS Name' = $Domain.DNSName
+ 'Status' = $Domain.ConnectionServerState[0].Status
+ 'Trust Relationship' = $Domain.ConnectionServerState[0].TrustRelationship
+ 'Connection Status' = $Domain.ConnectionServerState[0].Contactable
+
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+
+ if ($HealthCheck.DataStores.Status) {
+ $OutObj | Where-Object { $_.'Status' -eq 'ERROR' } | Set-Style -Style Warning
+ }
+
+ $TableParams = @{
+ Name = "Connection Server Domain Status- $($HVEnvironment.toUpper())"
+ List = $false
+ ColumnWidths = 25, 25, 25, 25
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Sort-Object -Property 'Name' | Table @TableParams
+ }
+ }
+ }
+ }
+
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZESXi.ps1 b/1.1.5/Src/Private/Get-AbrHRZESXi.ps1
new file mode 100644
index 0000000..2054e7e
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZESXi.ps1
@@ -0,0 +1,117 @@
+function Get-AbrHRZESXi {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "Esxi Servers InfoLevel set at $($InfoLevel.Settings.Servers.vCenterServers.ESXiHosts)."
+ Write-PScriboMessage "Collecting Esxi Servers information."
+ }
+
+ process {
+ try {
+ if ($vCenterHealth) {
+ if ($InfoLevel.Settings.Servers.vCenterServers.ESXiHosts -ge 1) {
+ Section -Style NOTOCHeading5 "ESXi Hosts" {
+ Paragraph "The following section details the hardware information of ESXi Hosts for $($HVEnvironment.toUpper()) server."
+ BlankLine
+ $ESXHosts = $vCenterHealth.hostdata
+ foreach ($ESXCLUSTER in ($ESXHosts.ClusterName | Select-Object -Unique)) {
+ Section -Style NOTOCHeading5 "$($ESXCLUSTER) Cluster" {
+ $OutObj = @()
+ try {
+ foreach ($ESXHost in ($ESXHosts | Where-Object { $_.ClusterName -eq $ESXCLUSTER })) {
+ Write-PScriboMessage "Discovered ESXI Server Information from $($ESXCLUSTER)."
+ $inObj = [ordered] @{
+ 'Name' = $ESXHost.Name
+ 'Version' = $ESXHost.Version
+ 'API Version' = $ESXHost.APIVersion
+ 'Status' = $ESXHost.Status
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+ if ($HealthCheck.ESXiHosts.Status) {
+ $OutObj | Where-Object { $_.'Status' -ne 'CONNECTED' } | Set-Style -Style Warning
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+
+ $TableParams = @{
+ Name = "ESXI Hosts - $($ESXCLUSTER)"
+ List = $false
+ ColumnWidths = 25, 25, 25, 25
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Sort-Object -Property 'Name' | Table @TableParams
+ try {
+ if ($InfoLevel.Settings.Servers.vCenterServers.ESXiHosts -ge 2) {
+ foreach ($ESXHost in ($ESXHosts | Where-Object { $_.ClusterName -eq $ESXCLUSTER })) {
+ if ($ESXHost.Name) {
+ try {
+ Section -ExcludeFromTOC -Style NOTOCHeading6 "$($ESXHost.Name) Details" {
+ Write-PScriboMessage "Discovered ESXI Server Information from $($ESXHost.Name)."
+ $inObj = [ordered] @{
+ 'CPU Cores' = $ESXHost.NumCpuCores
+ 'CPU in Mhz' = $ESXHost.CpuMhz
+ 'Memory Size' = "$([math]::round($ESXHost.MemorySizeBytes / 1GB))GB"
+ 'vGPU Types' = $ESXHost.VGPUTypes
+ 'VDI Machines' = $ESXHost.NumMachines
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+
+ $TableParams = @{
+ Name = "ESXI Hosts - $($ESXHost.Name)"
+ List = $true
+ ColumnWidths = 50, 50
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ }
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZEventConf.ps1 b/1.1.5/Src/Private/Get-AbrHRZEventConf.ps1
new file mode 100644
index 0000000..b9198a9
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZEventConf.ps1
@@ -0,0 +1,147 @@
+function Get-AbrHRZEventConf {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "EventDatabase InfoLevel set at $($InfoLevel.Settings.EventConfiguration.EventDatabase)."
+ Write-PScriboMessage "Collecting Event Configuration information."
+ }
+
+ process {
+ try {
+ if ($EventDataBases -or $Syslog) {
+ if ($InfoLevel.Settings.EventConfiguration.PSObject.Properties.Value -ne 0) {
+ Section -Style Heading2 "Event Configuration" {
+ Paragraph "The following section details on the events configuration information for $($HVEnvironment.toUpper())."
+ BlankLine
+ if ($InfoLevel.Settings.EventConfiguration.EventDatabase -ge 1) {
+ try {
+ Section -Style Heading3 "Event Database" {
+ $OutObj = @()
+ foreach ($EventDataBase in $EventDataBases) {
+ Write-PScriboMessage "Discovered Event Database Information."
+ $inObj = [ordered] @{
+ 'Server' = $EventDataBase.database.Server
+ 'Type' = $EventDataBase.database.Type
+ 'Port' = $EventDataBase.database.Port
+ 'Name' = $EventDataBase.database.Name
+ 'User Name' = $EventDataBase.database.UserName
+ 'Table Prefix' = $EventDataBase.database.TablePrefix
+ 'Show Events for' = $EventDataBase.Settings.ShowEventsForTime
+ 'Classify Events as New for' = "$($EventDataBase.Settings.ClassifyEventsAsNewForDays) Days"
+ 'Timing Profiler Events' = "$($EventDataBase.Settings.TimingProfilerDataLongevity) Days"
+ 'Enabled' = $EventDataBases.EventDatabaseSet
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+
+ if ($HealthCheck.EventConfiguration.EventDatabase) {
+ $OutObj | Where-Object { $_.'Enabled' -eq 'No' } | Set-Style -Style Warning -Property 'Enabled'
+ }
+
+ $TableParams = @{
+ Name = "Event Database - $($HVEnvironment.split(".").toUpper()[0])"
+ List = $true
+ ColumnWidths = 50, 50
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ if ($InfoLevel.Settings.EventConfiguration.Syslog -ge 1 -and $Syslog.UdpData.Enabled) {
+ try {
+ Section -Style Heading3 "Syslog Configuration" {
+ $OutObj = @()
+ foreach ($Logging in $Syslog.UdpData.NetworkAddresses) {
+ Write-PScriboMessage "Discovered Syslog Information."
+ $inObj = [ordered] @{
+ 'Server' = $Logging.split(':')[0]
+ 'Port' = $Logging.split(':')[1]
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+
+ $TableParams = @{
+ Name = "Syslog Configuration - $($HVEnvironment.split(".").toUpper()[0])"
+ List = $false
+ ColumnWidths = 50, 50
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Sort-Object -Property 'Server' | Table @TableParams
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ if ($InfoLevel.Settings.EventConfiguration.EventstoFileSystem -ge 1 -and ($Syslog.FileData.Enabled -or $Syslog.FileData.EnabledOnError)) {
+ try {
+ Section -Style Heading3 "Events to File System" {
+ $OutObj = @()
+ foreach ($Logging in $Syslog) {
+ Write-PScriboMessage "Discovered Events to File System Information."
+ $inObj = [ordered] @{
+ 'Enabled' = $Logging.FileData.Enabled
+ 'Enabled on Error' = $Logging.FileData.EnabledOnError
+ 'Path' = $Logging.FileData.UncPath
+ 'User name' = $Logging.FileData.UncUserName
+ 'Domain' = $Logging.FileData.UncDomain
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+
+ $TableParams = @{
+ Name = "Events to File System - $($HVEnvironment.split(".").toUpper()[0])"
+ List = $true
+ ColumnWidths = 50, 50
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZFarm.ps1 b/1.1.5/Src/Private/Get-AbrHRZFarm.ps1
new file mode 100644
index 0000000..06e322d
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZFarm.ps1
@@ -0,0 +1,315 @@
+function Get-AbrHRZFarm {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "Farm InfoLevel set at $($InfoLevel.Inventory.Farms)."
+ Write-PScriboMessage "Collecting Farm information."
+ }
+
+ process {
+ try {
+ if ($Farms) {
+ if ($InfoLevel.Inventory.Farms -ge 1) {
+ Section -Style Heading3 "Farm Pools" {
+ Paragraph "The following section details the Farms configuration for $($HVEnvironment.toUpper()[0]) server."
+ BlankLine
+ $OutObj = @()
+ foreach ($Farm in $Farms) {
+ Write-PScriboMessage "Discovered Farms Information."
+ $inObj = [ordered] @{
+ 'Name' = $Farm.Data.displayName
+ 'Type' = $Farm.Type
+ 'Enabled' = $Farm.Data.Enabled
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+
+ if ($HealthCheck.Farms.Status) {
+ $OutObj | Where-Object { $_.'Enabled' -eq 'No' } | Set-Style -Style Warning -Property 'Enabled'
+ }
+
+ $TableParams = @{
+ Name = "Farms - $($HVEnvironment.toUpper()[0])"
+ List = $false
+ ColumnWidths = 34, 33, 33
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Sort-Object -Property 'Name' | Table @TableParams
+ try {
+ if ($InfoLevel.Inventory.Farms -ge 2) {
+ Section -Style Heading4 "Farm Pools Details" {
+ foreach ($Farm in $Farms) {
+ Section -Style NOTOCHeading5 $($Farm.Data.name) {
+ # Find out Access Group for Applications
+ $AccessgroupMatch = $false
+ $AccessgroupJoined = @()
+ $AccessgroupJoined += $Accessgroups
+ $AccessgroupJoined += $Accessgroups.Children
+ foreach ($Accessgroup in $AccessgroupJoined) {
+ if ($Accessgroup.Id.id -eq $Farm.data.accessgroup.id) {
+ $AccessGroupName = $Accessgroup.base.name
+ $AccessgroupMatch = $true
+ }
+ if ($AccessgroupMatch) {
+ break
+ }
+ }
+
+ # Farm AD Container
+ $FarmContainerName = ''
+ if ($Farm.AutomatedFarmData.CustomizationSettings.AdContainer.id) {
+ foreach ($ADDomain in $ADDomains) {
+ $ADDomainID = ($ADDomain.id.id -creplace '^[^/]*/', '')
+ if ($Farm.AutomatedFarmData.CustomizationSettings.AdContainer.id -like "ADContainer/$ADDomainID/*") {
+ $ADContainers = $hzServices.ADContainer.ADContainer_ListByDomain($ADDomain.id)
+ foreach ($ADContainer in $ADContainers) {
+ if ($ADContainer.id.id -eq $Farm.AutomatedFarmData.CustomizationSettings.AdContainer.id) {
+ $FarmContainerName = $ADContainer.rdn
+ break
+ }
+ }
+ }
+ }
+ }
+
+ # Farm Customization Type
+ $Customizations = ('')
+ If ($Farm.AutomatedFarmData.CustomizationSettings.SysprepCustomizationSettings.CustomizationSpec) {
+ Foreach ($vCenterServer in $vCenterServers) {
+ $Customizations = $hzServices.CustomizationSpec.CustomizationSpec_List($vCenterServer.id)
+ Foreach ($Customization in $Customizations) {
+ if ($Farm.AutomatedFarmData.CustomizationSettings.SysprepCustomizationSettings.CustomizationSpec.id -eq $Customization.id.id) {
+ $FarmCustomization = $($Customization.CustomizationSpecData.Name)
+ }
+ }
+ }
+ }
+
+ try {
+ Section -ExcludeFromTOC -Style NOTOCHeading5 "General" {
+ $OutObj = @()
+ Write-PScriboMessage "Discovered $($Farm.Data.name) General Information."
+ $inObj = [ordered] @{
+ 'Pool Name' = $Farm.Data.name
+ 'Display Name' = $Farm.Data.displayName
+ 'Description' = $Farm.Data.description
+ 'Access Group' = $AccessGroupName
+ 'Type' = $Farm.Type
+ 'Source' = $Farm.Source
+ 'Enabled' = $Farm.Data.Enabled
+ 'Deleting' = $Farm.Data.Deleting
+ 'Desktop' = $Farm.Data.Desktop
+ 'App Volumes Server' = $Farm.Data.AppVolumesManagerGuid
+ 'Default Display Protocol' = $Farm.Data.DisplayProtocolSettings.DefaultDisplayProtocol
+ 'Allow Users to Choose Protocol' = $Farm.Data.DisplayProtocolSettings.AllowDisplayProtocolOverride
+ 'HTML Access' = $Farm.Data.DisplayProtocolSettings.EnableHTMLAccess
+ 'Enable Grid GPUs' = $Farm.Data.DisplayProtocolSettings.EnableGridGpu
+ 'vGPU Profile' = $Farm.Data.DisplayProtocolSettings.VGPUGridProfile
+ }
+
+ $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
+
+ if ($HealthCheck.Farms.Status) {
+ $OutObj | Where-Object { $_.'Enabled' -eq 'No' } | Set-Style -Style Warning -Property 'Enabled'
+ }
+
+ $TableParams = @{
+ Name = "General Information - $($Farm.Data.name)"
+ List = $true
+ ColumnWidths = 50, 50
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ try {
+ Section -ExcludeFromTOC -Style NOTOCHeading5 "Load Balancing Settings" {
+ $OutObj = @()
+ Write-PScriboMessage "Discovered $($Farm.Data.name) Load Balancing Settings."
+ $inObj = [ordered] @{
+ 'Use Custom Script' = $Farm.Data.LbSettings.UseCustomScript
+ 'Include Session Count' = $Farm.Data.LbSettings.LbMetricsSettings.IncludeSessionCount
+ 'CPU Usage Threshold' = $Farm.Data.LbSettings.LbMetricsSettings.CpuThreshold
+ 'Memory Usage Threshold' = $Farm.Data.LbSettings.LbMetricsSettings.MemThreshold
+ 'Disk Queue Length Threshold' = $Farm.Data.LbSettings.LbMetricsSettings.DiskQueueLengthThreshold
+ 'Disk Read Latency Threshold' = $Farm.Data.LbSettings.LbMetricsSettings.DiskReadLatencyThreshold
+ 'Disk Write Latency Threshold' = $Farm.Data.LbSettings.LbMetricsSettings.DiskWriteLatencyThreshold
+
+ }
+
+ $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
+
+ $TableParams = @{
+ Name = "Load Balancing Settings - $($Farm.Data.name)"
+ List = $true
+ ColumnWidths = 50, 50
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ try {
+ Section -ExcludeFromTOC -Style NOTOCHeading5 "Provisioning Settings" {
+ $OutObj = @()
+ Write-PScriboMessage "Discovered $($Farm.Data.name) Settings."
+ $inObj = [ordered] @{
+ 'Provisioning Enabled' = $Farm.AutomatedFarmData.VirtualCenterProvisioningSettings.EnableProvisioning
+ 'Stop Provisioning on Error' = $Farm.AutomatedFarmData.VirtualCenterProvisioningSettings.StopProvisioningOnError
+ 'Disconnected Session Timeout Minutes' = $Farm.Data.settings.DisconnectedSessionTimeoutMinutes
+ 'Disconnected Session Timeout Policy' = $Farm.Data.settings.DisconnectedSessionTimeoutPolicy
+ 'Empty Session Timeout Minutes' = $Farm.Data.settings.EmptySessionTimeoutMinutes
+ 'Empty Session Timeout Policy' = $Farm.data.Settings.EmptySessionTimeoutPolicy
+ 'Log off After Timeout' = $Farm.data.Settings.LogoffAfterTimeout
+ }
+
+ $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
+
+ if ($HealthCheck.Farms.Status) {
+ $OutObj | Where-Object { $_.'Provisioning Enabled' -eq 'No' } | Set-Style -Style Warning -Property 'Provisioning Enabled'
+ }
+
+ $TableParams = @{
+ Name = "Provisioning Settings - $($Farm.Data.name)"
+ List = $true
+ ColumnWidths = 50, 50
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ try {
+ Section -ExcludeFromTOC -Style NOTOCHeading6 "vCenter Server Settings" {
+ $OutObj = @()
+ Write-PScriboMessage "Discovered $($Farm.Data.name) vCenter Server Settings Information."
+ $inObj = [ordered] @{
+ 'VM folder' = $Farm.AutomatedFarmData.VirtualCenterNamesData.VmFolderPath
+ 'Host Or Cluster Path' = $Farm.AutomatedFarmData.VirtualCenterNamesData.HostOrClusterPath
+ 'Resource Pool' = $Farm.AutomatedFarmData.VirtualCenterNamesData.ResourcePoolPath
+ 'Golden Image' = $Farm.AutomatedFarmData.VirtualCenterNamesData.ParentVmPath
+ 'Snapshot' = $Farm.AutomatedFarmData.VirtualCenterNamesData.SnapshotPath
+ 'Datastore Paths' = ($Farm.AutomatedFarmData.VirtualCenterNamesData.DatastorePaths | ForEach-Object { $_.Split('/')[4] }) -join ', '
+ 'Networks' = Switch ($Farm.AutomatedFarmData.VirtualCenterNamesData.NetworkLabelNames) {
+ $null { 'Golden Image network selected' }
+ default { $Farm.AutomatedFarmData.VirtualCenterNamesData.NetworkLabelNames }
+ }
+ }
+
+ $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
+
+ $TableParams = @{
+ Name = "vCenter Settings - $($Farm.Data.name)"
+ List = $true
+ ColumnWidths = 50, 50
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+
+ try {
+ Section -ExcludeFromTOC -Style NOTOCHeading5 "Guest Customization" {
+ $OutObj = @()
+ Write-PScriboMessage "Guest Customization $($Farm.Data.name) Settings."
+ $inObj = [ordered] @{
+ 'Guest Customization' = $Farm.AutomatedFarmData.CustomizationSettings.CustomizationType
+ 'Guest Customization Domain and Account' = ($InstantCloneDomainAdmins | Where-Object { $_.Id.id -eq $Farm.AutomatedFarmData.CustomizationSettings.InstantCloneEngineDomainAdministrator.id }).Base.UserName
+ 'Allow Reuse of Existing Computer Accounts' = $Farm.AutomatedFarmData.CustomizationSettings.ReusePreExistingAccounts
+ 'AD Container' = $FarmContainerName
+ 'Farm Customization Specification' = $FarmCustomization
+ 'Power Off Script Name' = $Farm.AutomatedFarmData.CustomizationSettings.CloneprepCustomizationSettings.PowerOffScriptName
+ 'Power Off Script Parameters' = $Farm.AutomatedFarmData.CustomizationSettings.CloneprepCustomizationSettings.PowerOffScriptParameters
+ 'Post Sync Script Name' = $Farm.AutomatedFarmData.CustomizationSettings.CloneprepCustomizationSettings.PostSynchronizationScriptName
+ 'Post Sync Script Parameters' = $Farm.AutomatedFarmData.CustomizationSettings.CloneprepCustomizationSettings.PostSynchronizationScriptParameters
+ 'Priming Computer Account' = $Farm.AutomatedFarmData.CustomizationSettings.CloneprepCustomizationSettings.PrimingComputerAccount
+ }
+
+ $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
+
+ if ($Farm.AutomatedFarmData.CustomizationSettings.SysprepCustomizationSettings.CustomizationSpec -eq "SYS_PREP") {
+ $inObj.Remove('Power Off Script Name')
+ $inObj.Remove('Power Off Script Parameters')
+ $inObj.Remove('Post Sync Script Name')
+ $inObj.Remove('Post Sync Script Parameters')
+ $inObj.Remove('Priming Computer Account')
+
+ }
+
+
+
+ $TableParams = @{
+ Name = "Guest Customization - $($Farm.Data.name)"
+ List = $true
+ ColumnWidths = 50, 50
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+
+
+ }
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZFederationAccessGroup.ps1 b/1.1.5/Src/Private/Get-AbrHRZFederationAccessGroup.ps1
new file mode 100644
index 0000000..9ce3790
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZFederationAccessGroup.ps1
@@ -0,0 +1,135 @@
+function Get-AbrHRZFederationAccessGroup {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "Role Permissions InfoLevel set at $($InfoLevel.Settings.Administrators.RolePermissions)."
+ Write-PScriboMessage "Collecting Role Federation Access Groups information."
+ }
+
+ process {
+ try {
+ if ($Permissions) {
+ if ($InfoLevel.Settings.Administrators.FederationAccessGroup -ge 1) {
+ Section -Style Heading3 "Federation Access Groups" {
+ Paragraph "The following section details the Federation Access Group information for $($HVEnvironment.toUpper()) server."
+ BlankLine
+ $OutObj = @()
+
+ $FilteredPermissions = ''
+ $FilteredPermissions = $Permissions | Where-Object { $null -ne $_.base.GlobalAccessGroup }
+
+ foreach ($Permission in $FilteredPermissions) {
+
+ $AdministratorIDNameResults = ''
+ # Find Administrator ID Name
+ $AdministratorIDName = ''
+ $PermissionGroups = $Permission.base.UserOrGroup.id
+ foreach ($PermissionGroup in $PermissionGroups) {
+ foreach ($Administrator in $Administrators) {
+ if ($Administrator.Id.id -eq $PermissionGroup) {
+ $AdministratorIDName = $Administrator.base.name
+ break
+ }
+ }
+ if ($PermissionGroups.count -gt 1) {
+ $AdministratorIDNameResults += "$AdministratorIDName, "
+ $AdministratorIDName = $AdministratorIDNameResults.TrimEnd(', ')
+ }
+ }
+ Switch ($AdministratorIDName) {
+ '' { $AdministratorIDName = 'N/A' }
+ ' ' { $AdministratorIDName = 'N/A' }
+ }
+
+ # Mach Permission Role ID with Role ID
+ # Find Role ID Name
+ $RoleIDName = ''
+ $PermissionGroups = $Permission.base.Role.id
+ foreach ($PermissionGroup in $PermissionGroups) {
+
+ foreach ($Role in $Roles) {
+ if ($Role.Id.id -eq $PermissionGroup) {
+ $RoleIDName = $Role.base.name
+ break
+ }
+
+ }
+ if ($PermissionGroups.count -gt 1) {
+ $RoleIDNameResults += "$RoleIDName, "
+ $RoleIDName = $RoleIDNameResults.TrimEnd(', ')
+ $RoleIDName = [string](($RoleIDName.split(', ') | Select-Object -Unique) -join ', ')
+ }
+ }
+
+ # Find AccessGroup ID Name
+ $GlobalAccessGroupIDName = ''
+ $PermissionGroups = $Permission.base.GlobalAccessGroup.id
+ if ($PermissionGroups) {
+ foreach ($PermissionGroup in $PermissionGroups) {
+ if ($PermissionGroup) {
+ if ($GlobalAccessGroups) {
+ foreach ($GlobalAccessGroup in $GlobalAccessGroups) {
+ if ($GlobalAccessGroup) {
+ if ($GlobalAccessGroup.Id.id -eq $PermissionGroup) {
+ $GlobalAccessGroupIDName = "/$($GlobalAccessGroup.base.name)"
+ } elseif ($GlobalAccessGroup.Children.id.id -eq $PermissionGroup) {
+ $GlobalAccessGroupIDName = "/Root/$(($AccessGroup.Children | Where-Object {$_.id.id -eq $PermissionGroup}).Base.Name)"
+ }
+ $GlobalAccessGroupIDName = $GlobalAccessGroupIDName.TrimStart('/')
+ }
+ }
+ }
+ }
+ }
+ }
+ $inObj = [ordered] @{
+ 'User or Group Name' = $AdministratorIDName
+ 'Role' = $RoleIDName
+ 'Global Access Group' = $GlobalAccessGroupIDName
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+ $TableParams = @{
+ Name = "Role Permissions - $($HVEnvironment.toUpper())"
+ List = $false
+ ColumnWidths = 33, 33, 34
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Sort-Object -Property 'User or Group Name' | Table @TableParams
+
+
+
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZGatewayCert.ps1 b/1.1.5/Src/Private/Get-AbrHRZGatewayCert.ps1
new file mode 100644
index 0000000..f8b1244
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZGatewayCert.ps1
@@ -0,0 +1,66 @@
+function Get-AbrHRZGatewayCert {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "Gatway Certificate InfoLevel set at $($InfoLevel.Settings.Servers.ConnectionServers.ConnectionServers)."
+ Write-PScriboMessage "Collecting Gatway Certificate information."
+ }
+
+ process {
+ try {
+ if ($GatewayCerts) {
+ if ($InfoLevel.Settings.CloudPodArch.CloudPodArch -ge 1) {
+ Section -Style Heading3 "Gateway Certificate" {
+ Paragraph "The following section details on the gateway certificate information for $($HVEnvironment.toUpper())."
+ BlankLine
+ Write-PScriboMessage "Working on Gateway Certificate Information for $($HVEnvironment.toUpper())."
+ $OutObj = @()
+ foreach ($GatewayCert in $GatewayCerts) {
+ $inObj = [ordered] @{
+ 'Certificate Name' = $GatewayCert.CertificateName
+ 'Common Name' = $GatewayCert.CommonName
+ 'Issuer' = $GatewayCert.Issuer
+ 'Expiry Date' = $GatewayCert.ExpiryDate
+ 'Serial Number' = $GatewayCert.SerialNum
+ }
+ $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+ $TableParams = @{
+ Name = "Gateway Certificate - $($HVEnvironment.toUpper())"
+ List = $true
+ ColumnWidths = 30, 70
+ }
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZGlobalEntitlement.ps1 b/1.1.5/Src/Private/Get-AbrHRZGlobalEntitlement.ps1
new file mode 100644
index 0000000..f98e1bb
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZGlobalEntitlement.ps1
@@ -0,0 +1,283 @@
+function Get-AbrHRZGlobalEntitlement {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "Global Entitlements InfoLevel set at $($InfoLevel.Inventory.GlobalEntitlements)."
+ Write-PScriboMessage "Collecting Global Entitlements information."
+ }
+
+ process {
+ try {
+ if ($GlobalEntitlements) {
+
+ if ($InfoLevel.Inventory.GlobalEntitlements -ge 1) {
+ Section -Style Heading3 "Global Entitlements" {
+ Paragraph "The following section details the Global Entitlements configuration for $($HVEnvironment.toUpper()) server."
+ BlankLine
+
+ $GlobalEntitlements | ForEach-Object { $_ | Add-Member -MemberType NoteProperty -Name "GE_Type" -Value "Desktop" }
+ $GlobalApplicationEntitlementGroups | ForEach-Object { $_ | Add-Member -MemberType NoteProperty -Name "GE_Type" -Value "Application" }
+ $GlobalEntitlementJoined = @()
+ $GlobalEntitlementJoined += $GlobalEntitlements
+ $GlobalEntitlementJoined += $GlobalApplicationEntitlementGroups
+
+ $OutObj = @()
+ foreach ($GlobalEntitlement in $GlobalEntitlementJoined) {
+ Write-PScriboMessage "Discovered Global Entitlements Information."
+ $GlobalEntitlementPodCount = ($GlobalEntitlement.data.memberpods.id).count
+ if ($GlobalEntitlement.Data.LocalApplicationCount) {
+ $Type = 'Application'
+ } elseif ($GlobalEntitlement.Data.LocalDesktopCount) {
+ $Type = 'Desktop'
+ }
+ $inObj = [ordered] @{
+ 'Name' = $GlobalEntitlement.base.DisplayName
+ 'Type' = $Type
+ 'Number of Pods' = $GlobalEntitlementPodCount
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+
+ $TableParams = @{
+ Name = "Global Entitlements - $($HVEnvironment.toUpper())"
+ List = $false
+ ColumnWidths = 34, 33, 33
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Sort-Object -Property 'Name' | Table @TableParams
+
+
+ Section -Style Heading4 "Global Entitlement Summary Details" {
+ foreach ($GlobalEntitlement in $GlobalEntitlementJoined) {
+
+ Write-PScriboMessage "Discovered Global Entitlements Detailed Information for $($GlobalEntitlement.base.DisplayName)."
+ try {
+ if ($InfoLevel.Inventory.GlobalEntitlements -ge 2) {
+ Section -Style NOTOCHeading5 "Summary - $($GlobalEntitlement.base.DisplayName)" {
+
+ $SupportedDisplayProtocolsresult = ''
+ $SupportedDisplayProtocols = $GlobalEntitlement.base | ForEach-Object { $_.SupportedDisplayProtocols }
+ $SupportedDisplayProtocolsresult = $SupportedDisplayProtocols -join ', '
+
+ if ($GlobalEntitlement.Data.LocalApplicationCount) {
+ $Type = 'Application'
+ } elseif ($GlobalEntitlement.Data.LocalDesktopCount) {
+ $Type = 'Desktop'
+ }
+
+ $GlobalAccessGroupID = $($hzServices.GlobalAccessGroup.GlobalAccessGroup_Get($GlobalEntitlement.base.GlobalAccessGroupId).base.Name)
+
+ $OutObj = @()
+ Write-PScriboMessage "Discovered Global Entitlement Data for $HVEnvironment"
+ $inObj = [ordered] @{
+ 'Display Name' = $GlobalEntitlement.base.DisplayName
+ 'Alias Name' = $GlobalEntitlement.base.AliasName
+ 'Description' = $GlobalEntitlement.base.DisplayName.description
+ 'Scope' = $GlobalEntitlement.base.Scope
+ 'From Home Site' = $GlobalEntitlement.base.FromHome
+ 'Require Home Site' = $GlobalEntitlement.base.RequireHomeSite
+ 'Multiple Session Auto Clean' = $GlobalEntitlement.base.MultipleSessionAutoClean
+ 'Enabled' = $GlobalEntitlement.base.Enabled
+ 'Supported Display Protocols' = $SupportedDisplayProtocolsresult
+ 'Default Display Protocol' = $GlobalEntitlement.base.DefaultDisplayProtocol
+ 'Allow Users to Choose Display Protocol' = $GlobalEntitlement.base.AllowUsersToChooseProtocol
+ 'Allow User to Reset Machines' = $GlobalEntitlement.base.AllowUsersToResetMachines
+ 'Enable HTML Access' = $GlobalEntitlement.base.EnableHTMLAccess
+ 'Allow Multiple Sessions Per User' = $GlobalEntitlement.base.AllowMultipleSessionsPerUser
+ 'Enable Pre-Launch' = $GlobalEntitlement.base.EnablePreLaunch
+ 'Connection Server Restrictions' = $GlobalEntitlement.base.ConnectionServerRestrictions
+ 'Enable Prelaunch' = $GlobalEntitlement.base.EnablePreLaunch
+ 'Category Folder Name' = $GlobalEntitlement.base.CategoryFolderName
+ 'Client Restrictions' = $GlobalEntitlement.base.ClientRestrictions
+ 'Enable Collaboration' = $GlobalEntitlement.base.EnableCollaboration
+ 'Shortcut Locations' = $($GlobalEntitlement.base.ShortcutLocations -join ', ')
+ 'Multisession Mode' = $GlobalEntitlement.base.MultiSessionMode
+ 'Backup GAE' = $GlobalEntitlement.base.BackupGAE
+ 'Display Assigned Machine Name' = $GlobalEntitlement.base.DisplayAssignedMachineName
+ 'Display Machine Alias' = $GlobalEntitlement.base.DisplayMachineAlias
+ 'Global Access Group ID' = $GlobalAccessGroupID
+ }
+
+ $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
+
+ if ($Type -eq 'Desktop') {
+ $inObj.Remove('Enable Pre-Launch')
+ $inObj.Remove('Multi Session Mode')
+ }
+
+
+ if ($Type -eq 'Application') {
+ $inObj.Remove('Allow User to Reset Machines')
+ $inObj.Remove('Allow Multiple Sessions Per User')
+ $inObj.Remove('Enable Collaboration')
+ $inObj.Remove('Display Assigned Machine Name')
+ $inObj.Remove('Display Machine Alias')
+ }
+
+
+ $TableParams = @{
+ Name = "Detailed Information - $($GlobalEntitlement.base.DisplayName)"
+ List = $true
+ ColumnWidths = 50, 50
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+
+ try {
+ $OutObj = @()
+ Section -Style NOTOCHeading6 "Local Pools - $($GlobalEntitlement.base.DisplayName)" {
+ try {
+ Write-PScriboMessage "Discovered Local Pools Information for $($HVEnvironment.toUpper())."
+
+ $GEPodMembers = $GlobalEntitlement.data.MemberPods.id
+ $PodSiteID = ('')
+
+ Foreach ($GEPodMember in $GEPodMembers) {
+ Foreach ($CPSite in $CloudPodLists) {
+ If ($CPSite.id.id -eq $GEPodMember) {
+ $PodSiteID += $CPSite.DisplayName
+ }
+ }
+ }
+
+ $PodMembers = ''
+ $PodMembers = ForEach-Object { $PodSiteID }
+ $PodMemberList = $PodMembers -join ', '
+
+ $inObj = [ordered] @{
+ 'Local Desktop Count' = $GlobalEntitlement.data.LocalDesktopCount
+ 'Local Application Count' = $GlobalEntitlement.data.LocalApplicationCount
+ 'Remote Desktop Count' = $GlobalEntitlement.data.RemoteDesktopCount
+ 'Remote Application Count' = $GlobalEntitlement.data.RemoteApplicationCount
+ 'User Count' = $GlobalEntitlement.data.UserCount
+ 'User or Group Count' = $GlobalEntitlement.data.UserGroupCount
+ 'User or Group Site Override Count' = $GlobalEntitlement.data.UserGroupSiteOverrideCount
+ 'Member Pods' = $PodMemberList
+ }
+ $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
+
+ if ($Type -eq 'Application') {
+ $inObj.Remove('Local Desktop Count')
+ $inObj.Remove('Remote Desktop Count')
+ }
+
+ if ($Type -eq 'Desktop') {
+ $inObj.Remove('Local Application Count')
+ $inObj.Remove('Remote Application Count')
+ }
+
+ $TableParams = @{
+ Name = "Local Pools - $($HVEnvironment.toUpper())"
+ List = $true
+ ColumnWidths = 30, 70
+ }
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+
+ # Users and Groups
+ try {
+
+ Section -Style NOTOCHeading6 "Users and Groups - $($GlobalEntitlement.base.DisplayName)" {
+ $OutObj = @()
+ try {
+ Write-PScriboMessage "Discovered Users and Groups - $($GlobalEntitlement.base.DisplayName)."
+
+ foreach ($EntitledUserOrGroupGlobal in $EntitledUserOrGroupGlobals) {
+ Switch ($EntitledUserOrGroupGlobal.base.Group) {
+ 'True' { $GlobalEntitledGroup = 'Group' }
+ 'False' { $GlobalEntitledGroup = 'User' }
+ }
+ $EntitledDefined = @()
+
+
+ foreach ($GE in $($EntitledUserOrGroupGlobal.GlobalData.GlobalEntitlements.id -split [Environment]::NewLine)) {
+ if ($GlobalEntitlement.Id.id -eq $GE) {
+ $EntitledDefined += $EntitledUserOrGroupGlobal
+ }
+ }
+ foreach ($GEA in $($EntitledUserOrGroupGlobal.GlobalData.GlobalApplicationEntitlements.id -split [Environment]::NewLine)) {
+ if ($GlobalEntitlement.Id.id -eq $GEA) {
+ $EntitledDefined += $EntitledUserOrGroupGlobal
+ }
+ }
+
+ foreach ($ED in $EntitledDefined) {
+ $inObj = [ordered] @{
+ 'Name' = $ED.Base.Name
+ 'User or Group' = $GlobalEntitledGroup
+ 'Domain' = $ED.Base.Domain
+ }
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+
+ } # End If Group or User
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+
+ $TableParams = @{
+ Name = "Users and Groups - $($GlobalEntitlement.base.DisplayName)"
+ List = $false
+ ColumnWidths = 40, 30, 30
+ }
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ }
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZGlobalPolicy.ps1 b/1.1.5/Src/Private/Get-AbrHRZGlobalPolicy.ps1
new file mode 100644
index 0000000..057c60d
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZGlobalPolicy.ps1
@@ -0,0 +1,68 @@
+function Get-AbrHRZGlobalpolicy {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "Global Policies InfoLevel set at $($InfoLevel.Settings.GlobalPolicies.GlobalPolicies)."
+ Write-PScriboMessage "Collecting Global Policies information."
+ }
+
+ process {
+ try {
+ if ($GlobalPolicies) {
+ if ($InfoLevel.Settings.GlobalPolicies.GlobalPolicies -ge 1) {
+ Section -Style Heading2 "Global Policies" {
+ Paragraph "The following section details on the Global Policies information for $($HVEnvironment.toUpper())."
+ BlankLine
+ $OutObj = @()
+
+ Write-PScriboMessage "Discovered Global Policies Information."
+ $inObj = [ordered] @{
+ 'Allow Multimedia Redirection' = $GlobalPolicies.GlobalPolicies.AllowMultimediaRedirection
+ 'Allow USB Access' = $GlobalPolicies.GlobalPolicies.AllowUSBAccess
+ 'Allow Remote Mode' = $GlobalPolicies.GlobalPolicies.AllowRemoteMode
+ 'Allow PCoIP Hardware Acceleration' = $GlobalPolicies.GlobalPolicies.AllowPCoIPHardwareAcceleration
+ 'PCoIP Hardware Acceleration Priority' = $GlobalPolicies.GlobalPolicies.PcoipHardwareAccelerationPriority
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+
+ $TableParams = @{
+ Name = "Global Policies - $($HVEnvironment.toUpper())"
+ List = $true
+ ColumnWidths = 50, 50
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZGlobalSetting.ps1 b/1.1.5/Src/Private/Get-AbrHRZGlobalSetting.ps1
new file mode 100644
index 0000000..5721f62
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZGlobalSetting.ps1
@@ -0,0 +1,161 @@
+function Get-AbrHRZGlobalSetting {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "GlobalSettings InfoLevel set at $($InfoLevel.Settings.GlobalSettings.GlobalSettings)."
+ Write-PScriboMessage "Collecting Global Settings information."
+ }
+
+ process {
+ try {
+ if ($GlobalSettings.GeneralData) {
+ if ($InfoLevel.Settings.GlobalSettings.GlobalSettings -ge 1) {
+ Section -Style Heading2 "Global Settings" {
+ Paragraph "The following section details the Global Settings configuration for $($HVEnvironment.toUpper()) server."
+ BlankLine
+ Section -Style Heading3 "General Settings" {
+ $OutObj = @()
+ Write-PScriboMessage "Discovered Global Settings Information."
+ $inObj = [ordered] @{
+ 'Client Session Time Out Policy' = $GlobalSettings.GeneralData.ClientIdleSessionTimeoutPolicy
+ 'Client Max Session Time Minutes ' = $GlobalSettings.GeneralData.ClientMaxSessionTimeMinutes
+ 'Client Idle Session Timeout Policy' = $GlobalSettings.GeneralData.ClientIdleSessionTimeoutPolicy
+ 'Client Idle Session Timeout Minutes' = $GlobalSettings.GeneralData.ClientIdleSessionTimeoutMinutes
+ 'Client Session Timeout Minutes ' = $GlobalSettings.GeneralData.ClientSessionTimeoutMinutes
+ 'Desktop SSO Timeout Policy' = $GlobalSettings.GeneralData.DesktopSSOTimeoutPolicy
+ 'Desktop SSO Timeout Minutes' = $GlobalSettings.GeneralData.DesktopSSOTimeoutMinutes
+ 'Application SSO Timeout Policy' = $GlobalSettings.GeneralData.ApplicationSSOTimeoutPolicy
+ 'Application SSO Timeout Minutes' = $GlobalSettings.GeneralData.ApplicationSSOTimeoutMinutes
+ 'View API Session Timeout Minutes' = $GlobalSettings.GeneralData.ViewAPISessionTimeoutMinutes
+ 'Pre-Login Message' = $GlobalSettings.GeneralData.PreLoginMessage
+ 'Display Warning Before Forced Logoff' = $GlobalSettings.GeneralData.DisplayWarningBeforeForcedLogoff
+ 'Forced Logoff Timeout Minutes' = $GlobalSettings.GeneralData.ForcedLogoffTimeoutMinutes
+ 'Forced Logoff Message' = $GlobalSettings.GeneralData.ForcedLogoffMessage
+ 'Enable Server in Single User Mode' = $GlobalSettings.GeneralData.EnableServerInSingleUserMode
+ 'Store CAL on Broker' = $GlobalSettings.GeneralData.StoreCALOnBroker
+ 'Store CAL on Client' = $GlobalSettings.GeneralData.StoreCALOnClient
+ 'Enable UI User Name Caching' = $GlobalSettings.GeneralData.EnableUIUserNameCaching
+ 'Console Session Timeout in Minutes' = $GlobalSettings.GeneralData.ConsoleSessionTimeoutMinutes
+ 'Enable Automatic Status Updates' = $GlobalSettings.GeneralData.EnableAutomaticStatusUpdates
+ 'Send Domain List' = $GlobalSettings.GeneralData.SendDomainList
+ 'Enable Credential Cleanup for HTML Access' = $GlobalSettings.GeneralData.EnableCredentialCleanupForHTMLAccess
+ 'Hide Server Information In Client' = $GlobalSettings.GeneralData.HideServerInformationInClient
+ 'Hide Domain List In Client' = $GlobalSettings.GeneralData.HideDomainListInClient
+ 'Enable Multi Factor Reauthentication' = $GlobalSettings.GeneralData.EnableMultiFactorReAuth
+ 'Disconnect Warning Time' = $GlobalSettings.GeneralData.DisconnectWarningTime
+ 'Disconnect Warning Message' = $GlobalSettings.GeneralData.DisconnectWarningMessage
+ 'Disconnect Message' = $GlobalSettings.GeneralData.DisconnectMessage
+ 'Display Pre-login Admin Banner' = $GlobalSettings.GeneralData.DisplayPreLoginAdminBanner
+ 'Pre-Login Admin Banner Header' = $GlobalSettings.GeneralData.PreLoginAdminBannerHeader
+ 'Pre-Login Admin Banner Message' = $GlobalSettings.GeneralData.PreLoginAdminBannerMessage
+ 'Enforce CSRF Protection' = $GlobalSettings.GeneralData.EnorceCSRFProtection
+ 'Enforce E2E Encryption' = $GlobalSettings.GeneralData.EnforceE2EEncryption
+
+
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+
+ $TableParams = @{
+ Name = "Global Settings - $($HVEnvironment.toUpper())"
+ List = $true
+ ColumnWidths = 50, 50
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+
+ try {
+ if ($InfoLevel.Settings.GlobalSettings.GlobalSettings -ge 2) {
+ Section -Style Heading3 "Security Settings" {
+ $OutObj = @()
+ Write-PScriboMessage "Discovered Security Settings Information."
+ $inObj = [ordered] @{
+ 'Reauthenticate Secure Tunnel After Interruption' = $GlobalSettings.SecurityData.ReauthSecureTunnelAfterInterruption
+ 'Disallow Enhanced Security Mode' = $GlobalSettings.SecurityData.DisallowEnhancedSecurityMode
+ 'No Managed Certs' = $GlobalSettings.SecurityData.NoManagedCerts
+ 'Message Security Mode' = $GlobalSettings.SecurityData.MessageSecurityMode
+ 'Message Security Status' = $GlobalSettings.SecurityData.MessageSecurityStatus
+ 'Enable IP Sec for Security Server Pairing' = $GlobalSettings.SecurityData.EnableIPSecForSecurityServerPairing
+ }
+ $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
+
+ $TableParams = @{
+ Name = "Security Settings - $($HVEnvironment.toUpper())"
+ List = $true
+ ColumnWidths = 50, 50
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+
+ try {
+ if ($InfoLevel.Settings.GlobalSettings.GlobalSettings -ge 2) {
+ Section -Style Heading3 "Client Restriction Settings" {
+ $OutObj = @()
+ Write-PScriboMessage "Discovered Client Restriction Settings Information."
+ foreach ($CLientData in $GlobalSettings.ClientRestrictionConfiguration.ClientData) {
+ $inObj = [ordered] @{
+ 'Type' = $CLientData.Type
+ 'Version' = $CLientData.Version
+ 'Warn Specific Versions' = $CLientData.WarnSpecificVersions
+ 'Block Specific Versions' = $CLientData.BlockSpecificVersions
+ }
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+
+ $TableParams = @{
+ Name = "Client Restriction Settings - $($HVEnvironment.toUpper())"
+ List = $false
+ ColumnWidths = 25, 25, 25, 25
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZHCConnection.ps1 b/1.1.5/Src/Private/Get-AbrHRZHCConnection.ps1
new file mode 100644
index 0000000..1df6026
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZHCConnection.ps1
@@ -0,0 +1,81 @@
+function Get-AbrHRZHCConnection {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module, Wouter Kursten - Health Check
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "Connection Server Health Check InfoLevel set at $($HealthCheck.Components.ConnectionServers)."
+ Write-PScriboMessage "Connection Server Health information."
+ }
+
+ process {
+ try {
+ if ($ConnectionServersHealth) {
+ if ($HealthCheck.Components.ConnectionServers) {
+ Section -Style Heading3 "Connection Server Health Information" {
+ Paragraph "The following section details on the connection server health information for $($HVEnvironment.toUpper())."
+ BlankLine
+ $OutObj = @()
+ foreach ($CSHealth in $ConnectionServersHealth) {
+ if($CSHealth.CertificateHealth.ExpirationTime -lt ((Get-Date).AddDays(30))) {
+ $ConServCertExpiry = "Certificate Expiring Soon"
+ } elseif ($CSHealth.CertificateHealth.ExpirationTime -lt (Get-Date)) {
+ $ConServCertExpiry = "Certificate Expired"
+ } else {
+ $ConServCertExpiry = "False"
+ }
+ if ($CSHealth) {
+ Write-PScriboMessage "Connection Server Status Information."
+ $inObj = [ordered] @{
+ 'Name' = $CSHealth.Name
+ 'Status' = $CSHealth.Status
+ 'Version' = $CSHealth.Version
+ 'Build' = $CSHealth.Build
+ 'Cert Valid' = $CSHealth.CertificateHealth.valid
+ 'Cert Expiring' = $ConServCertExpiry
+ 'Cert Expiry Date' = $CSHealth.CertificateHealth.ExpirationTime
+ 'Cert Invalidation Reason' = $CSHealth.CertificateHealth.InvalidationReason
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+ }
+
+ $TableParams = @{
+ Name = "Connection Server Health Information - $($HVEnvironment.toUpper())"
+ List = $false
+ ColumnWidths = 16, 8, 10, 16, 6, 10, 20, 14
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZHCDataStore.ps1 b/1.1.5/Src/Private/Get-AbrHRZHCDataStore.ps1
new file mode 100644
index 0000000..2537f0f
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZHCDataStore.ps1
@@ -0,0 +1,72 @@
+function Get-AbrHRZHCDataStore {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module, Wouter Kursten - Health Check
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "Data Store Health Check InfoLevel set at $($HealthCheck.vSphere.DataStores)."
+ Write-PScriboMessage "Data Store Health information."
+ }
+
+ process {
+ try {
+ if ($vCenterHealth) {
+ if ($HealthCheck.vSphere.DataStores) {
+ Section -Style Heading3 "Data Store Health Information" {
+ Paragraph "The following section details on the data store health information for $($HVEnvironment.toUpper())."
+ BlankLine
+ $OutObj = @()
+ foreach ($VCHealth in $vCenterHealth){
+ foreach ($DSHealth in $VCHealth.DatastoreData){
+ Write-PScriboMessage "DataStore Health Status Information."
+ $inObj = [ordered] @{
+ "Datastore" = $DSHealth.name;
+ "Accessible" = $DSHealth.accessible;
+ "Path" = $DSHealth.path;
+ "Datastore Type" = $DSHealth.datastoreType;
+ "Capacity MB" = $DSHealth.capacityMB;
+ "Free Space MB" = $DSHealth.freeSpaceMB;
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+ }
+
+ $TableParams = @{
+ Name = "DataStore Health Information - $($HVEnvironment.toUpper())"
+ List = $false
+ ColumnWidths = 20, 12, 28, 10, 15, 15
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZHCDomain.ps1 b/1.1.5/Src/Private/Get-AbrHRZHCDomain.ps1
new file mode 100644
index 0000000..4ad55fb
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZHCDomain.ps1
@@ -0,0 +1,95 @@
+function Get-AbrHRZHCDomain {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module, Wouter Kursten - Health Check
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "Domain Health Check InfoLevel set at $($HealthCheck.OtherComponents.Domains)."
+ Write-PScriboMessage "Domain Health information."
+ }
+
+ process {
+ try {
+ if ($Domains) {
+ if ($HealthCheck.OtherComponents.Domains) {
+ Section -Style Heading3 "Domain Health Information" {
+ Paragraph "The following section details on the Domain health information for $($HVEnvironment.toUpper())."
+ BlankLine
+ $OutObj = @()
+ foreach ($Domain in $Domains){
+ $TrustRel = $Domain.ConnectionServerState[0].TrustRelationship
+ $DomainSat = $Domain.ConnectionServerState[0].Status
+ $AllTrustRelSame = $true
+ $AllDomainStatSame = $true
+
+ foreach($CSDomainStatus in $Domain.ConnectionServerState){
+ if ($CSDomainStatus.TrustRelationship -ne $TrustRel) {
+ $AllTrustRelSame = $false
+ break
+ }
+ if ($CSDomainStatus.Status -ne $DomainSat) {
+ $AllDomainStatSame = $false
+ break
+ }
+ }
+
+ if ($AllTrustRelSame) {
+ $TrustOut = $TrustRel
+ } else {
+ $TrustOut = "Trust relationships are not identical."
+ }
+ if ($AllDomainStatSame) {
+ $DomainOut = $DomainSat
+ } else {
+ $DomainOut = "Status is not consistent"
+ }
+
+ Write-PScriboMessage "Domain Health Status Information."
+ $inObj = [ordered] @{
+ "Domain Name" = $domain.NetBiosName;
+ "Status" = $DomainOut;
+ "Trust Relationship" = $TrustOut;
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+
+ }
+
+ $TableParams = @{
+ Name = "Domain Health Information - $($HVEnvironment.toUpper())"
+ List = $false
+ ColumnWidths = 30, 35, 35
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZHCESXiHost.ps1 b/1.1.5/Src/Private/Get-AbrHRZHCESXiHost.ps1
new file mode 100644
index 0000000..6abbc10
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZHCESXiHost.ps1
@@ -0,0 +1,78 @@
+function Get-AbrHRZHCESXiHost {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module, Wouter Kursten - Health Check
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "ESXi Health Check InfoLevel set at $($HealthCheck.vSphere.ESXiHosts)."
+ Write-PScriboMessage "ESXi Health information."
+ }
+
+ process {
+ try {
+ if ($vCenterHealth) {
+ if ($HealthCheck.vSphere.ESXiHosts) {
+ Section -Style Heading3 "ESXi Health Information" {
+ Paragraph "The following section details on the ESXi health information for $($HVEnvironment.toUpper())."
+ BlankLine
+ $OutObj = @()
+ foreach ($VCHealth in $vCenterHealth){
+ foreach ($ESXiHost in $VCHealth.hostData){
+ if ($esxihost.vGPUTypes){
+ $vGPUTypes= [system.String]::Join(",", $ESXiHost.vGPUTypes)
+ }
+ else{
+ $vGPUTypes="n/a"
+ }
+ Write-PScriboMessage "ESXi Health Status Information."
+ $inObj = [ordered] @{
+ "ESXi Host" = $ESXiHost.name;
+ "Version" = $ESXiHost.version;
+ "API Version" = $ESXiHost.apiVersion;
+ "Status" = $ESXiHost.status;
+ "cluster Name" = $ESXiHost.clusterName;
+ "vGPU Types" = $vGPUTypes;
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+ }
+
+ $TableParams = @{
+ Name = "ESXi Health Information - $($HVEnvironment.toUpper())"
+ List = $false
+ ColumnWidths = 30, 10, 10, 20, 15, 15
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZHCEventDataBase.ps1 b/1.1.5/Src/Private/Get-AbrHRZHCEventDataBase.ps1
new file mode 100644
index 0000000..3eb5e38
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZHCEventDataBase.ps1
@@ -0,0 +1,75 @@
+function Get-AbrHRZHCEventDataBase {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module, Wouter Kursten - Health Check
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "Event Database Health Check InfoLevel set at $($HealthCheck.Components.EventDataBase)."
+ Write-PScriboMessage "Event Database Health information."
+ }
+
+ process {
+ try {
+ if ($EventDataBaseHealth) {
+ if ($HealthCheck.Components.EventDataBase) {
+ Section -Style Heading3 "Event Database Health Information" {
+ Paragraph "The following section details on the event database health information for $($HVEnvironment.toUpper())."
+ BlankLine
+ $OutObj = @()
+
+ if ($EventDataBaseHealth.configured -eq $true) {
+ Write-PScriboMessage "Event Database Status Information."
+ $inObj = [ordered] @{
+ "Server name" = $EventDataBaseHealth.data.Servername;
+ "Port" = $EventDataBaseHealth.data.Port;
+ "Status" = $EventDataBaseHealth.data.State;
+ "Username" = $EventDataBaseHealth.data.Username;
+ "Database Name" = $EventDataBaseHealth.data.DatabaseName
+ "Table Prefix" = $EventDataBaseHealth.data.TablePrefix;
+ "State" = $EventDataBaseHealth.data.State;
+ "Error" = $EventDataBaseHealth.data.Error;
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+
+
+ $TableParams = @{
+ Name = "Event Database Health Information - $($HVEnvironment.toUpper())"
+ List = $false
+ ColumnWidths = 18, 8, 12, 16, 18, 8, 10, 10
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+
+ $OutObj | Table @TableParams
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZHCGatewayServer.ps1 b/1.1.5/Src/Private/Get-AbrHRZHCGatewayServer.ps1
new file mode 100644
index 0000000..793cd83
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZHCGatewayServer.ps1
@@ -0,0 +1,119 @@
+function Get-AbrHRZHCGatewayServer {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module, Wouter Kursten - Health Check
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "Gateway Server Health Check InfoLevel set at $($HealthCheck.Components.GatewayServer)."
+ Write-PScriboMessage "Gateway Server Health information."
+ }
+
+ process {
+ try {
+ if ($GatewayServers) {
+ if ($HealthCheck.Components.GatewayServer) {
+ Section -Style Heading3 "Gateway Server Health Information" {
+ Paragraph "The following section details on the gateway server health information for $($HVEnvironment.toUpper())."
+ BlankLine
+ $OutObj = @()
+ foreach ($GWServer in $GatewayServers) {
+ if ($GWServer) {
+ $Gatewayhealth = $hzServices.GatewayHealth.GatewayHealth_Get($GWServer.id)
+ $lastcontact = (([System.DateTimeOffset]::FromUnixTimeMilliSeconds(($Gatewayhealth.LastUpdatedTimestamp)).DateTime).ToString("s"))
+ Switch ($Gatewayhealth.GatewayZoneInternal) {
+ "False" {$GateayZoneType = "External"}
+ "True" {$GateayZoneType = "Internal"}
+ Default{$GateayZoneType = "Lost"}
+ }
+ Switch ($Gatewayhealth.type) {
+ "AP" {$GWType = "UAG"}
+ "F5" {$GWType = "F5 Load Balanced"}
+ Default {$GWType = "Unknown"}
+ }
+
+ Write-PScriboMessage "Gateway Server Status Information."
+ $inObj = [ordered] @{
+ "UAG Name" = $Gatewayhealth.name;
+ "UAG Address" = $Gatewayhealth.Address;
+ "UAG Zone" = $GateayZoneType;
+ "UAG Version" = $Gatewayhealth.Version;
+ "UAG Type" = $GWType;
+ "UAG Active" = $Gatewayhealth.GatewayStatusActive;
+ "UAG Stale" = $Gatewayhealth.GatewayStatusStale;
+ "UAG Contacted" = $Gatewayhealth.GatewayContacted;
+ "UAG Last Contact" = $lastcontact;
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+ }
+
+ $TableParams = @{
+ Name = "Gateway Server Health Information - $($HVEnvironment.toUpper())"
+ List = $false
+ ColumnWidths = 16, 10, 10, 10, 12, 8, 8, 12, 14
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+
+ $OutObj | Table @TableParams
+
+ #<#
+ $OutObj = @()
+ foreach ($GWServer in $GatewayServers) {
+ if ($GWServer) {
+ $Gatewayhealth = $hzServices.GatewayHealth.GatewayHealth_Get($GWServer.id)
+ Write-PScriboMessage "Gateway Server Connection Stats Information."
+ $inObj = [ordered] @{
+ "UAG Name" = $Gatewayhealth.name;
+ "UAG Active Connections" = $Gatewayhealth.ConnectionData.NumActiveConnections;
+ "UAG Blast Connections" = $Gatewayhealth.ConnectionData.NumBlastConnections;
+ "UAG PCOIP Connections" = $Gatewayhealth.ConnectionData.NumPcoipConnections;
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+ }
+
+ $TableParams = @{
+ Name = "Gateway Server Health Connection Stats Information - $($HVEnvironment.toUpper())"
+ List = $false
+ ColumnWidths = 25, 25, 25, 25
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+
+ $OutObj | Table @TableParams
+ #>
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZHCLicenseService.ps1 b/1.1.5/Src/Private/Get-AbrHRZHCLicenseService.ps1
new file mode 100644
index 0000000..0cee378
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZHCLicenseService.ps1
@@ -0,0 +1,79 @@
+function Get-AbrHRZHCLicenseService {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module, Wouter Kursten - Health Check
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "License Health Check InfoLevel set at $($HealthCheck.OtherComponents.LicenseService)."
+ Write-PScriboMessage "License Health information."
+ }
+
+ process {
+ try {
+ if ($ProductLicenseingInfo) {
+ if ($HealthCheck.OtherComponents.LicenseService) {
+ Section -Style Heading3 "License Health Information" {
+ Paragraph "The following section details on the License health information for $($HVEnvironment.toUpper())."
+ BlankLine
+ $OutObj = @()
+
+ $LicensedEditionEdited = $ProductLicenseingInfo.LicenseEdition -replace "_", " "
+ $culture = [System.Globalization.CultureInfo]::CurrentCulture
+ $textInfo = $culture.TextInfo
+ $properCaseLicensedEditionEdited = $textInfo.ToTitleCase($LicensedEditionEdited.ToLower())
+
+ # $ProductLicenseingInfo.Licensed
+ if ($ProductLicenseingInfo.Licensed -eq $true) {
+ $LicStatus = "Okay"
+ } else {
+ $LicStatus = "Unlicensed"
+ }
+
+ Write-PScriboMessage "License Health Status Information."
+ $inObj = [ordered] @{
+ "Status" = $LicStatus;
+ "License Key" = $ProductLicenseingInfo.LicenseKey;
+ "License Edition" = $properCaseLicensedEditionEdited;
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+
+
+ $TableParams = @{
+ Name = "License Health Information - $($HVEnvironment.toUpper())"
+ List = $false
+ ColumnWidths = 30, 40, 30
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZHCRDSFarm.ps1 b/1.1.5/Src/Private/Get-AbrHRZHCRDSFarm.ps1
new file mode 100644
index 0000000..95dca31
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZHCRDSFarm.ps1
@@ -0,0 +1,78 @@
+function Get-AbrHRZHCRDSFarm {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module, Wouter Kursten - Health Check
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "RDS Farms Health Check InfoLevel set at $($HealthCheck.RDSFarms.RDSFarms)."
+ Write-PScriboMessage "RDS Farms Health information."
+ }
+
+ process {
+ try {
+ if ($farms) {
+ if ($HealthCheck.RDSFarms.RDSFarms) {
+ Section -Style Heading3 "RDS Farms Health Information" {
+ Paragraph "The following section details on the RDS farms health information for $($HVEnvironment.toUpper())."
+ BlankLine
+ $OutObj = @()
+ foreach ($Farm in $Farms) {
+ if ($Farm) {
+ $health=$hzServices.Farmhealth.farmhealth_get($farm.id)
+ $farmhealthstatus = $health.health
+ $farmname = $farm.data.name
+ Write-PScriboMessage "RDS Farms Status Information."
+ $inObj = [ordered] @{
+ "Farm Name" = $farmname;
+ "Farm Health" = $farmhealthstatus;
+ "RDS Hostname" = $rdsserver.name;
+ "RDS Status" = $rdsserver.status;
+ "RDS health" = $rdsserver.health;
+ "RDS Available" = $rdsserver.available;
+ "RDS Missing Apps" = $missingapps;
+ "RDS Load Preference" = $rdsserver.LoadPreference;
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+ }
+
+ $TableParams = @{
+ Name = "RDS Farms Health Information - $($HVEnvironment.toUpper())"
+ List = $false
+ ColumnWidths = 14, 8, 16, 8, 12, 10, 10, 12, 12
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+
+ $OutObj | Table @TableParams
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZHCRemotePod.ps1 b/1.1.5/Src/Private/Get-AbrHRZHCRemotePod.ps1
new file mode 100644
index 0000000..b304456
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZHCRemotePod.ps1
@@ -0,0 +1,80 @@
+function Get-AbrHRZHCRemotePod {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module, Wouter Kursten - Health Check
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "Remote Pod Health Check InfoLevel set at $($HealthCheck.RemotePod.RemotePod)."
+ Write-PScriboMessage "Remote Pod Health information."
+ }
+
+ process {
+ try {
+ if ($CloudPodListsLocal) {
+ if ($HealthCheck.RemotePod.RemotePod) {
+ Section -Style Heading3 "Remote Pod Health Information" {
+ Paragraph "The following section details on the Remote Pod health information for $($HVEnvironment.toUpper())."
+ BlankLine
+ $OutObj = @()
+ foreach ($pod in $CloudPodListsLocal){
+ if($pod){
+ $endpoints = $hzServices.podhealth.podhealth_get($pod.id).data.endpointhealth
+ $PodDetail = $hzServices.pod.pod_get($pod.id)
+ $PodName = $PodDetail.DisplayName
+ #$PodName = "Pod Name"
+ if($endpoints){
+ foreach ($endpoint in $endpoints){
+
+ Write-PScriboMessage "Remote Pod Health Status Information."
+ $inObj = [ordered] @{
+ "Status" = $endpoint.EndpointInfo | Select-Object -expandproperty Enabled;
+ "Name" = $PodName;
+ "Connection Servers" = $endpoint.EndpointInfo | Select-Object -expandproperty Name;
+ "Description" = $endpoint | Select-Object -expandproperty State;
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+ }
+ }
+ $pod = $null
+ }
+
+ $TableParams = @{
+ Name = "Remote Pod Health Information - $($HVEnvironment.toUpper())"
+ List = $false
+ ColumnWidths = 10, 25, 25, 30
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZHCSAML2.ps1 b/1.1.5/Src/Private/Get-AbrHRZHCSAML2.ps1
new file mode 100644
index 0000000..b85c0b0
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZHCSAML2.ps1
@@ -0,0 +1,72 @@
+function Get-AbrHRZHCSAML2 {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module, Wouter Kursten - Health Check
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "SAML Health Check InfoLevel set at $($HealthCheck.OtherComponents.SAML2)."
+ Write-PScriboMessage "SAML Health information."
+ }
+
+ process {
+ try {
+ if ($SAMLAuthenticatorhealthlist) {
+ if ($HealthCheck.OtherComponents.SAML2) {
+ Section -Style Heading3 "SAML Health Information" {
+ Paragraph "The following section details on the SAML health information for $($HVEnvironment.toUpper())."
+ BlankLine
+ $OutObj = @()
+ foreach ($SAMLAuthenticatorhealth in $SAMLAuthenticatorhealthlist){
+
+ Write-PScriboMessage "SAML Health Status Information."
+ $inObj = [ordered] @{
+ "Status" = $SAMLAuthenticatorHealthList.ConnectionServerData.Status[0];
+ "Authenticator Name" = $SAMLAuthenticatorhealth.data.label;
+ "Metadata URL" = $SAMLAuthenticatorhealth.data.MetadataURL;
+ "Details" = $SAMLAuthenticatorhealth.data.Description;
+ "Admin URL" = $SAMLAuthenticatorhealth.data.AdministratorURL;
+ "TrueSSO Trigger Mode" = $SAMLAuthenticatorhealth.data.CertificateSsoTriggerMode;
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+
+ }
+
+ $TableParams = @{
+ Name = "SAML Health Information - $($HVEnvironment.toUpper())"
+ List = $false
+ ColumnWidths = 10, 10, 25, 10, 25, 10
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZHCTrueSSO.ps1 b/1.1.5/Src/Private/Get-AbrHRZHCTrueSSO.ps1
new file mode 100644
index 0000000..71e8b1d
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZHCTrueSSO.ps1
@@ -0,0 +1,75 @@
+function Get-AbrHRZHCTrueSSO {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module, Wouter Kursten - Health Check
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "TrueSSO Health Check InfoLevel set at $($HealthCheck.Components.TrueSSO)."
+ Write-PScriboMessage "TrueSSO Health information."
+ }
+
+ process {
+ try {
+ if ($CertificateSSOconnectorHealthlist) {
+ if ($InfoLevel.settings.servers.ConnectionServers.TrueSSO -ge 1) {
+ Section -Style Heading3 "TrueSSO Health Information" {
+ Paragraph "The following section details on the TrueSSO information for $($HVEnvironment.toUpper())."
+ BlankLine
+ $OutObj = @()
+ foreach ($CertificateSSOconnectorHealth in $CertificateSSOconnectorHealthlist) {
+ if ($CertificateSSOconnectorHealth) {
+
+ Write-PScriboMessage "Discovered TrueSSO Information."
+ $inObj = [ordered] @{
+ 'TrueSSO Name' = $CertificateSSOconnectorHealth.DisplayName
+ 'TrueSSO Enabled' = $CertificateSSOconnectorHealth.Enabled
+ 'TrueSSO State' = $CertificateSSOconnectorHealth.Data.OverallState
+ 'Primary ES' = $CertificateSSOconnectorHealth.Data.PrimaryEnrollmentServerHealth.DnsName
+ 'Primary ES State' = $CertificateSSOconnectorHealth.Data.PrimaryEnrollmentServerHealth.State
+ 'Primary ES State Reason' = $CertificateSSOconnectorHealth.Data.PrimaryEnrollmentServerHealth.StateReasons
+ 'Secondary Enrollment Server' = $CertificateSSOconnectorHealth.Data.SecondaryEnrollmentServerHealth.DnsName
+ 'Secondary Enrollment Server State' = $CertificateSSOconnectorHealth.Data.SecondaryEnrollmentServerHealth.State
+ 'Secondary Enrollment Server State Reason' = $CertificateSSOconnectorHealth.Data.SecondaryEnrollmentServerHealth.StateReasons
+ }
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+ }
+
+ $TableParams = @{
+ Name = "TrueSSO Health Information - $($HVEnvironment.toUpper())"
+ List = $false
+ ColumnWidths = 15, 10, 10, 15, 10, 20, 10, 10, 10
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZHCvCenter.ps1 b/1.1.5/Src/Private/Get-AbrHRZHCvCenter.ps1
new file mode 100644
index 0000000..650f725
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZHCvCenter.ps1
@@ -0,0 +1,86 @@
+function Get-AbrHRZHCvCenter {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module, Wouter Kursten - Health Check
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "vCenter Health Check InfoLevel set at $($HealthCheck.vSphere.vCenter)."
+ Write-PScriboMessage "vCenter Health information."
+ }
+
+ process {
+ try {
+ if ($vCenterHealth) {
+ if ($HealthCheck.vSphere.vcenter) {
+ Section -Style Heading3 "vCenter Health Information" {
+ Paragraph "The following section details on the vCenter health information for $($HVEnvironment.toUpper())."
+ BlankLine
+ $OutObj = @()
+ foreach ($VCHealth in $vCenterHealth){
+ $Name=$VCHealth.data.name
+ $TrimmedName = ($Name -replace "https://", "").Split(":")[0].ToLower()
+ $version=$VCHealth.data.version
+ $build=$VCHealth.data.build
+ $apiVersion=$VCHealth.data.apiVersion
+
+ foreach ($Connectionserver in $VCHealth.connectionServerData){
+ $CertHealth = $Connectionserver.certificateHealth.valid
+ if ($CertHealth -eq "True") {
+ $CertHealthOUt = "Okay"
+ } else {
+ $CertHealthOUt = "Invalid"
+ }
+ Write-PScriboMessage "vCenter Health Status Information."
+ $inObj = [ordered] @{
+ "Name" = $TrimmedName;
+ "Version"=$version;
+ "Build"=$build;
+ "API Version"=$apiVersion;
+ "Connection Server" = $Connectionserver.name;
+ "Status" = $Connectionserver.Status;
+ "Thumbprint Accepted" = $Connectionserver.thumbprintAccepted;
+ "Certificate Health" = $CertHealth;
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+ }
+
+ $TableParams = @{
+ Name = "vCenter Health Information - $($HVEnvironment.toUpper())"
+ List = $false
+ ColumnWidths = 20, 7, 15, 10, 12, 10, 13, 13
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZHomeSite.ps1 b/1.1.5/Src/Private/Get-AbrHRZHomeSite.ps1
new file mode 100644
index 0000000..b690aaf
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZHomeSite.ps1
@@ -0,0 +1,108 @@
+function Get-AbrHRZHomeSite {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "Home Site Assignments InfoLevel set at $($InfoLevel.UsersAndGroups.HomeSiteAssignments)."
+ Write-PScriboMessage "Collecting Home Site General Information."
+ }
+
+ process {
+ if ($InfoLevel.UsersAndGroups.HomeSiteAssignments -ge 1) {
+ try {
+ if ($Homesites) {
+ Section -Style Heading3 'Home Site' {
+ Paragraph "The following section provide a summary of user and group home site configuration."
+ BlankLine
+ $OutObj = @()
+ foreach ($HomeSite in $HomeSites) {
+ try {
+ # Clear Var
+ $HomeSiteUserIDName = ''
+ $HomeSiteUserIDDomain = ''
+ $HomeSiteUserIDEmail = ''
+ $HomeSiteUserIDGroup = ''
+ $HomeSiteSiteIDName = ''
+ $HomeSiteGlobalEntitlementIDName = ''
+ $HomeSiteGlobalApplicationEntitlementIDName = ''
+
+ # HomeSite User or Group ID
+ if ($HomeSite.Base.UserOrGroup) {
+ $HomeSiteUserID = $hzServices.ADUserOrGroup.ADUserOrGroup_Get($homesite.Base.UserOrGroup)
+ $HomeSiteUserIDName = $HomeSiteUserID.Base.Name
+ $HomeSiteUserIDDomain = $HomeSiteUserID.Base.Domain
+ $HomeSiteUserIDEmail = $HomeSiteUserID.Base.Email
+ $HomeSiteUserIDGroup = $HomeSiteUserID.Base.Group
+ }
+
+ # Home Site Site ID
+ if ($HomeSite.Base.Site) {
+ $HomeSiteSiteID = $hzServices.Site.Site_Get($HomeSite.Base.Site)
+ $HomeSiteSiteIDName = $HomeSiteSiteID.base.DisplayName
+ }
+
+ # Home Site Global Entilement ID
+ if ($HomeSite.Base.GlobalEntitlement) {
+ $HomeSiteGlobalEntitlementID = $hzServices.GlobalEntitlement.GlobalEntitlement_Get($homesite.Base.GlobalEntitlement)
+ $HomeSiteGlobalEntitlementIDName = $HomeSiteGlobalEntitlementID.base.DisplayName
+ }
+
+ # Home Site Global Application Entilement ID
+ if ($HomeSite.Base.GlobalApplicationEntitlement) {
+ $HomeSiteGlobalApplicationEntitlementID = $hzServices.GlobalApplicationEntitlement.GlobalApplicationEntitlement_Get($homesite.Base.GlobalApplicationEntitlement)
+ $HomeSiteGlobalApplicationEntitlementIDName = $HomeSiteGlobalApplicationEntitlementID.base.DisplayName
+ }
+ $inObj = [ordered] @{
+ 'User or Group Name' = $HomeSiteUserIDName
+ 'Domain' = $HomeSiteUserIDDomain
+ 'Group' = $HomeSiteUserIDGroup
+ 'Email' = $HomeSiteUserIDEmail
+ 'Home Site' = $HomeSiteSiteIDName
+ 'Global Entitlement' = $HomeSiteGlobalEntitlementIDName
+ 'Global Application Entitlement' = $HomeSiteGlobalApplicationEntitlementIDName
+ }
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+
+ $TableParams = @{
+ Name = "Home Site General - $($HVEnvironment.toUpper())"
+ List = $false
+ ColumnWidths = 17, 10, 10, 18, 15, 15, 15
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Sort-Object -Property 'User or Group Name' | Table @TableParams
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZInfrastructure.ps1 b/1.1.5/Src/Private/Get-AbrHRZInfrastructure.ps1
new file mode 100644
index 0000000..b78749b
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZInfrastructure.ps1
@@ -0,0 +1,69 @@
+function Get-AbrHRZInfrastructure {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr, Chris Hildebrandt
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "Collecting Infrastructure Summary information."
+ }
+
+ process {
+ try {
+ Section -Style NOTOCHeading4 "Executive Summary for $($HVEnvironment.toUpper())" {
+ $OutObj = @()
+ Write-PScriboMessage "Discovered Infrastructure Summary Information."
+ $inObj = [ordered] @{
+ 'Number of Local Entitlements' = $EntitledUserOrGroupLocalMachines.Count
+ 'Number of Global Entitlements' = $GlobalEntitlements.Count
+ 'Number of Desktop Pools' = $Pools.Count
+ 'Number of Application Pool' = $Apps.Count
+ 'Number of Farms Pools' = $Farms.Count
+ 'Number of vCenter Servers' = $vCenterServers.Count
+ 'Number of ESXi Hosts' = $Esxhosts.HostData.Count
+ 'Number of Datastores' = $Datastores.DatastoreData.Count
+ 'Number of Active Directory Domains' = $ADDomains.Count
+ 'Number of UAG Servers' = $GatewayServers.Count
+ 'Number of Connection Servers' = $connectionservers.Count
+ 'Number of Instant Clone Accounts' = $InstantCloneDomainAdmins.Count
+ 'Number of RDS Hosts' = $RDSServers.Count
+ 'Number of Administrators and Groups' = $Administrators.Count
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+
+ $TableParams = @{
+ Name = "Executive Summary - $($HVEnvironment.toUpper())"
+ List = $true
+ ColumnWidths = 50, 50
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZInstantClone.ps1 b/1.1.5/Src/Private/Get-AbrHRZInstantClone.ps1
new file mode 100644
index 0000000..4dc4093
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZInstantClone.ps1
@@ -0,0 +1,70 @@
+function Get-AbrHRZInstantClone {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "InstantCloneDomainAccounts InfoLevel set at $($InfoLevel.Settings.InstantClone.InstantCloneDomainAccounts)."
+ Write-PScriboMessage "Collecting Instant Clone Domain Accounts information."
+ }
+
+ process {
+ try {
+ if ($InstantCloneDomainAdmins) {
+ if ($InfoLevel.Settings.InstantClone.InstantCloneDomainAccounts -ge 1) {
+ Section -Style Heading3 "Instant Clone Accounts" {
+ Paragraph "The following section details the Instant Clone Accounts configuration for $($HVEnvironment.split('.')[0]) server."
+ BlankLine
+ $OutObj = @()
+ foreach ($InstantCloneDomainAdmin in $InstantCloneDomainAdmins) {
+ try {
+ Write-PScriboMessage "Discovered Instant Clone Accounts Information."
+ $inObj = [ordered] @{
+ 'User Name' = $InstantCloneDomainAdmin.Base.UserName
+ 'Domain Name' = $InstantCloneDomainAdmin.NamesData.DnsName
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+
+ $TableParams = @{
+ Name = "Instant Clone Domain Accounts - $($HVEnvironment.split(".").toUpper()[0])"
+ List = $false
+ ColumnWidths = 50, 50
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Sort-Object -Property 'User Name' | Table @TableParams
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZLicense.ps1 b/1.1.5/Src/Private/Get-AbrHRZLicense.ps1
new file mode 100644
index 0000000..1ef2514
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZLicense.ps1
@@ -0,0 +1,167 @@
+function Get-AbrHRZLicense {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "ProductLicensingandUsage InfoLevel set at $($InfoLevel.Settings.ProductLicensing.ProductLicensingandUsage)."
+ Write-PScriboMessage "Collecting Product Licensing information."
+ }
+
+ process {
+ try {
+ if ($ProductLicenseingInfo) {
+ if ($InfoLevel.Settings.ProductLicensing.ProductLicensingandUsage -ge 1) {
+ Section -Style Heading2 "Product Licensing and Usage" {
+ Paragraph "The following section details the product license and usage information for $($HVEnvironment.toUpper()) server."
+ BlankLine
+
+ Section -Style Heading3 "Licensing" {
+ $OutObj = @()
+ foreach ($ProductLic in $ProductLicenseingInfo) {
+ try {
+ Write-PScriboMessage "Discovered Product Licensing Information."
+
+ # If $ProductLic.ExpirationTime is null, then the license is perpetual
+ $ProductLicExpirationTime = ""
+ if ($null -eq $ProductLic.ExpirationTime) {
+ $ProductLicExpirationTime = "Perpetual"
+ } else {
+ $ProductLicExpirationTime = $ProductLic.ExpirationTime.ToShortDateString()
+ }
+
+ $inObj = [ordered] @{
+ 'Is Licensed' = $ProductLic.Licensed
+ 'License Key' = $ProductLic.LicenseKey
+ 'License Expiration' = $ProductLicExpirationTime
+ 'Composer enabled' = $ProductLic.ViewComposerEnabled
+ 'Desktop Launching enabled' = $ProductLic.DesktopLaunchingEnabled
+ 'Application Launching enabled' = $ProductLic.ApplicationLaunchingEnabled
+ 'Instant Clone enabled' = $ProductLic.InstantCloneEnabled
+ 'Helpdesk enabled' = $ProductLic.HelpDeskEnabled
+ 'Collaboration enabled' = $ProductLic.CollaborationEnabled
+ 'License Edition' = $ProductLic.LicenseEdition
+ 'License Usage Model' = $ProductLic.UsageModel
+ 'License Mode' = $ProductLic.LicenseMode
+ 'Grace Period Days' = $ProductLic.GracePeriodDays
+ 'Subscription Slice Expiry' = $ProductLic.SubscriptionSliceExpiry
+ 'License Health' = $ProductLic.LicenseHealth
+ }
+
+ $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
+ } Catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ $TableParams = @{
+ Name = "Licensing - $($HVEnvironment.toUpper())"
+ List = $true
+ ColumnWidths = 50, 50
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ try {
+ $UsageStatisticsInfo = try { $hzServices.UsageStatistics.UsageStatistics_GetLicensingCounters() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
+ if ($UsageStatisticsInfo) {
+ if ($InfoLevel.Settings.ProductLicensing.ProductLicensingandUsage -ge 2) {
+ Section -Style Heading3 "Usage" {
+ $OutObj = @()
+ foreach ($ProductUsage in $UsageStatisticsInfo.HighestUsage.PSObject.Properties.Name) {
+ try {
+ Write-PScriboMessage "Discovered Product Licensing Usage Information."
+ $inObj = [ordered] @{
+ 'Name' = ($ProductUsage -creplace '([A-Z\W_]|\d+)(?
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "Users And Groups InfoLevel set at $($InfoLevel.UsersAndGroups.Entitlements)."
+ Write-PScriboMessage "Collecting Users And Groups information."
+ }
+
+ process {
+ if ($InfoLevel.UsersAndGroups.Entitlements -ge 1 -and $EntitledUserOrGroupLocalMachines) {
+ try {
+ Section -Style Heading3 'Local Entitlements' {
+ Paragraph "The following section provide a summary of local user & groups entitlements."
+ BlankLine
+ $OutObj = @()
+ if ($EntitledUserOrGroupLocalMachines) {
+ foreach ($EntitledUserOrGroupLocalMachine in $EntitledUserOrGroupLocalMachines) {
+ try {
+ Switch ($EntitledUserOrGroupLocalMachine.base.Group) {
+ 'True' { $EntitledUserOrGroupLocalMachinegroup = 'Group' }
+ 'False' { $EntitledUserOrGroupLocalMachinegroup = 'User' }
+ }
+ Switch ($EntitledUserOrGroupLocalMachinegroup) {
+ 'Group' { $UserPrincipalName = $EntitledUserOrGroupLocalMachine.base.Name }
+ 'User' { $UserPrincipalName = $EntitledUserOrGroupLocalMachine.base.UserPrincipalName }
+ }
+ Write-PScriboMessage "Discovered Local Entitlements $($EntitledUserOrGroupLocalMachine.base.UserPrincipalName)."
+ $inObj = [ordered] @{
+ 'User Principal Name' = $UserPrincipalName
+ 'Group or User' = $EntitledUserOrGroupLocalMachinegroup
+ 'Desktop Entitlements' = ($EntitledUserOrGrouplocalMachine.localData.Desktops.id).count
+ 'Application Entitlements' = ($EntitledUserOrGroupLocalMachine.LocalData.Applications.id).count
+ }
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+
+ $TableParams = @{
+ Name = "Local Entitlements - $($HVEnvironment.toUpper())"
+ List = $false
+ ColumnWidths = 55, 15, 15, 15
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Sort-Object -Property 'User Principal Name' | Table @TableParams
+
+ if ($InfoLevel.UsersAndGroups.Entitlements -ge 2) {
+ Section -Style Heading4 "Local Entitlements Details" {
+ Paragraph "The following section detail per user or group local entitlements."
+ BlankLine
+ try {
+ $PoolIDNameResults = ''
+ $AppIDNameResults = ''
+ foreach ($EntitledUserOrGroupLocalMachine in $EntitledUserOrGroupLocalMachines) {
+ try {
+ # Find Machine ID Name
+ $MachineIDName = ''
+ $Entitledlocalmachines = $EntitledUserOrGroupLocalMachine.LocalData.Machines.id
+ foreach ($Entitledlocalmachine in $Entitledlocalmachines) {
+ foreach ($Machine in $Machines) {
+ if ($Machine.Id.id -eq $Entitledlocalmachine) {
+ $MachineIDName = $Machine.base.Name
+ break
+ }
+ }
+ if ($Entitledlocalmachines.count -gt 1) {
+ $MachineIDNameResults += "$MachineIDName, "
+ $MachineIDName = $MachineIDNameResults.TrimEnd(', ')
+ }
+ }
+ Switch ($MachineIDName) {
+ '' { $MachineIDName = 'N/A' }
+ ' ' { $MachineIDName = 'N/A' }
+ }
+
+ # Find Desktop ID Name
+ $PoolIDName = ''
+ $Entitledlocalmachines = $EntitledUserOrGrouplocalMachine.localData.Desktops.id
+ foreach ($Entitledlocalmachine in $Entitledlocalmachines) {
+ foreach ($Pool in $Pools) {
+ if ($Pool.Id.id -eq $Entitledlocalmachine) {
+ $PoolIDName = $pool.base.Name
+ break
+ }
+ }
+ if ($Entitledlocalmachines.count -gt 1) {
+ $PoolIDNameResults += "$PoolIDName, "
+ $PoolIDName = $PoolIDNameResults.TrimEnd(', ')
+ }
+ }
+
+ # Find App ID Name
+ $AppIDName = ''
+ $Entitledlocalmachines = $EntitledUserOrGroupLocalMachine.LocalData.Applications.id
+ foreach ( $Entitledlocalmachine in $Entitledlocalmachines) {
+ foreach ($App in $Apps) {
+ if ($App.Id.id -eq $Entitledlocalmachine) {
+ $AppIDName = $app.data.DisplayName
+ break
+ }
+
+ }
+ if ($Entitledlocalmachines.count -gt 1) {
+ $AppIDNameResults += "$AppIDName, "
+ $AppIDName = $AppIDNameResults.TrimEnd(', ')
+ }
+ }
+ Switch ($AppIDName) {
+ '' { $AppIDName = 'N/A' }
+ ' ' { $AppIDName = 'N/A' }
+ }
+
+ Switch ($EntitledUserOrGroupLocalMachine.base.Group) {
+ 'True' { $EntitledUserOrGroupLocalMachinegroup = 'Group' }
+ 'False' { $EntitledUserOrGroupLocalMachinegroup = 'User' }
+ }
+ Section -ExcludeFromTOC -Style NOTOCHeading5 "Local Entitlement Details - $($EntitledUserOrGroupLocalMachine.base.Name)" {
+ $OutObj = @()
+ try {
+ Write-PScriboMessage "Local Entitlements Details for $($EntitledUserOrGroupLocalMachine.base.Name)."
+ $inObj = [ordered] @{
+ 'Name' = $EntitledUserOrGroupLocalMachine.base.Name
+ 'Group or User' = $EntitledUserOrGroupLocalMachinegroup
+ 'Domain' = $EntitledUserOrGroupLocalMachine.base.Domain
+ 'Ad Distinguished Name' = $EntitledUserOrGroupLocalMachine.base.AdDistinguishedName
+ 'First Name' = $EntitledUserOrGroupLocalMachine.base.FirstName
+ 'Last Name' = $EntitledUserOrGroupLocalMachine.base.LastName
+ 'Login Name' = $EntitledUserOrGroupLocalMachine.base.LoginName
+ 'Display Name' = $EntitledUserOrGroupLocalMachine.base.DisplayName
+ 'Long Display Name' = $EntitledUserOrGroupLocalMachine.base.LongDisplayName
+ 'Email' = $EntitledUserOrGroupLocalMachine.base.Email
+ 'Kiosk User' = $EntitledUserOrGroupLocalMachine.base.KioskUser
+ 'Phone' = $EntitledUserOrGroupLocalMachine.base.Phone
+ 'Description' = $EntitledUserOrGroupLocalMachine.base.Description
+ 'In Folder' = $EntitledUserOrGroupLocalMachine.base.InFolder
+ 'User Principal Name' = $EntitledUserOrGroupLocalMachine.base.UserPrincipalName
+ 'Local Machines' = $MachineIDName
+ 'Local User Persistent Disks' = $EntitledUserOrGroupLocalMachine.LocalData.PersistentDisks
+ 'Local Desktops' = $PoolIDName
+ 'User Applications' = $AppIDName
+ }
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+
+ $TableParams = @{
+ Name = "Local Entitlements Details - $($EntitledUserOrGroupLocalMachine.base.Name)"
+ List = $True
+ ColumnWidths = 50, 50
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+
+ $OutObj | Table @TableParams
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZMachine.ps1 b/1.1.5/Src/Private/Get-AbrHRZMachine.ps1
new file mode 100644
index 0000000..3432de3
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZMachine.ps1
@@ -0,0 +1,69 @@
+function Get-AbrHRZMachine {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "Machine InfoLevel set at $($InfoLevel.Inventory.Machines)."
+ Write-PScriboMessage "Collecting Machine information."
+ }
+
+ process {
+ try {
+ if ($Machines) {
+ if ($InfoLevel.Inventory.Machines -ge 1) {
+ Section -Style Heading3 "Machines" {
+ Paragraph "The following section details on all of the machine information for $($HVEnvironment.toUpper())."
+ BlankLine
+ Write-PScriboMessage "Working on Machines Information for $($HVEnvironment.toUpper())."
+ Section -Style Heading4 "vCenter Machine Summary" {
+ $OutObj = @()
+ foreach ($Machine in $Machines) {
+ $inObj = [ordered] @{
+ 'Machine Name' = $Machine.Base.Name
+ 'Agent Version' = $Machine.Base.AgentVersion
+ 'User' = $Machine.Base.User
+ 'Host' = $Machine.ManagedMachineData.VirtualCenterData.Hostname
+ 'Data Store' = $Machine.ManagedMachineData.VirtualCenterData.VirtualDisks.DatastorePath
+ 'Basic State' = $Machine.Base.BasicState
+ }
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+ $TableParams = @{
+ Name = "vCenter Machine Summary - $($HVEnvironment.toUpper())"
+ List = $false
+ ColumnWidths = 15, 10, 20, 25, 15, 15
+ }
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZRegisteredMachine.ps1 b/1.1.5/Src/Private/Get-AbrHRZRegisteredMachine.ps1
new file mode 100644
index 0000000..f733458
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZRegisteredMachine.ps1
@@ -0,0 +1,151 @@
+function Get-AbrHRZRegisteredMachine {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "RegisteredMachines InfoLevel set at $($InfoLevel.Settings.RegisteredMachines.RDSHosts)."
+ Write-PScriboMessage "Collecting Registered Machines information."
+ }
+
+ process {
+ try {
+ if ($RDSServers) {
+ if ($InfoLevel.Settings.RegisteredMachines.RDSHosts -ge 1) {
+ Section -Style Heading2 "Registered Machines" {
+ Paragraph "The following section provides information of Registered Machines for $($HVEnvironment.toUpper()) server."
+ BlankLine
+ Section -Style Heading3 'RDS Hosts' {
+ Paragraph "The following section details the RDS Hosts configuration for $($HVEnvironment.toUpper()) server."
+ BlankLine
+ $OutObj = @()
+ foreach ($RDSServer in $RDSServers) {
+ Write-PScriboMessage "Discovered RDS Hosts Information."
+ $inObj = [ordered] @{
+ 'Name' = $RDSServer.base.name
+ 'Farm Name' = $RDSServer.SummaryData.FarmName
+ 'Status' = $RDSServer.runtimedata.Status
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+
+ if ($HealthCheck.RegisteredMachines.Status) {
+ $OutObj | Where-Object { $_.'Status' -ne 'AVAILABLE' } | Set-Style -Style Warning
+ }
+
+ $TableParams = @{
+ Name = "RDS Hosts - $($HVEnvironment.toUpper())"
+ List = $false
+ ColumnWidths = 34, 33, 33
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ try {
+ if ($InfoLevel.Settings.RegisteredMachines.RDSHosts -ge 2) {
+ Section -Style Heading4 'RDS Hosts Details' {
+ foreach ($RDSServer in $RDSServers) {
+ Write-PScriboMessage "Discovered RDS Host $($RDSServer.base.name) Information."
+ $OutObj = @()
+ Section -ExcludeFromTOC -Style NOTOCHeading6 $RDSServer.Base.Name {
+ $inObj = [ordered] @{
+ 'Name' = $RDSServer.base.name
+ 'Description' = $RDSServer.base.Description
+ 'Farm Name' = $RDSServer.SummaryData.FarmName
+ 'Desktop Pool Name' = $RDSServer.SummaryData.DesktopName
+ 'Farm Type' = $RDSServer.SummaryData.FarmType
+ 'Access Group' = $RDSServerAccessgroup
+ 'Message Security Mode' = $RDSServer.MessageSecurityData.MessageSecurityMode
+ 'Message Security Enhanced Mode Supported' = $RDSServer.MessageSecurityData.MessageSecurityEnhancedModeSupported
+ 'Operating System' = $RDSServer.agentdata.OperatingSystem
+ 'Agent Version' = $RDSServer.agentdata.AgentVersion
+ 'Agent Build Number' = $RDSServer.agentdata.AgentBuildNumber
+ 'Remote Experience Agent Version' = $RDSServer.agentdata.RemoteExperienceAgentVersion
+ 'Remote Experience Agent Build Number' = $RDSServer.agentdata.RemoteExperienceAgentBuildNumber
+ 'Max Sessions Type' = $RDSServer.settings.SessionSettings.MaxSessionsType
+ 'Max Sessions Set By Admin' = $RDSServer.settings.SessionSettings.MaxSessionsSetByAdmin
+ 'Agent Max Sessions Type' = $RDSServer.settings.AgentMaxSessionsData.MaxSessionsType
+ 'Agent Max Sessions Set By Admin' = $RDSServer.settings.AgentMaxSessionsData.MaxSessionsSeenByAgent
+ 'Enabled' = $RDSServer.settings.enabled
+ 'Status' = $RDSServer.runtimedata.Status
+ }
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+
+ $TableParams = @{
+ Name = "RDS Host - $($RDSServer.base.name)"
+ List = $true
+ ColumnWidths = 50, 50
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+
+ if ($RegisteredPhysicalMachines) {
+ Section -Style Heading3 'Others' {
+ Paragraph "The following section details the RDS Hosts configuration for $($HVEnvironment.toUpper()) server."
+ BlankLine
+ $OutObj = @()
+ foreach ($RegisteredPhysicalMachine in $RegisteredPhysicalMachines) {
+ Write-PScriboMessage "Other Registerd Machines"
+ $inObj = [ordered] @{
+ 'Name' = $RegisteredPhysicalMachines.MachineBase.name
+ 'DNS Name' = $RegisteredPhysicalMachines.MachineBase.DnsName
+ 'Description' = $RegisteredPhysicalMachines.MachineBase.Description
+ 'OperatingSystem' = $RegisteredPhysicalMachines.MachineBase.Description
+ }
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+ if ($HealthCheck.RegisteredMachines.Status) {
+ $OutObj | Where-Object { $_.'Status' -ne 'AVAILABLE' } | Set-Style -Style Warning
+ }
+ $TableParams = @{
+ Name = "Other Registered Machines - $($HVEnvironment.toUpper())"
+ List = $false
+ ColumnWidths = 20, 20, 30, 30
+ }
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZRolePermission.ps1 b/1.1.5/Src/Private/Get-AbrHRZRolePermission.ps1
new file mode 100644
index 0000000..75e80dd
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZRolePermission.ps1
@@ -0,0 +1,132 @@
+function Get-AbrHRZRolePermission {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "Role Permissions InfoLevel set at $($InfoLevel.Settings.Administrators.RolePermissions)."
+ Write-PScriboMessage "Collecting Role Permissions information."
+ }
+
+ process {
+ try {
+ if ($Permissions) {
+ if ($InfoLevel.Settings.Administrators.RolePermissions -ge 1) {
+ Section -Style Heading3 "Role Permissions" {
+ Paragraph "The following section details the Role Permissions information for $($HVEnvironment.toUpper()) server."
+ BlankLine
+ $OutObj = @()
+
+ $FilteredPermissions = ''
+ $FilteredPermissions = $Permissions | Where-Object { $null -eq $_.base.GlobalAccessGroup }
+
+ foreach ($Permission in $FilteredPermissions) {
+ Write-PScriboMessage "Discovered Role Permissions Information."
+ $AdministratorIDNameResults = ''
+ # Find Administrator ID Name
+ $AdministratorIDName = ''
+ $PermissionGroups = $Permission.base.UserOrGroup.id
+ foreach ($PermissionGroup in $PermissionGroups) {
+ foreach ($Administrator in $Administrators) {
+ if ($Administrator.Id.id -eq $PermissionGroup) {
+ $AdministratorIDName = $Administrator.base.name
+ break
+ }
+ }
+ if ($PermissionGroups.count -gt 1) {
+ $AdministratorIDNameResults += "$AdministratorIDName, "
+ $AdministratorIDName = $AdministratorIDNameResults.TrimEnd(', ')
+ }
+ }
+ Switch ($AdministratorIDName) {
+ '' { $AdministratorIDName = 'N/A' }
+ ' ' { $AdministratorIDName = 'N/A' }
+ }
+
+ # Mach Permission Role ID with Role ID
+ # Find Role ID Name
+ $RoleIDName = ''
+ $PermissionGroups = $Permission.base.Role.id
+ foreach ($PermissionGroup in $PermissionGroups) {
+
+ foreach ($Role in $Roles) {
+ if ($Role.Id.id -eq $PermissionGroup) {
+ $RoleIDName = $Role.base.name
+ break
+ }
+
+ }
+ if ($PermissionGroups.count -gt 1) {
+ $RoleIDNameResults += "$RoleIDName, "
+ $RoleIDName = $RoleIDNameResults.TrimEnd(', ')
+ $RoleIDName = [string](($RoleIDName.split(', ') | Select-Object -Unique) -join ', ')
+ }
+ }
+
+ # Find AccessGroup ID Name
+ $AccessGroupIDNameResults = ''
+ $AccessGroupIDName = ''
+ $PermissionGroups = $Permission.base.AccessGroup.id
+ foreach ($PermissionGroup in $PermissionGroups) {
+ foreach ($AccessGroup in $AccessGroups) {
+ if ($AccessGroup.Id.id -eq $PermissionGroup) {
+ $AccessGroupIDName = "/$($AccessGroup.base.name)"
+ } elseif ($AccessGroup.Children.id.id -eq $PermissionGroup) {
+ $AccessGroupIDName = "/Root/$(($AccessGroup.Children | Where-Object {$_.id.id -eq $PermissionGroup}).Base.Name)"
+ } else {
+ $AccessGroupIDName = "Federation Access Group"
+ }
+ }
+ if ($PermissionGroups.count -gt 1) {
+ $AccessGroupIDNameResults += "$AccessGroupIDName, "
+ $AccessGroupIDName = $AccessGroupIDNameResults.TrimEnd(', ')
+ }
+ }
+
+ $inObj = [ordered] @{
+ 'User or Group Name' = $AdministratorIDName
+ 'Role' = $RoleIDName
+ 'Access Group' = $AccessGroupIDName
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+
+ $TableParams = @{
+ Name = "Role Permissions - $($HVEnvironment.toUpper())"
+ List = $false
+ ColumnWidths = 33, 33, 34
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Sort-Object -Property 'User or Group Name' | Table @TableParams
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZRolePrivilege.ps1 b/1.1.5/Src/Private/Get-AbrHRZRolePrivilege.ps1
new file mode 100644
index 0000000..a101103
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZRolePrivilege.ps1
@@ -0,0 +1,95 @@
+function Get-AbrHRZRolePrivilege {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "Role Provilege InfoLevel set at $($InfoLevel.Settings.Administrators.RolePrivileges)."
+ Write-PScriboMessage "Collecting Role Provilege information."
+ }
+
+ process {
+ try {
+ if ($Roles) {
+ if ($InfoLevel.Settings.Administrators.RolePrivileges -ge 1) {
+ Section -Style Heading3 "Role Privileges" {
+ Paragraph "The following section details the Role Privileges information for $($HVEnvironment.toUpper()) server."
+ BlankLine
+ $OutObj = @()
+ foreach ($Role in $Roles) {
+ Write-PScriboMessage "Discovered Role Provilege Information."
+ $inObj = [ordered] @{
+ 'Name' = $Role.base.Name
+ 'Description' = $Role.base.Description
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+
+ $TableParams = @{
+ Name = "Role Privileges - $($HVEnvironment.toUpper())"
+ List = $false
+ ColumnWidths = 50, 50
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Sort-Object -Property 'Name' | Table @TableParams
+ }
+ if ($InfoLevel.Settings.Administrators.RolePrivileges -ge 2) {
+ Section -Style Heading4 "Role Privileges Details" {
+ Paragraph "The following section details the Role Privilege details for information for $($HVEnvironment.toUpper()) server."
+ BlankLine
+ $OutObj = @()
+ foreach ($Role in $Roles) {
+ Write-PScriboMessage "Discovered Role Provilege Detailed Information for $($HVEnvironment.toUpper()) server."
+ $inObj = [ordered] @{
+ 'Name' = $Role.base.Name
+ 'Description' = [string]::join("`n", $($Role.base.Privileges))
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+
+ $TableParams = @{
+ Name = "Role Privileges Details - $($Role.base.Name)"
+ List = $false
+ ColumnWidths = 50, 50
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Sort-Object -Property 'Name' | Table @TableParams
+ }
+ }
+
+
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZSite.ps1 b/1.1.5/Src/Private/Get-AbrHRZSite.ps1
new file mode 100644
index 0000000..ec36be0
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZSite.ps1
@@ -0,0 +1,79 @@
+function Get-AbrHRZSite {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "Site InfoLevel set at $($InfoLevel.Settings.Sites.Sites)."
+ Write-PScriboMessage "Collecting Cloud Pod Site information."
+ }
+
+ process {
+ try {
+ if ($CloudPodSites) {
+ if ($InfoLevel.Settings.Sites.Sites -ge 1) {
+ Section -Style Heading2 "Site" {
+ Paragraph "The following section details on the Cloud Pod Site information for $($HVEnvironment.toUpper())."
+ BlankLine
+ $OutObj = @()
+ foreach ($CloudPodSite in $CloudPodSites) {
+
+ # Find CloudPod Info
+ foreach ($CloudPodList in $CloudPodLists) {
+ if ($CloudPodList.Id.id -eq $CloudPodSite.pods.id) {
+ $CloudPodDisplayName = $CloudPodList.DisplayName
+ break
+ } # if($AccessGroup.Id.id -eq $RDSServers.base.accessgroup.id)
+ } # Close out foreach($AccessGroup in $AccessGroups)
+
+
+ Write-PScriboMessage "Discovered Site Information."
+ $inObj = [ordered] @{
+ 'Cloud Pod Sites Name' = $CloudPodSite.base.DisplayName
+ 'Cloud Pod Sites Description' = $CloudPodSite.base.Description
+ 'Cloud Pod Site Pod Name' = $CloudPodDisplayName
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+
+ $TableParams = @{
+ Name = "Site - $($HVEnvironment.toUpper())"
+ List = $true
+ ColumnWidths = 50, 50
+ }
+
+ if ($Report.ShowTableCaptions) {
+ #$TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+
+
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZTSSO.ps1 b/1.1.5/Src/Private/Get-AbrHRZTSSO.ps1
new file mode 100644
index 0000000..f89129c
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZTSSO.ps1
@@ -0,0 +1,91 @@
+function Get-AbrHRZTSSO {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "TrueSSO InfoLevel set at $($InfoLevel.Settings.Servers.ConnectionServers.TrueSSO)."
+ Write-PScriboMessage "TrueSSO information."
+ }
+
+ process {
+ try {
+ if ($CertificateSSOconnectorHealthlist) {
+ if ($InfoLevel.settings.servers.ConnectionServers.TrueSSO -ge 1) {
+ Section -Style Heading3 "TrueSSO Information" {
+ Paragraph "The following section details on the TrueSSO information for $($HVEnvironment.toUpper())."
+ BlankLine
+ $OutObj = @()
+ foreach ($CertificateSSOconnectorHealth in $CertificateSSOconnectorHealthlist) {
+ if ($CertificateSSOconnectorHealth) {
+
+ Write-PScriboMessage "Discovered TrueSSO Information."
+ $inObj = [ordered] @{
+ 'TrueSSO Name' = $CertificateSSOconnectorHealth.DisplayName
+ 'TrueSSO Enabled' = $CertificateSSOconnectorHealth.Enabled
+ 'TrueSSO State' = $CertificateSSOconnectorHealth.Data.OverallState
+ 'Primary Enrollment Server' = $CertificateSSOconnectorHealth.Data.PrimaryEnrollmentServerHealth.DnsName
+ 'Primary Enrollment Server State' = $CertificateSSOconnectorHealth.Data.PrimaryEnrollmentServerHealth.State
+ 'Primary Enrollment Server State Reason' = $CertificateSSOconnectorHealth.Data.PrimaryEnrollmentServerHealth.StateReasons
+ 'Secondary Enrollment Server' = $CertificateSSOconnectorHealth.Data.SecondaryEnrollmentServerHealth.DnsName
+ 'Secondary Enrollment Server State' = $CertificateSSOconnectorHealth.Data.SecondaryEnrollmentServerHealth.State
+ 'Secondary Enrollment Server State Reason' = $CertificateSSOconnectorHealth.Data.SecondaryEnrollmentServerHealth.StateReasons
+ 'Template Name' = $CertificateSSOconnectorHealth.Data.TemplateHealth.name
+ 'Template State' = $CertificateSSOconnectorHealth.Data.TemplateHealth.State
+ 'Template Primary Enrollment Server State Reason' = $CertificateSSOconnectorHealth.Data.TemplateHealth.PrimaryEnrollmentServerStateReasons
+ 'Template Secondary Enrollment Server State Reason' = $CertificateSSOconnectorHealth.Data.TemplateHealth.SecondaryEnrollmentServerStateReasons
+ 'Certificate Server Name' = $CertificateSSOconnectorHealth.Data.CertificateServerHealths.Name
+ 'Certificate Server State' = $CertificateSSOconnectorHealth.Data.CertificateServerHealths.State
+ 'Certificate Server Primary Enrollment Server State Reason' = $CertificateSSOconnectorHealth.Data.CertificateServerHealths.PrimaryEnrollmentServerStateReasons
+ 'Certificate Server Secondary Enrollment Server State Reason' = $CertificateSSOconnectorHealth.Data.CertificateServerHealths.SecondaryEnrollmentServerStateReasons
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ }
+ if (-not $CertificateSSOconnectorHealth.Data.SecondaryEnrollmentServerHealth.DnsName) {
+ $inObj.Remove('Secondary Enrollment Server')
+ $inObj.Remove('Secondary Enrollment Server State')
+ $inObj.Remove('Secondary Enrollment Server State Reason')
+ $inObj.Remove('Template Secondary Enrollment Server State Reason')
+ $inObj.Remove('Certificate Server Secondary Enrollment Server State Reason')
+ }
+ }
+
+ $TableParams = @{
+ Name = "TrueSSO Information - $($HVEnvironment.toUpper())"
+ List = $true
+ ColumnWidths = 50, 50
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZUAG.ps1 b/1.1.5/Src/Private/Get-AbrHRZUAG.ps1
new file mode 100644
index 0000000..5b82b9f
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZUAG.ps1
@@ -0,0 +1,76 @@
+function Get-AbrHRZUAG {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "SecurityServers InfoLevel set at $($InfoLevel.Settings.Servers.vCenterServers.ADDomains)."
+ Write-PScriboMessage "Collecting Gateway Servers information."
+ }
+
+ process {
+ try {
+ if ($GatewayServers) {
+ if ($InfoLevel.Settings.Servers.UAG.UAGServers -ge 1) {
+ Section -Style Heading3 "Gateway Servers" {
+ Paragraph "The following section details the Gateway Servers information for $($HVEnvironment.toUpper())."
+ BlankLine
+ $OutObj = @()
+ foreach ($GatewayServer in $GatewayServers.GeneralData) {
+ try {
+ Write-PScriboMessage "Discovered UAG Information $($GatewayServer.Name)."
+ Switch ($GatewayServer.Type) {
+ 'AP' { $GatewayType = 'UAG' }
+ }
+ $inObj = [ordered] @{
+ 'Name' = $GatewayServer.Name
+ 'IP' = $GatewayServer.Address
+ 'Version' = $GatewayServer.Version
+ 'Type' = $GatewayType
+ 'Zone Internal' = $GatewayServer.GatewayZoneInternal
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+
+ $TableParams = @{
+ Name = "Gateway Servers - $($HVEnvironment.toUpper())"
+ List = $false
+ ColumnWidths = 35, 20, 15, 15, 15
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Sort-Object -Property 'Name' | Table @TableParams
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZUnauthenticatedACL.ps1 b/1.1.5/Src/Private/Get-AbrHRZUnauthenticatedACL.ps1
new file mode 100644
index 0000000..7ccaaeb
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZUnauthenticatedACL.ps1
@@ -0,0 +1,92 @@
+function Get-AbrHRZUnauthenticatedACL {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "UnauthenticatedAccess InfoLevel set at $($InfoLevel.UsersAndGroups.UnauthenticatedAccess)."
+ Write-PScriboMessage "Collecting Unauthenticated Access Information."
+ }
+
+ process {
+ if ($InfoLevel.UsersAndGroups.UnauthenticatedAccess -ge 1) {
+ try {
+ if ($unauthenticatedAccessList) {
+ Section -Style Heading3 "Unauthenticated Access" {
+ Paragraph "The following section provide a summary of user and group unauthenticated access configuration."
+ BlankLine
+ $OutObj = @()
+ foreach ($unauthenticatedAccess in $unauthenticatedAccessList) {
+ try {
+ # User Info
+ try {
+ $unauthenticatedAccessUserIDName = ''
+ if ($unauthenticatedAccess.userdata.UserId) {
+ $unauthenticatedAccessUserID = $hzServices.ADUserOrGroup.ADUserOrGroup_Get($unauthenticatedAccess.userdata.UserId)
+ $unauthenticatedAccessUserIDName = $unauthenticatedAccessUserID.Base.DisplayName
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ # Pod Info
+ try {
+ $unauthenticatedAccessPodListName = ''
+ if ($unauthenticatedAccess.SourcePods) {
+ $unauthenticatedAccessPodList = $CloudPodLists | Where-Object { $_.id.id -eq $unauthenticatedAccess.SourcePods.Id }
+ $unauthenticatedAccessPodListName = $unauthenticatedAccessPodList.DisplayName
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+
+ $inObj = [ordered] @{
+ 'Login Name' = $unauthenticatedAccess.userdata.LoginName
+ 'User ID' = $unauthenticatedAccessUserIDName
+ 'Description' = $unauthenticatedAccess.userdata.Description
+ 'Hybrid Logon' = $unauthenticatedAccess.userdata.HybridLogonConfig
+ 'Pod Name' = $unauthenticatedAccessPodListName
+ }
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+
+ $TableParams = @{
+ Name = "Unauthenticated Access - $($HVEnvironment.toUpper())"
+ List = $false
+ ColumnWidths = 20, 20, 20, 20, 20
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Sort-Object -Property 'Login Name' | Table @TableParams
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZVcenter.ps1 b/1.1.5/Src/Private/Get-AbrHRZVcenter.ps1
new file mode 100644
index 0000000..7c50f6f
--- /dev/null
+++ b/1.1.5/Src/Private/Get-AbrHRZVcenter.ps1
@@ -0,0 +1,161 @@
+function Get-AbrHRZVcenter {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "vCenterServers InfoLevel set at $($InfoLevel.Settings.Servers.vCenterServers.vCenter)."
+ Write-PScriboMessage "Collecting vCenterServers information."
+ }
+
+ process {
+ try {
+ if ($vCenterServers) {
+ if ($InfoLevel.Settings.Servers.vCenterServers.vCenter -ge 1) {
+ Section -Style Heading3 "vCenter Servers" {
+ Paragraph "The following section details the vCenter Servers configuration for $($HVEnvironment.toUpper()) server."
+ BlankLine
+ $vCenterHealthData = $vCenterHealth.data
+ $OutObj = @()
+ foreach ($vCenterServer in $vCenterServers) {
+ try {
+ Write-PScriboMessage "Discovered Virtual Centers Information $($vCenterServer.serverspec.ServerName)."
+ $inObj = [ordered] @{
+ 'Name' = $vCenterServer.serverspec.ServerName
+ 'Version' = ($vCenterHealthData | Where-Object { $_.InstanceUuid -eq $vCenterServer.InstanceUuid }).Version
+ 'Build Number' = ($vCenterHealthData | Where-Object { $_.InstanceUuid -eq $vCenterServer.InstanceUuid }).Build
+ 'API Version' = ($vCenterHealthData | Where-Object { $_.InstanceUuid -eq $vCenterServer.InstanceUuid }).ApiVersion
+ 'Provisioning Enabled' = ConvertTo-TextYN $vCenterServer.Enabled
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+
+ $TableParams = @{
+ Name = "vCenter - $($HVEnvironment.split(".").toUpper()[0])"
+ List = $false
+ ColumnWidths = 40, 15, 15, 15, 15
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Sort-Object -Property 'Name' | Table @TableParams
+ try {
+ if ($InfoLevel.Settings.Servers.vCenterServers.vCenter -ge 2) {
+ foreach ($vCenterServer in $vCenterServers) {
+ try {
+ Section -Style Heading4 "$($vCenterServer.serverspec.ServerName)" {
+ $OutObj = @()
+ Write-PScriboMessage "Discovered Virtual Centers Information $($vCenterServer.serverspec.ServerName)."
+ $inObj = [ordered] @{
+ 'Name' = $vCenterServer.serverspec.ServerName
+ 'Description' = $vCenterServer.Description
+ 'Certificate Override' = $vCenterServer.CertificateOverride
+ 'Provisioning Enabled' = $vCenterServer.Enabled
+ 'Reclaim Disk Space' = $vCenterServer.SeSparseReclamationEnabled
+ 'Port' = $vCenterServer.serverspec.Port
+ 'User SSL' = $vCenterServer.serverspec.UseSSL
+ 'User Name' = $vCenterServer.serverspec.UserName
+ 'Type' = $vCenterServer.serverspec.ServerType
+ 'TCP Port Number' = $vCenterServer.serverspec.Port
+ 'Max Concurrent Provisioning Operations' = $vCenterServer.Limits.VcProvisioningLimit
+ 'Max Concurrent Power Operations' = $vCenterServer.Limits.VcPowerOperationsLimit
+ 'Max Concurrent View Composer Maintenance Operations' = $vCenterServer.Limits.ViewComposerProvisioningLimit
+ 'Max Concurrent View Composer Provisioning Operations' = $vCenterServer.Limits.ViewComposerMaintenanceLimit
+ 'Max Concurrent Instant Clone Engine Provisioning Operations' = $vCenterServer.Limits.InstantCloneEngineProvisioningLimit
+ 'Storage Acceleration Enabled' = $vCenterServer.StorageAcceleratorData.Enabled
+ 'Storage Accelerator Default Cache Size' = "$($vCenterServer.StorageAcceleratorData.DefaultCacheSizeMB)MB"
+ }
+
+ $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
+
+ $TableParams = @{
+ Name = "vCenter Server Details - $($vCenterServer.serverspec.ServerName)"
+ List = $true
+ ColumnWidths = 50, 50
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Table @TableParams
+ try {
+ $HorizonVirtualCenterStorageAcceleratorHostOverrides = $vCenterServer.StorageAcceleratorData.HostOverrides
+ if ($HorizonVirtualCenterStorageAcceleratorHostOverrides) {
+ Section -ExcludeFromTOC -Style NOTOCHeading6 "Storage Accelerator Overrides" {
+ $OutObj = @()
+ foreach ($HorizonVirtualCenterStorageAcceleratorHostOverride in $HorizonVirtualCenterStorageAcceleratorHostOverrides) {
+ try {
+ Write-PScriboMessage "Discovered Storage Accelerator Overrides Information $($vCenterServer.serverspec.ServerName)."
+ $DATACENTER = $HorizonVirtualCenterStorageAcceleratorHostOverride.Path.Split('/')[1]
+ $Cluster = $HorizonVirtualCenterStorageAcceleratorHostOverride.Path.Split('/')[3]
+ $VMHost = $HorizonVirtualCenterStorageAcceleratorHostOverride.Path.Split('/')[4]
+ $inObj = [ordered] @{
+ 'Datacenter' = $DATACENTER
+ 'Cluster' = $Cluster
+ 'Host' = $VMHost
+ 'Cache Size' = "$($HorizonVirtualCenterStorageAcceleratorHostOverride.CacheSizeMB)MB"
+ }
+
+ $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+
+ $TableParams = @{
+ Name = "Storage Accelerator Overrides - $($vCenterServer.serverspec.ServerName)"
+ List = $false
+ ColumnWidths = 25, 25, 25, 25
+ }
+
+ if ($Report.ShowTableCaptions) {
+ $TableParams['Caption'] = "- $($TableParams.Name)"
+ }
+ $OutObj | Sort-Object -Property 'Cluster' | Table @TableParams
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+ end {}
+}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-RequiredModule.ps1 b/1.1.5/Src/Private/Get-RequiredModule.ps1
new file mode 100644
index 0000000..aead3d2
--- /dev/null
+++ b/1.1.5/Src/Private/Get-RequiredModule.ps1
@@ -0,0 +1,36 @@
+function Get-RequiredModule {
+ <#
+ .SYNOPSIS
+ Function to check if the required version of VMware PowerCLI is installed
+ .DESCRIPTION
+ Function to check if the required version of VMware PowerCLI is installed
+ .PARAMETER Name
+ The name of the required PowerShell module
+ .PARAMETER Version
+ The version of the required PowerShell module
+ #>
+ [CmdletBinding()]
+
+ Param
+ (
+ [Parameter(Mandatory = $true, ValueFromPipeline = $false)]
+ [ValidateNotNullOrEmpty()]
+ [String] $Name,
+
+ [Parameter(Mandatory = $true, ValueFromPipeline = $false)]
+ [ValidateNotNullOrEmpty()]
+ [String] $Version
+ )
+ process {
+ # Check if the required version of VMware PowerCLI is installed
+ $RequiredModule = Get-Module -ListAvailable -Name $Name | Sort-Object -Property Version -Descending | Select-Object -First 1
+ $ModuleVersion = "$($RequiredModule.Version.Major)" + "." + "$($RequiredModule.Version.Minor)"
+ if ($ModuleVersion -eq ".") {
+ throw "VMware PowerCLI $Version or higher is required to run the VMware Horizon As Built Report. Run 'Install-Module -Name $Name -MinimumVersion $Version' to install the required modules."
+ }
+ if ($ModuleVersion -lt $Version) {
+ throw "VMware PowerCLI $Version or higher is required to run the VMware Horizon As Built Report. Run 'Update-Module -Name $Name -MinimumVersion $Version' to update the required modules."
+ }
+ }
+ end {}
+}
diff --git a/1.1.5/Src/Private/SharedUtilsFunctions.ps1 b/1.1.5/Src/Private/SharedUtilsFunctions.ps1
new file mode 100644
index 0000000..552f6cb
--- /dev/null
+++ b/1.1.5/Src/Private/SharedUtilsFunctions.ps1
@@ -0,0 +1,153 @@
+function ConvertTo-TextYN {
+ <#
+ .SYNOPSIS
+ Used by As Built Report to convert true or false automatically to Yes or No.
+ .DESCRIPTION
+
+ .NOTES
+ Version: 0.3.0
+ Author: LEE DAILEY
+
+ .EXAMPLE
+
+ .LINK
+
+ #>
+ [CmdletBinding()]
+ [OutputType([String])]
+ Param (
+ [Parameter (
+ Position = 0,
+ Mandatory)]
+ [AllowEmptyString()]
+ [string] $TEXT
+ )
+
+ switch ($TEXT) {
+ "" { "--"; break }
+ " " { "--"; break }
+ $Null { "--"; break }
+ "True" { "Yes"; break }
+ "False" { "No"; break }
+ default { $TEXT }
+ }
+} # end
+function Get-UnixDate ($UnixDate) {
+ <#
+ .SYNOPSIS
+ Used by As Built Report to convert Date to a more nice format.
+ .DESCRIPTION
+
+ .NOTES
+ Version: 0.2.0
+ Author: LEE DAILEY
+
+ .EXAMPLE
+
+ .LINK
+
+ #>
+ [timezone]::CurrentTimeZone.ToLocalTime(([datetime]'1/1/1970').AddSeconds($UnixDate))
+} # end
+function ConvertTo-EmptyToFiller {
+ <#
+ .SYNOPSIS
+ Used by As Built Report to convert empty columns to "-".
+ .DESCRIPTION
+
+ .NOTES
+ Version: 0.5.0
+ Author: Jonathan Colon
+
+ .EXAMPLE
+
+ .LINK
+
+ #>
+ [CmdletBinding()]
+ [OutputType([String])]
+ Param (
+ [Parameter (
+ Position = 0,
+ Mandatory)]
+ [AllowEmptyString()]
+ [string]
+ $TEXT
+ )
+
+ switch ($TEXT) {
+ "" { "-"; break }
+ $Null { "-"; break }
+ "True" { "Yes"; break }
+ "False" { "No"; break }
+ default { $TEXT }
+ }
+} # end
+
+function ConvertTo-VIobject {
+ <#
+ .SYNOPSIS
+ Used by As Built Report to convert object to VIObject.
+ .DESCRIPTION
+
+ .NOTES
+ Version: 0.1.0
+ Author: Jon Colon
+
+ .EXAMPLE
+
+ .LINK
+
+ #>
+ [CmdletBinding()]
+ [OutputType([String])]
+ Param (
+ [Parameter (
+ Position = 0,
+ Mandatory)]
+ [AllowEmptyString()]
+ $OBJECT
+ )
+
+ if (Get-View $OBJECT -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Name -Unique) {
+ return Get-View $OBJECT -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Name -Unique
+ } else {
+ return $OBJECT
+ }
+} # end
+
+function ConvertTo-HashToYN {
+ <#
+ .SYNOPSIS
+ Used by As Built Report to convert array content true or false automatically to Yes or No.
+ .DESCRIPTION
+
+ .NOTES
+ Version: 0.2.0
+ Author: Jonathan Colon
+
+ .EXAMPLE
+
+ .LINK
+
+ #>
+ [CmdletBinding()]
+ [OutputType([System.Collections.Specialized.OrderedDictionary])]
+ Param (
+ [Parameter (Position = 0, Mandatory)]
+ [AllowEmptyString()]
+ [System.Collections.Specialized.OrderedDictionary] $TEXT
+ )
+
+ $result = [ordered] @{}
+ foreach ($i in $TEXT.GetEnumerator()) {
+ try {
+ $result.add($i.Key, (ConvertTo-TextYN $i.Value))
+ } catch {
+ $result.add($i.Key, ($i.Value))
+ }
+ }
+ if ($result) {
+ return $result
+ } else { return $TEXT }
+} # end
\ No newline at end of file
diff --git a/1.1.5/Src/Public/Invoke-ASBuiltReport.VMware.Horizon.ps1 b/1.1.5/Src/Public/Invoke-ASBuiltReport.VMware.Horizon.ps1
new file mode 100644
index 0000000..10affe7
--- /dev/null
+++ b/1.1.5/Src/Public/Invoke-ASBuiltReport.VMware.Horizon.ps1
@@ -0,0 +1,483 @@
+function Invoke-AsBuiltReport.VMware.Horizon {
+ <#
+ .SYNOPSIS
+ PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
+ .DESCRIPTION
+ Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
+ .NOTES
+ Version: 1.1.5
+ Author: Chris Hildebrandt, Karl Newick
+ Twitter: @childebrandt42, @karlnewick
+ Editor: Jonathan Colon, @jcolonfzenpr
+ Twitter: @asbuiltreport
+ Github: AsBuiltReport
+ Credits: Iain Brighton (@iainbrighton) - PScribo module
+
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ param (
+ [String[]] $Target,
+ [PSCredential] $Credential
+ )
+
+ if ($psISE) {
+ Write-Error -Message "You cannot run this script inside the PowerShell ISE. Please execute it from the PowerShell Command Window."
+ break
+ }
+
+ Write-PScriboMessage -Plugin "Module" -IsWarning "Please refer to the AsBuiltReport.VMware.Horizon github website for more detailed information about this project."
+ Write-PScriboMessage -Plugin "Module" -IsWarning "Do not forget to update your report configuration file after each new version release."
+ Write-PScriboMessage -Plugin "Module" -IsWarning "Documentation: https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon"
+ Write-PScriboMessage -Plugin "Module" -IsWarning "Issues or bug reporting: https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues"
+ Write-PScriboMessage -Plugin "Module" -IsWarning "This project is community maintained and has no sponsorship from VMware/Omnissa, its employees or any of its affiliates."
+
+ Try {
+ $InstalledVersion = Get-Module -ListAvailable -Name AsBuiltReport.VMware.Horizon -ErrorAction SilentlyContinue | Sort-Object -Property Version -Descending | Select-Object -First 1 -ExpandProperty Version
+
+ if ($InstalledVersion) {
+ Write-PScriboMessage -IsWarning "AsBuiltReport.VMware.Horizon $($InstalledVersion.ToString()) is currently installed."
+ $LatestVersion = Find-Module -Name AsBuiltReport.VMware.Horizon -Repository PSGallery -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Version
+ if ($LatestVersion -gt $InstalledVersion) {
+ Write-PScriboMessage -IsWarning "AsBuiltReport.VMware.Horizon $($LatestVersion.ToString()) is available."
+ Write-PScriboMessage -IsWarning "Run 'Update-Module -Name AsBuiltReport.VMware.Horizon -Force' to install the latest version."
+ }
+ }
+ } Catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+
+ # Check if the required version of VMware PowerCLI is installed
+ Get-RequiredModule -Name 'VMware.PowerCLI' -Version '13.2'
+
+ # Import Report Configuration
+ $Report = $ReportConfig.Report
+ $InfoLevel = $ReportConfig.InfoLevel
+ $HealthCheck = $ReportConfig.HealthCheck
+ $Options = $ReportConfig.Options
+
+
+ foreach ($HVEnvironment in $Target) {
+
+ Try {
+ $HvServer = Connect-HVServer -Server $HVEnvironment -Credential $Credential -ErrorAction Stop
+ } Catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+
+
+ # Generate report if connection to Horizon Environment Server Connection is successful
+ if ($HvServer) {
+
+ #Environment Varibles
+
+ # Assign a variable to obtain the API Extension Data
+ $hzServices = $hvServer.ExtensionData
+
+ # Define HV Query Services
+ $Queryservice = New-Object vmware.hv.queryserviceservice
+
+ # Virtual Centers
+ $vCenterServers = try { $hzServices.VirtualCenter.VirtualCenter_List() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
+
+ # vCenter Health, ESX Hosts, and DataStores
+ $vCenterHealth = try { $hzServices.VirtualCenterHealth.VirtualCenterHealth_List() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
+
+ # ESXHosts
+ #$esxhosts = $vCenterHealth
+
+ # DataStores
+ #$datastores = $vCenterHealth
+
+ # Domains
+ $Domains = try { $hzServices.ADDomainHealth.ADDomainHealth_List() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
+
+ # Connection Server Info
+ $connectionservers = try { $hzServices.ConnectionServer.ConnectionServer_List() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
+
+ # Connection Server Health
+ $ConnectionServersHealth = try { $hzServices.ConnectionServerHealth.ConnectionServerHealth_List() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
+
+ # TrueSSO
+ $CertificateSSOconnectorHealthlist = try { $hzServices.CertificateSSOConnectorHealth.CertificateSSOConnectorHealth_list()} catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
+
+ # SAML SSO
+ $SAMLAuthenticatorhealthlist=$hzServices.SAMLAuthenticatorHealth.SAMLAuthenticatorHealth_list()
+
+ # Pod Health
+
+
+ # GateWay Server Info
+ $GatewayServers = try { $hzServices.Gateway.Gateway_List() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
+
+ # Instant Clone Domain Admins
+ $InstantCloneDomainAdmins = try { $hzServices.InstantCloneEngineDomainAdministrator.InstantCloneEngineDomainAdministrator_List() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
+
+ # AD Domains
+ $ADDomains = try { $hzServices.ADDomain.ADDomain_List() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
+
+ # Product Licensing Info
+ $ProductLicenseingInfo = try { $hzServices.License.License_Get() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
+
+ # Product Usage Info
+ $UsageStatisticsInfo = try { $hzServices.UsageStatistics.UsageStatistics_GetLicensingCounters() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
+
+ # Global Settings
+ $GlobalSettings = try { $hzServices.GlobalSettings.GlobalSettings_Get() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
+
+ # Administrators
+ $Administrators = try { $hzServices.AdminUserOrGroup.AdminUserOrGroup_List() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
+
+ # Cloud Pod Architecture
+ $CloudPodFederation = try { $hzServices.PodFederation.PodFederation_Get() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
+
+ # Sites
+ $CloudPodSites = try { $hzServices.Site.Site_List() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
+ $CloudPodLists = try { $hzServices.Pod.Pod_List() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
+ $CloudPodListsLocal = try { $hzServices.Pod.Pod_List() | Where-Object {$_.localpod -eq $false} } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
+
+ # Event Database Info
+ $EventDataBases = try { $hzServices.EventDatabase.EventDatabase_Get() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
+
+ # Event Database Health Info
+ $EventDataBaseHealth = try { $hzServices.EventDatabaseHealth.EventDatabaseHealth_get() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
+
+ # Syslog Info
+ $Syslog = try { $hzServices.Syslog.Syslog_Get() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
+
+ # Virtual Centers
+ $vCenterServers = try { $hzServices.VirtualCenter.VirtualCenter_List() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
+
+ # Global Policies
+ try {
+ $GlobalPoliciesService = New-Object VMware.Hv.PoliciesService
+ $GlobalPolicies = $GlobalPoliciesService.Policies_Get($hvServer.ExtensionData, $null, $null)
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+
+ # Unauthenticated Access
+ $unauthenticatedAccessList = try { $hzServices.UnauthenticatedAccessUser.UnauthenticatedAccessUser_List() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
+
+ try {
+ $EntitledUserOrGroupLocalMachineQueryDefn = New-Object VMware.Hv.QueryDefinition
+ $EntitledUserOrGroupLocalMachineQueryDefn.queryentitytype = 'EntitledUserOrGroupLocalSummaryView'
+ $EntitledUserOrGroupLocalMachinequeryResults = $Queryservice.QueryService_Create($hzServices, $EntitledUserOrGroupLocalMachineQueryDefn)
+ $EntitledUserOrGroupLocalMachines = foreach ($EntitledUserOrGroupLocalMachineresult in $EntitledUserOrGroupLocalMachinequeryResults.results) { $hzServices.EntitledUserOrGroup.EntitledUserOrGroup_GetLocalSummaryView($EntitledUserOrGroupLocalMachineresult.id) }
+ $queryservice.QueryService_DeleteAll($hzServices)
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+
+ try {
+ # Home Site Info
+ $HomesiteQueryDefn = New-Object VMware.Hv.QueryDefinition
+ $HomesiteQueryDefn.queryentitytype = 'UserHomeSiteInfo'
+ $HomesitequeryResults = $Queryservice.QueryService_Create($hzServices, $HomesiteQueryDefn)
+ $Homesites = foreach ($Homesiteresult in $HomesitequeryResults.results) {
+ $hzServices.UserHomeSite.UserHomeSite_GetInfos($Homesiteresult.id)
+ }
+ $queryservice.QueryService_DeleteAll($hzServices)
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+
+ try {
+ # Pool Info
+ $PoolQueryDefn = New-Object VMware.Hv.QueryDefinition
+ $PoolQueryDefn.queryentitytype = 'DesktopSummaryView'
+ $poolqueryResults = $Queryservice.QueryService_Create($hzServices, $PoolQueryDefn)
+ $Pools = foreach ($poolresult in $poolqueryResults.results) {
+ $hzServices.desktop.desktop_get($poolresult.id)
+ }
+ $queryservice.QueryService_DeleteAll($hzServices)
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+
+ try {
+ # Desktop Assignment Info
+ $DesktopAssignmentViewQueryDefn = New-Object VMware.Hv.QueryDefinition
+ $DesktopAssignmentViewQueryDefn.queryentitytype = 'DesktopAssignmentView'
+ $DesktopAssignmentViewResults = $Queryservice.QueryService_Create($hzServices, $DesktopAssignmentViewQueryDefn)
+ $DesktopAssignmentViewResultsData = $DesktopAssignmentViewResults.results
+ $queryservice.QueryService_DeleteAll($hzServices)
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+
+ try {
+ # Application Pools
+ $AppQueryDefn = New-Object VMware.Hv.QueryDefinition
+ $AppQueryDefn.queryentitytype = 'ApplicationInfo'
+ $AppqueryResults = $Queryservice.QueryService_Create($hzServices, $AppQueryDefn)
+ $Apps = foreach ($Appresult in $AppqueryResults.results) {
+ $hzServices.Application.Application_Get($Appresult.id)
+ }
+ $queryservice.QueryService_DeleteAll($hzServices)
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+
+ try {
+ # Global Entitlements
+ $GlobalEntitlementGroupsQueryDefn = New-Object VMware.Hv.QueryDefinition
+ $GlobalEntitlementGroupsQueryDefn.queryentitytype = 'GlobalEntitlementSummaryView'
+ $GlobalEntitlementGroupsqueryResults = $Queryservice.QueryService_Create($hzServices, $GlobalEntitlementGroupsQueryDefn)
+ $GlobalEntitlements = foreach ($GlobalEntitlementGroupsResult in $GlobalEntitlementGroupsqueryResults.results) {
+ $hzServices.GlobalEntitlement.GlobalEntitlement_Get($GlobalEntitlementGroupsResult.id)
+ }
+ $queryservice.QueryService_DeleteAll($hzServices)
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+
+ try {
+ # Entitled User Or Group Global
+ $GlobalApplicationEntitlementGroupsQueryDefn = New-Object VMware.Hv.QueryDefinition
+ $GlobalApplicationEntitlementGroupsQueryDefn.queryentitytype = 'GlobalApplicationEntitlementInfo'
+ $GlobalApplicationEntitlementGroupsqueryResults = $Queryservice.QueryService_Create($hzServices, $GlobalApplicationEntitlementGroupsQueryDefn)
+ $GlobalApplicationEntitlementGroups = foreach ($GlobalApplicationEntitlementGroupsResult in $GlobalApplicationEntitlementGroupsqueryResults.results) {
+ $hzServices.GlobalApplicationEntitlement.GlobalApplicationEntitlement_Get($GlobalApplicationEntitlementGroupsResult.id)
+ }
+ $queryservice.QueryService_DeleteAll($hzServices)
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+
+ try {
+ # EntitledUserOrGroupGlobalMachine Info
+ $EntitledUserOrGroupGlobalMachineQueryDefn = New-Object VMware.Hv.QueryDefinition
+ $EntitledUserOrGroupGlobalMachineQueryDefn.queryentitytype = 'EntitledUserOrGroupGlobalSummaryView'
+ $EntitledUserOrGroupGlobalMachinequeryResults = $Queryservice.QueryService_Create($hzServices, $EntitledUserOrGroupGlobalMachineQueryDefn)
+ $EntitledUserOrGroupGlobalMachines = foreach ($EntitledUserOrGroupGlobalMachineresult in $EntitledUserOrGroupGlobalMachinequeryResults.results) {
+ $hzServices.EntitledUserOrGroup.EntitledUserOrGroup_GetGlobalSummaryView($EntitledUserOrGroupGlobalMachineresult.id)
+ }
+ $queryservice.QueryService_DeleteAll($hzServices)
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+
+ # Entitled Global Users and Groups
+ try {
+ # EntitledUserOrGroupGlobal Info
+ $EntitledUserOrGroupGlobalQueryDefn = New-Object VMware.Hv.QueryDefinition
+ $EntitledUserOrGroupGlobalQueryDefn.queryentitytype = 'EntitledUserOrGroupGlobalSummaryView'
+ $EntitledUserOrGroupGlobalqueryResults = $Queryservice.QueryService_Create($hzServices, $EntitledUserOrGroupGlobalQueryDefn)
+ $EntitledUserOrGroupGlobals = foreach ($EntitledUserOrGroupGlobalresult in $EntitledUserOrGroupGlobalqueryResults.results) {
+ $hzServices.EntitledUserOrGroup.EntitledUserOrGroup_GetGlobalSummaryView($EntitledUserOrGroupGlobalresult.id)
+ }
+ $queryservice.QueryService_DeleteAll($hzServices)
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+
+
+ # Permissions
+ $Permissions = try { $hzServices.Permission.Permission_List() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
+
+ # Roles
+ $Roles = try { $hzServices.Role.Role_List() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
+
+ # Access Groups
+ $AccessGroups = $hzServices.AccessGroup.AccessGroup_List()
+
+ try {
+ # Farm Info
+ $FarmdQueryDefn = New-Object VMware.Hv.QueryDefinition
+ $FarmdQueryDefn.queryentitytype = 'FarmSummaryView'
+ $FarmqueryResults = $Queryservice.QueryService_Create($hzServices, $FarmdQueryDefn)
+ $Farms = foreach ($farmresult in $farmqueryResults.results) {
+ $hzServices.farm.farm_get($farmresult.id)
+ }
+ $queryservice.QueryService_DeleteAll($hzServices)
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+
+ try {
+ # Machines
+ $MachinesQueryDefn = New-Object VMware.Hv.QueryDefinition
+ $MachinesQueryDefn.queryentitytype = 'MachineSummaryView'
+ $MachinesqueryResults = $Queryservice.QueryService_Create($hzServices, $MachinesQueryDefn)
+ $Machines = foreach ($Machinesresult in $MachinesqueryResults.results) {
+ $hzServices.machine.machine_get($Machinesresult.id)
+ }
+ $queryservice.QueryService_DeleteAll($hzServices)
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+
+
+ try {
+ # RDS Servers
+ $RDSServerQueryDefn = New-Object VMware.Hv.QueryDefinition
+ $RDSServerQueryDefn.queryentitytype = 'RDSServerSummaryView'
+ $RDSServerqueryResults = $Queryservice.QueryService_Create($hzServices, $RDSServerQueryDefn)
+ $RDSServers = foreach ($RDSServerresult in $RDSServerqueryResults.results) {
+ $hzServices.RDSServer.RDSServer_GetSummaryView($RDSServerresult.id)
+ }
+ $queryservice.QueryService_DeleteAll($hzServices)
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+
+ # Base Images
+ try {
+ $BaseImageVMList = $vCenterServers | ForEach-Object { $hzServices.BaseImageVM.BaseImageVM_List($_.id, $null) }
+ $CompatibleBaseImageVMs = $BaseImageVMList | Where-Object {
+ ($_.IncompatibleReasons.InUseByDesktop -eq $false) -and
+ ($_.IncompatibleReasons.InUseByLinkedCloneDesktop -eq $false) -and
+ ($_.IncompatibleReasons.ViewComposerReplica -eq $false) -and
+ ($_.IncompatibleReasons.UnsupportedOS -eq $false) -and
+ ($_.IncompatibleReasons.NoSnapshots -eq $false) -and
+ (($null -eq $_.IncompatibleReasons.InstantInternal) -or ($_.IncompatibleReasons.InstantInternal -eq $false))
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+
+ # Registerd Physical Machines
+ Try {
+ $RegisteredPhysicalMachineInfoQueryDefn = New-Object VMware.Hv.QueryDefinition
+ $RegisteredPhysicalMachineInfoQueryDefn.queryentitytype = 'RegisteredPhysicalMachineInfo'
+ $RegisteredPhysicalMachineResults = $Queryservice.QueryService_Create($hzServices, $RegisteredPhysicalMachineInfoQueryDefn)
+ $RegisteredPhysicalMachines = foreach ($RegisteredPhysicalMachineresult in $RegisteredPhysicalMachineResults.results) { $hzServices.RegisteredPhysicalMachine.RegisteredPhysicalMachine_Get($RegisteredPhysicalMachineResult.id) }
+ $queryservice.QueryService_DeleteAll($hzServices)
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+
+ try {
+ # Template Images
+ $TemplateVMList = $vCenterServers | ForEach-Object { $hzServices.VmTemplate.VmTemplate_List($_.id) }
+ $CompatibleTemplateVMs = $TemplateVMList | Where-Object {
+ ($_.IncompatibleReasons.UnsupportedOS -eq $false)
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+
+ try {
+ # CEIP Info
+ $CEIP = $hzServices.CEIP.CEIP_Get()
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+
+ try {
+ # Global Access Group Info
+ $GlobalAccessGroups = $hzServices.GlobalAccessGroup.GlobalAccessGroup_List()
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+
+ try {
+ # Gateway Certificates
+ $script:GatewayCerts = $hzServices.GlobalSettings.GlobalSettings_ListGatewayCertificates()
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ Section -Style Heading1 "$($HVEnvironment.toUpper())" {
+ Get-AbrHRZInfrastructure
+ }
+
+ if ($InfoLevel.UsersAndGroups.PSObject.Properties.Value -ne 0) {
+ Section -Style Heading1 'Users and Groups' {
+ Paragraph 'The following section provides information about the permissions that control which remote desktops and applications your users can access.'
+ Get-AbrHRZLocalEntitlement
+ Get-AbrHRZHomeSite
+ Get-AbrHRZUnauthenticatedACL
+ }
+ }
+
+ if ($InfoLevel.Inventory.PSObject.Properties.Value -ne 0) {
+ Section -Style Heading1 'Inventory' {
+ Paragraph 'The following section provides detailed information about desktop, application, farm pools and global entitlement permissions that control which remote desktops and applications your users can access.'
+ Get-AbrHRZDesktopPool
+ Get-AbrHRZApplicationPool
+ Get-AbrHRZFarm
+ Get-AbrHRZMachine
+ Get-AbrHRZGlobalEntitlement
+ }
+ }
+
+ Section -Style Heading1 'Settings' {
+ Paragraph 'The following section provides detailed information about the configuration of the components that comprise the Horizon Server infrastructure.'
+ if ($InfoLevel.Settings.Servers.PSObject.Properties.Value -ne 0) {
+ Section -Style Heading2 'Servers' {
+ Get-AbrHRZVcenter
+ Get-AbrHRZDatastore
+ Get-AbrHRZESXi
+ Get-AbrHRZUAG
+ Get-AbrHRZConnectionServer
+ Get-AbrHRZGatewayCert
+ Get-AbrHRZTSSO
+ }
+ }
+
+ #Get-AbrHRZADDomain
+ Get-AbrHRZDomain
+ Get-AbrHRZCertMgmt
+ Get-AbrHRZLicense
+ Get-AbrHRZGlobalSetting
+ Get-AbrHRZRegisteredMachine
+
+ if ($InfoLevel.Settings.Administrators.PSObject.Properties.Value -ne 0) {
+ Section -Style Heading2 'Administrators' {
+ Get-AbrHRZAdminGroup
+ Get-AbrHRZRolePrivilege
+ Get-AbrHRZRolePermission
+ Get-AbrHRZAccessGroup
+ Get-AbrHRZFederationAccessGroup
+ }
+ }
+
+ Get-AbrHRZCloudPod
+ Get-AbrHRZSite
+ Get-AbrHRZEventConf
+ Get-AbrHRZGlobalpolicy
+ }
+ Write-PScriboMessage "Health Check InfoLevel set at $($HealthCheck.HealthCheck.Overview)."
+ if ($HealthCheck.HealthCheck) {
+ Section -Style Heading1 'Health Check' {
+ Paragraph 'The following section provides overall heath check of the environment.'
+ if ($HealthCheck.Components.ConnectionServers -or $HealthCheck.Components.GatewayServer -or $HealthCheck.Components.EventDataBases -or $HealthCheck.Components.TrueSSO -or $HealthCheck.Components.MessagingClient) {
+ Section -Style Heading2 'Components' {
+ Get-AbrHRZHCConnection
+ Get-AbrHRZHCGatewayServer
+ Get-AbrHRZHCEventDataBase
+ Get-AbrHRZHCTrueSSO
+ }
+ }
+ if ($HealthCheck.RDSFarms -and $farms) {
+ Section -Style Heading2 'RDS Farms' {
+ Get-AbrHRZHCRDSFarm
+ }
+ }
+ if ($healthcheck.vSphere.datastores -or $healthcheck.vSphere.vCenter -or $healthcheck.vSphere.esxiHosts) {
+ Section -Style Heading2 'vSphere' {
+ Get-AbrHRZHCDataStore
+ Get-AbrHRZHCvCenter
+ Get-AbrHRZHCESXiHost
+ }
+ }
+ if ($HealthCheck.OtherComponents.domains -or $HealthCheck.OtherComponents.SAML2 -or $HealthCheck.OtherComponents.LicenseService) {
+ Section -Style Heading2 'Other Components' {
+ Get-AbrHRZHCDomain
+ Get-AbrHRZHCSAML2
+ Get-AbrHRZHCLicenseService
+ }
+ }
+ if ($healthcheck.RemotePod.RemotePod -and $CloudPodListsLocal){
+ Section -Style Heading2 'Remote Pod' {
+ Get-AbrHRZHCRemotePod
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/AsBuiltReport.VMware.Horizon.json b/AsBuiltReport.VMware.Horizon.json
index c9cc70a..245419b 100644
--- a/AsBuiltReport.VMware.Horizon.json
+++ b/AsBuiltReport.VMware.Horizon.json
@@ -8,7 +8,23 @@
"ShowHeaderFooter": true,
"ShowTableCaptions": true
},
- "Options": {},
+ "Options": {
+ "EnableDiagrams": true,
+ "EnableDiagramDebug": false,
+ "DiagramColumnSize": 3,
+ "DiagramTheme": "White",
+ "DiagramWaterMark": "",
+ "DiagramType": {
+ "Infrastructure": true
+ },
+ "ExportDiagrams": false,
+ "ExportDiagramsFormat": [
+ "png"
+ ],
+ "EnableDiagramSignature": false,
+ "SignatureAuthorName": "",
+ "SignatureCompanyName": ""
+ },
"InfoLevel": {
"_comment_": "0 = Disabled, 1 = Summary, 2 = Informative, 3 = Detailed",
"UsersAndGroups": {
diff --git a/AsBuiltReport.VMware.Horizon.psd1 b/AsBuiltReport.VMware.Horizon.psd1
index d850237..a27d5f7 100644
--- a/AsBuiltReport.VMware.Horizon.psd1
+++ b/AsBuiltReport.VMware.Horizon.psd1
@@ -12,7 +12,7 @@
RootModule = 'AsBuiltReport.VMware.Horizon.psm1'
# Version number of this module.
- ModuleVersion = '1.1.5.1'
+ ModuleVersion = '1.2'
# Supported PSEditions
# CompatiblePSEditions = @()
@@ -54,7 +54,11 @@
RequiredModules = @(
@{
ModuleName = 'AsBuiltReport.Core';
- ModuleVersion = '1.4.2'
+ ModuleVersion = '1.4.3'
+ }
+ @{
+ ModuleName = 'Diagrammer.Core';
+ ModuleVersion = '0.2.29'
}
)
# Assemblies that must be loaded prior to importing this module
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4d4129f..2ff9b0a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,9 +5,26 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## [1.2] - 2025-09-13
+
+### Added
+
+- Add Diagrammer.Core module requirements
+- Add the required files structure to support the building of diagrams
+
+### Changed
+
+- Bump AsBuiltReport.Core module to v1.4.3
+- Bump actions/checkout to v5 in Codeql.yml and PSScriptAnalyzer.yml
+- Change Release.yml to use windows-latest
+- Enhance Invoke-ASBuiltReport function with version checks for dependencies
+- Update CHANGELOG.md with recent changes
+- This mark the last edition that support VMware Horizon (Next version Omnissa only)
+
## [1.1.5.1] - 2025-03-13
### Fixed
+
- Fix `Get-RequiredModule` script function to properly check for installed VMware PowerCLI versions ([Fix #36](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues/36))
## [1.1.5] - 2025-01-21
diff --git a/Src/Private/Export-AbrDiagram.ps1 b/Src/Private/Export-AbrDiagram.ps1
new file mode 100644
index 0000000..3cc3fe1
--- /dev/null
+++ b/Src/Private/Export-AbrDiagram.ps1
@@ -0,0 +1,133 @@
+function Export-AbrDiagram {
+ <#
+ .SYNOPSIS
+ Function used to build the settings needed to call Export-Diagrammer (Diagrammer.Core)
+
+ .DESCRIPTION
+ The Export-AbrDiagram function build the settings needed to call Export-Diagrammer (Diagrammer.Core)
+ to export a diagram in PDF, PNG, SVG, or base64 formats using PSgraph.
+ .NOTES
+ Version: 0.1.1
+ Author: AsBuiltReport Organization
+ Twitter: @AsBuiltReport
+ Github: AsBuiltReport
+
+ .LINK
+ https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
+ #>
+
+ # Don't remove this line (Don't touch it!)
+ [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingCmdletAliases", "", Scope = "Function")]
+
+ [CmdletBinding()]
+ param (
+ $DiagramObject,
+ [string] $MainDiagramLabel = 'Change Me',
+ [Parameter(Mandatory = $true)]
+ [string] $FileName,
+ [string] $Orientation = 'Portrait'
+ )
+
+ begin {
+ Write-PScriboMessage -Message "EnableDiagrams set to $($Options.EnableDiagrams)."
+ }
+
+ process {
+ if ($Options.EnableDiagrams) {
+ Write-PScriboMessage -Message "Loading export diagram settings"
+
+ $RootPath = Split-Path (Split-Path $PSScriptRoot -Parent) -Parent
+ [System.IO.FileInfo]$IconPath = Join-Path -Path $RootPath -ChildPath 'icons'
+
+ $DiagramParams = @{
+ 'FileName' = $FileName
+ 'OutputFolderPath' = $OutputFolderPath
+ 'MainDiagramLabel' = $MainDiagramLabel
+ 'MainDiagramLabelFontsize' = 28
+ 'MainDiagramLabelFontcolor' = '#565656'
+ 'MainDiagramLabelFontname' = 'Segoe UI Black'
+ 'IconPath' = $IconPath
+ 'ImagesObj' = $Images
+ 'LogoName' = 'AsBuiltReport_LOGO'
+ 'SignatureLogoName' = 'AsBuiltReport_Signature'
+ 'WaterMarkText' = $Options.DiagramWaterMark
+ 'Direction' = 'top-to-bottom'
+ }
+
+ if ($Options.DiagramTheme -eq 'Black') {
+ $DiagramParams.add('MainGraphBGColor', 'Black')
+ $DiagramParams.add('Edgecolor', 'White')
+ $DiagramParams.add('Fontcolor', 'White')
+ $DiagramParams.add('NodeFontcolor', 'White')
+ $DiagramParams.add('WaterMarkColor', 'White')
+ } elseif ($Options.DiagramTheme -eq 'Neon') {
+ $DiagramParams.add('MainGraphBGColor', 'grey14')
+ $DiagramParams.add('Edgecolor', 'gold2')
+ $DiagramParams.add('Fontcolor', 'gold2')
+ $DiagramParams.add('NodeFontcolor', 'gold2')
+ $DiagramParams.add('WaterMarkColor', '#FFD700')
+ } else {
+ $DiagramParams.add('WaterMarkColor', '#333333')
+ }
+
+ if ($Options.ExportDiagrams) {
+ if (-not $Options.ExportDiagramsFormat) {
+ $DiagramFormat = 'png'
+ } else {
+ $DiagramFormat = $Options.ExportDiagramsFormat
+ }
+ $DiagramParams.Add('Format', $DiagramFormat)
+ } else {
+ $DiagramParams.Add('Format', "base64")
+ }
+
+ if ($Options.EnableDiagramDebug) {
+
+ $DiagramParams.Add('DraftMode', $True)
+
+ }
+
+ if ($Options.EnableDiagramSignature) {
+ $DiagramParams.Add('Signature', $True)
+ $DiagramParams.Add('AuthorName', $Options.SignatureAuthorName)
+ $DiagramParams.Add('CompanyName', $Options.SignatureCompanyName)
+ }
+
+ if ($Options.ExportDiagrams) {
+ try {
+ Write-PScriboMessage -Message "Generating $MainDiagramLabel diagram"
+ $Graph = $DiagramObject
+ if ($Graph) {
+ Write-PScriboMessage -Message "Saving $MainDiagramLabel diagram"
+ $Diagram = New-Diagrammer @DiagramParams -InputObject $Graph
+ if ($Diagram) {
+ foreach ($OutputFormat in $DiagramFormat) {
+ Write-Information -MessageData "Saved '$($FileName).$($OutputFormat)' diagram to '$($OutputFolderPath)'." -InformationAction Continue
+ }
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning -Message "Unable to export the $MainDiagramLabel Diagram: $($_.Exception.Message)"
+ }
+ }
+ try {
+ $DiagramParams.Remove('Format')
+ $DiagramParams.Add('Format', "base64")
+
+ $Graph = $DiagramObject
+ $Diagram = New-Diagrammer @DiagramParams -InputObject $Graph
+ if ($Diagram) {
+ if ((Get-DiaImagePercent -GraphObj $Diagram).Width -gt 600) { $ImagePrty = 30 } else { $ImagePrty = 50 }
+ Section -Style Heading2 $MainDiagramLabel -Orientation $Orientation {
+ Image -Base64 $Diagram -Text "$MainDiagramLabel" -Percent $ImagePrty -Align Center
+ Paragraph "Image preview: Opens the image in a new tab to view it at full resolution." -Tabs 2
+ }
+ }
+ } catch {
+ Write-PScriboMessage -IsWarning -Message "Unable to generate the $MainDiagramLabel Diagram: $($_.Exception.Message)"
+ }
+ }
+ }
+
+ end {}
+}
\ No newline at end of file
diff --git a/Src/Private/Get-AbrHRZInfrastructureDiagram.ps1 b/Src/Private/Get-AbrHRZInfrastructureDiagram.ps1
new file mode 100644
index 0000000..70b736b
--- /dev/null
+++ b/Src/Private/Get-AbrHRZInfrastructureDiagram.ps1
@@ -0,0 +1,61 @@
+function Get-AbrVmmInfrastructureDiagram {
+ <#
+ .SYNOPSIS
+ Used by As Built Report to built VMM infrastructure diagram
+ .DESCRIPTION
+
+ .NOTES
+ Version: 0.1.1
+ Author: AsBuiltReport Organization
+ Twitter: @AsBuiltReport
+ Github: AsBuiltReport
+ .EXAMPLE
+
+ .LINK
+
+ #>
+ [CmdletBinding()]
+ param (
+ )
+
+ begin {
+ Write-PScriboMessage "Generating Infrastructure Diagram for Horizon."
+ # Used for DraftMode (Don't touch it!)
+ if ($Options.EnableDiagramDebug) {
+ $EdgeDebug = @{style = 'filled'; color = 'red' }
+ $SubGraphDebug = @{style = 'dashed'; color = 'red' }
+ $NodeDebug = @{color = 'black'; style = 'red'; shape = 'plain' }
+ $NodeDebugEdge = @{color = 'black'; style = 'red'; shape = 'plain' }
+ $IconDebug = $true
+ } else {
+ $EdgeDebug = @{style = 'invis'; color = 'red' }
+ $SubGraphDebug = @{style = 'invis'; color = 'gray' }
+ $NodeDebug = @{color = 'transparent'; style = 'transparent'; shape = 'point' }
+ $NodeDebugEdge = @{color = 'transparent'; style = 'transparent'; shape = 'none' }
+ $IconDebug = $false
+ }
+
+ # Used for setting diagram Theme (Can be change to fits your needs!)
+ if ($Options.DiagramTheme -eq 'Black') {
+ $Edgecolor = 'White'
+ $Fontcolor = 'White'
+ } elseif ($Options.DiagramTheme -eq 'Neon') {
+ $Edgecolor = 'gold2'
+ $Fontcolor = 'gold2'
+ } else {
+ $Edgecolor = '#71797E'
+ $Fontcolor = '#565656'
+ }
+ }
+
+ process {
+ try {
+
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
+ }
+ }
+
+ end {}
+
+}
\ No newline at end of file
diff --git a/Src/Private/Get-RequiredModule.ps1 b/Src/Private/Get-RequiredModule.ps1
index b6ed335..cf5f712 100644
--- a/Src/Private/Get-RequiredModule.ps1
+++ b/Src/Private/Get-RequiredModule.ps1
@@ -15,7 +15,7 @@ function Get-RequiredModule {
The version of the required PowerShell module
#>
[CmdletBinding()]
- Param (
+ param (
[CmdletBinding()]
[Parameter(Mandatory = $true, ValueFromPipeline = $false)]
[ValidateNotNullOrEmpty()]
@@ -45,7 +45,7 @@ function Get-RequiredModule {
# Convert installed version to a [Version] object
$InstalledVersion = [Version]$InstalledModule.Version
- Write-PScriboMessage -Plugin "Module" -IsWarning "$($InstalledModule.Name) $InstalledVersion is currently installed."
+ Write-Host " - $($InstalledModule.Name) $InstalledVersion is currently installed."
if ($InstalledVersion -lt $RequiredVersion) {
throw "VMware PowerCLI $Version or higher is required. Run 'Update-Module -Name $Name -MinimumVersion $Version -Force' to update the required modules."
diff --git a/Src/Public/Invoke-ASBuiltReport.VMware.Horizon.ps1 b/Src/Public/Invoke-ASBuiltReport.VMware.Horizon.ps1
index f1ebdcc..35428ed 100644
--- a/Src/Public/Invoke-ASBuiltReport.VMware.Horizon.ps1
+++ b/Src/Public/Invoke-ASBuiltReport.VMware.Horizon.ps1
@@ -18,6 +18,11 @@
https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
#>
+ [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingConvertToSecureStringWithPlainText", "", Scope = "Function")]
+ [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingUserNameAndPassWordParams", "", Scope = "Function")]
+ [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword", "", Scope = "Function")]
+ [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseShouldProcessForStateChangingFunctions", "", Scope = "Function")]
+
param (
[String[]] $Target,
[PSCredential] $Credential
@@ -28,25 +33,30 @@
break
}
- Write-PScriboMessage -Plugin "Module" -IsWarning "Please refer to the AsBuiltReport.VMware.Horizon github website for more detailed information about this project."
- Write-PScriboMessage -Plugin "Module" -IsWarning "Do not forget to update your report configuration file after each new version release."
- Write-PScriboMessage -Plugin "Module" -IsWarning "Documentation: https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon"
- Write-PScriboMessage -Plugin "Module" -IsWarning "Issues or bug reporting: https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues"
- Write-PScriboMessage -Plugin "Module" -IsWarning "This project is community maintained and has no sponsorship from VMware/Omnissa, its employees or any of its affiliates."
-
- Try {
- $InstalledVersion = Get-Module -ListAvailable -Name AsBuiltReport.VMware.Horizon -ErrorAction SilentlyContinue | Sort-Object -Property Version -Descending | Select-Object -First 1 -ExpandProperty Version
-
- if ($InstalledVersion) {
- Write-PScriboMessage -IsWarning "AsBuiltReport.VMware.Horizon $($InstalledVersion.ToString()) is currently installed."
- $LatestVersion = Find-Module -Name AsBuiltReport.VMware.Horizon -Repository PSGallery -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Version
- if ($LatestVersion -gt $InstalledVersion) {
- Write-PScriboMessage -IsWarning "AsBuiltReport.VMware.Horizon $($LatestVersion.ToString()) is available."
- Write-PScriboMessage -IsWarning "Run 'Update-Module -Name AsBuiltReport.VMware.Horizon -Force' to install the latest version."
+ Write-Host "- Please refer to the AsBuiltReport.VMware.Horizon github website for more detailed information about this project."
+ Write-Host "- Do not forget to update your report configuration file after each new version release."
+ Write-Host "- Documentation: https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon"
+ Write-Host "- Issues or bug reporting: https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues"
+ Write-Host "- This project is community maintained and has no sponsorship from VMware, its employees or any of its affiliates."
+
+ # Check the version of the dependency modules
+ $ModuleArray = @('AsBuiltReport.VMware.Horizon', 'Diagrammer.Core')
+
+ foreach ($Module in $ModuleArray) {
+ try {
+ $InstalledVersion = Get-Module -ListAvailable -Name $Module -ErrorAction SilentlyContinue | Sort-Object -Property Version -Descending | Select-Object -First 1 -ExpandProperty Version
+
+ if ($InstalledVersion) {
+ Write-Host "- $Module module v$($InstalledVersion.ToString()) is currently installed."
+ $LatestVersion = Find-Module -Name $Module -Repository PSGallery -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Version
+ if ($InstalledVersion -lt $LatestVersion) {
+ Write-Host " - $Module module v$($LatestVersion.ToString()) is available." -ForegroundColor Red
+ Write-Host " - Run 'Update-Module -Name $Module -Force' to install the latest version." -ForegroundColor Red
+ }
}
+ } catch {
+ Write-PScriboMessage -IsWarning $_.Exception.Message
}
- } Catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
}
# Check if the required version of VMware PowerCLI is installed
@@ -61,9 +71,24 @@
foreach ($HVEnvironment in $Target) {
- Try {
+ if (Select-String -InputObject $HVEnvironment -Pattern "^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$") {
+ throw "Please use the FQDN instead of an IP address to connect to the Backup Server: $HVEnvironment"
+ }
+
+ # Variable translating Icon to Image Path ($IconPath)
+ $script:Images = @{
+ "AsBuiltReport_LOGO" = "AsBuiltReport_Logo.png"
+ "AsBuiltReport_Signature" = "AsBuiltReport_Signature.png"
+ "Abr_LOGO_Footer" = "AsBuiltReport_Signature.png"
+ "Microsoft_Logo" = "Microsoft_Logo.png"
+ "Server" = "server.png"
+ "DB_Server" = "DB_Server.png"
+ }
+ $script:ColumnSize = $Options.DiagramColumnSize
+
+ try {
$HvServer = Connect-HVServer -Server $HVEnvironment -Credential $Credential -ErrorAction Stop
- } Catch {
+ } catch {
Write-PScriboMessage -IsWarning $_.Exception.Message
}
@@ -101,10 +126,10 @@
$ConnectionServersHealth = try { $hzServices.ConnectionServerHealth.ConnectionServerHealth_List() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
# TrueSSO
- $CertificateSSOconnectorHealthlist = try { $hzServices.CertificateSSOConnectorHealth.CertificateSSOConnectorHealth_list()} catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
+ $CertificateSSOconnectorHealthlist = try { $hzServices.CertificateSSOConnectorHealth.CertificateSSOConnectorHealth_list() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
# SAML SSO
- $SAMLAuthenticatorhealthlist=$hzServices.SAMLAuthenticatorHealth.SAMLAuthenticatorHealth_list()
+ $SAMLAuthenticatorhealthlist = $hzServices.SAMLAuthenticatorHealth.SAMLAuthenticatorHealth_list()
# Pod Health
@@ -136,7 +161,7 @@
# Sites
$CloudPodSites = try { $hzServices.Site.Site_List() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
$CloudPodLists = try { $hzServices.Pod.Pod_List() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
- $CloudPodListsLocal = try { $hzServices.Pod.Pod_List() | Where-Object {$_.localpod -eq $false} } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
+ $CloudPodListsLocal = try { $hzServices.Pod.Pod_List() | Where-Object { $_.localpod -eq $false } } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
# Event Database Info
$EventDataBases = try { $hzServices.EventDatabase.EventDatabase_Get() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
@@ -340,7 +365,7 @@
}
# Registerd Physical Machines
- Try {
+ try {
$RegisteredPhysicalMachineInfoQueryDefn = New-Object VMware.Hv.QueryDefinition
$RegisteredPhysicalMachineInfoQueryDefn.queryentitytype = 'RegisteredPhysicalMachineInfo'
$RegisteredPhysicalMachineResults = $Queryservice.QueryService_Create($hzServices, $RegisteredPhysicalMachineInfoQueryDefn)
@@ -381,6 +406,15 @@
Write-PScriboMessage -IsWarning $_.Exception.Message
}
Section -Style Heading1 "$($HVEnvironment.toUpper())" {
+ if ($Options.EnableDiagrams) {
+ $HRZDiagram = Get-AbrHRZInfrastructureDiagram
+ if ($HRZDiagram) {
+ Export-AbrDiagram -DiagramObject $HRZDiagram -MainDiagramLabel "Horizon Infrastructure Diagram" -FileName "AsBuiltReport.VMware.Horizon.Infrastructure"
+ } else {
+ Write-PScriboMessage -IsWarning "Unable to generate the Infrastructure Diagram."
+ }
+ }
+
Get-AbrHRZInfrastructure
}
@@ -471,7 +505,7 @@
Get-AbrHRZHCLicenseService
}
}
- if ($healthcheck.RemotePod.RemotePod -and $CloudPodListsLocal){
+ if ($healthcheck.RemotePod.RemotePod -and $CloudPodListsLocal) {
Section -Style Heading2 'Remote Pod' {
Get-AbrHRZHCRemotePod
}
diff --git a/icons/AsBuiltReport_Logo.png b/icons/AsBuiltReport_Logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..ff8a542f746566838cd4d05a958711baf99690e8
GIT binary patch
literal 5154
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
Q;{X5v07*qoM6N<$g2mI!4gdfE
literal 0
HcmV?d00001
diff --git a/icons/AsBuiltReport_Signature.png b/icons/AsBuiltReport_Signature.png
new file mode 100644
index 0000000000000000000000000000000000000000..000cde6004bdcc3974a853ec31a95436e795ff9b
GIT binary patch
literal 12338
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
A&Hw-a
literal 0
HcmV?d00001
diff --git a/icons/no_icon.png b/icons/no_icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..c5b056371d2cae6790a0555f04fef766a7327012
GIT binary patch
literal 8183
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
literal 0
HcmV?d00001
From e62a73dee1c38e0d43aa2e3c34f7739d2dc70fc8 Mon Sep 17 00:00:00 2001
From: Jonathan Colon
Date: Sat, 13 Sep 2025 12:12:44 -0400
Subject: [PATCH 4/6] Delete files
---
1.1.5/.github/ISSUE_TEMPLATE/bug_report.yml | 98 --
.../.github/ISSUE_TEMPLATE/change_request.yml | 34 -
1.1.5/.github/ISSUE_TEMPLATE/config.yml | 1 -
1.1.5/.github/PULL_REQUEST_TEMPLATE.md | 34 -
1.1.5/.github/workflows/Codeql.yml | 47 -
1.1.5/.github/workflows/PSScriptAnalyzer.yml | 17 -
.../workflows/PSScriptAnalyzerSettings.psd1 | 8 -
1.1.5/.github/workflows/Release.yml | 53 -
1.1.5/.vscode/settings.json | 33 -
1.1.5/AsBuiltReport.VMware.Horizon.Style.ps1 | 109 --
1.1.5/AsBuiltReport.VMware.Horizon.json | 104 --
1.1.5/AsBuiltReport.VMware.Horizon.psd1 | 135 --
1.1.5/AsBuiltReport.VMware.Horizon.psm1 | 14 -
1.1.5/CHANGELOG.md | 89 --
1.1.5/LICENSE | 21 -
1.1.5/PSGetModuleInfo.xml | 163 ---
1.1.5/README.md | 208 ---
...Sample VMware Horizon As Built Report.html | 1212 -----------------
1.1.5/Src/Private/Get-AbrHRZADDomain.ps1 | 70 -
1.1.5/Src/Private/Get-AbrHRZAccessGroup.ps1 | 131 --
1.1.5/Src/Private/Get-AbrHRZAdminGroup.ps1 | 160 ---
.../Src/Private/Get-AbrHRZApplicationPool.ps1 | 171 ---
1.1.5/Src/Private/Get-AbrHRZCertMgmt.ps1 | 77 --
1.1.5/Src/Private/Get-AbrHRZCloudPod.ps1 | 103 --
.../Private/Get-AbrHRZConnectionServer.ps1 | 351 -----
1.1.5/Src/Private/Get-AbrHRZDatastore.ps1 | 119 --
1.1.5/Src/Private/Get-AbrHRZDesktopPool.ps1 | 710 ----------
1.1.5/Src/Private/Get-AbrHRZDomain.ps1 | 113 --
1.1.5/Src/Private/Get-AbrHRZESXi.ps1 | 117 --
1.1.5/Src/Private/Get-AbrHRZEventConf.ps1 | 147 --
1.1.5/Src/Private/Get-AbrHRZFarm.ps1 | 315 -----
.../Get-AbrHRZFederationAccessGroup.ps1 | 135 --
1.1.5/Src/Private/Get-AbrHRZGatewayCert.ps1 | 66 -
.../Private/Get-AbrHRZGlobalEntitlement.ps1 | 283 ----
1.1.5/Src/Private/Get-AbrHRZGlobalPolicy.ps1 | 68 -
1.1.5/Src/Private/Get-AbrHRZGlobalSetting.ps1 | 161 ---
1.1.5/Src/Private/Get-AbrHRZHCConnection.ps1 | 81 --
1.1.5/Src/Private/Get-AbrHRZHCDataStore.ps1 | 72 -
1.1.5/Src/Private/Get-AbrHRZHCDomain.ps1 | 95 --
1.1.5/Src/Private/Get-AbrHRZHCESXiHost.ps1 | 78 --
.../Src/Private/Get-AbrHRZHCEventDataBase.ps1 | 75 -
.../Src/Private/Get-AbrHRZHCGatewayServer.ps1 | 119 --
.../Private/Get-AbrHRZHCLicenseService.ps1 | 79 --
1.1.5/Src/Private/Get-AbrHRZHCRDSFarm.ps1 | 78 --
1.1.5/Src/Private/Get-AbrHRZHCRemotePod.ps1 | 80 --
1.1.5/Src/Private/Get-AbrHRZHCSAML2.ps1 | 72 -
1.1.5/Src/Private/Get-AbrHRZHCTrueSSO.ps1 | 75 -
1.1.5/Src/Private/Get-AbrHRZHCvCenter.ps1 | 86 --
1.1.5/Src/Private/Get-AbrHRZHomeSite.ps1 | 108 --
.../Src/Private/Get-AbrHRZInfrastructure.ps1 | 69 -
1.1.5/Src/Private/Get-AbrHRZInstantClone.ps1 | 70 -
1.1.5/Src/Private/Get-AbrHRZLicense.ps1 | 167 ---
.../Private/Get-AbrHRZLocalEntitlement.ps1 | 201 ---
1.1.5/Src/Private/Get-AbrHRZMachine.ps1 | 69 -
.../Private/Get-AbrHRZRegisteredMachine.ps1 | 151 --
.../Src/Private/Get-AbrHRZRolePermission.ps1 | 132 --
1.1.5/Src/Private/Get-AbrHRZRolePrivilege.ps1 | 95 --
1.1.5/Src/Private/Get-AbrHRZSite.ps1 | 79 --
1.1.5/Src/Private/Get-AbrHRZTSSO.ps1 | 91 --
1.1.5/Src/Private/Get-AbrHRZUAG.ps1 | 76 --
.../Private/Get-AbrHRZUnauthenticatedACL.ps1 | 92 --
1.1.5/Src/Private/Get-AbrHRZVcenter.ps1 | 161 ---
1.1.5/Src/Private/Get-RequiredModule.ps1 | 36 -
1.1.5/Src/Private/SharedUtilsFunctions.ps1 | 153 ---
.../Invoke-ASBuiltReport.VMware.Horizon.ps1 | 483 -------
65 files changed, 8900 deletions(-)
delete mode 100644 1.1.5/.github/ISSUE_TEMPLATE/bug_report.yml
delete mode 100644 1.1.5/.github/ISSUE_TEMPLATE/change_request.yml
delete mode 100644 1.1.5/.github/ISSUE_TEMPLATE/config.yml
delete mode 100644 1.1.5/.github/PULL_REQUEST_TEMPLATE.md
delete mode 100644 1.1.5/.github/workflows/Codeql.yml
delete mode 100644 1.1.5/.github/workflows/PSScriptAnalyzer.yml
delete mode 100644 1.1.5/.github/workflows/PSScriptAnalyzerSettings.psd1
delete mode 100644 1.1.5/.github/workflows/Release.yml
delete mode 100644 1.1.5/.vscode/settings.json
delete mode 100644 1.1.5/AsBuiltReport.VMware.Horizon.Style.ps1
delete mode 100644 1.1.5/AsBuiltReport.VMware.Horizon.json
delete mode 100644 1.1.5/AsBuiltReport.VMware.Horizon.psd1
delete mode 100644 1.1.5/AsBuiltReport.VMware.Horizon.psm1
delete mode 100644 1.1.5/CHANGELOG.md
delete mode 100644 1.1.5/LICENSE
delete mode 100644 1.1.5/PSGetModuleInfo.xml
delete mode 100644 1.1.5/README.md
delete mode 100644 1.1.5/Samples/Sample VMware Horizon As Built Report.html
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZADDomain.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZAccessGroup.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZAdminGroup.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZApplicationPool.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZCertMgmt.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZCloudPod.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZConnectionServer.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZDatastore.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZDesktopPool.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZDomain.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZESXi.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZEventConf.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZFarm.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZFederationAccessGroup.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZGatewayCert.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZGlobalEntitlement.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZGlobalPolicy.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZGlobalSetting.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZHCConnection.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZHCDataStore.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZHCDomain.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZHCESXiHost.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZHCEventDataBase.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZHCGatewayServer.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZHCLicenseService.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZHCRDSFarm.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZHCRemotePod.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZHCSAML2.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZHCTrueSSO.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZHCvCenter.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZHomeSite.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZInfrastructure.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZInstantClone.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZLicense.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZLocalEntitlement.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZMachine.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZRegisteredMachine.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZRolePermission.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZRolePrivilege.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZSite.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZTSSO.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZUAG.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZUnauthenticatedACL.ps1
delete mode 100644 1.1.5/Src/Private/Get-AbrHRZVcenter.ps1
delete mode 100644 1.1.5/Src/Private/Get-RequiredModule.ps1
delete mode 100644 1.1.5/Src/Private/SharedUtilsFunctions.ps1
delete mode 100644 1.1.5/Src/Public/Invoke-ASBuiltReport.VMware.Horizon.ps1
diff --git a/1.1.5/.github/ISSUE_TEMPLATE/bug_report.yml b/1.1.5/.github/ISSUE_TEMPLATE/bug_report.yml
deleted file mode 100644
index f312290..0000000
--- a/1.1.5/.github/ISSUE_TEMPLATE/bug_report.yml
+++ /dev/null
@@ -1,98 +0,0 @@
-name: Bug Report
-description: File a bug report
-labels: ["bug"]
-assignees:
- - childebrandt42
-body:
- - type: textarea
- id: bug-description
- attributes:
- label: Bug description
- description: >-
- Please provide a clear and concise description of the bug.
- validations:
- required: true
- - type: input
- id: command-line-input
- attributes:
- label: Command-line input
- description: >-
- Please provide the command line input you are using to run AsBuiltReport. Please ensure that you obscure any sensitive information.
- placeholder: New-AsBuiltReport -Report VMware.Horizon -Target xxxxxxx -Format Word,HTML -OutputFolderPath .\Documents\ -AsBuiltConfigFilePath .\AsBuiltReport\AsBuiltReport.json -ReportConfigFilePath .\AsBuiltReport\AsBuiltReport.VMware.Horizon.json -EnableHealthCheck -Verbose
- validations:
- required: true
- - type: textarea
- id: steps-to-reproduce
- attributes:
- label: Steps to reproduce
- description: >-
- Please provide a detailed list of steps to reproduce the bug.
- placeholder: |-
- 1. ....
- 2. ....
- 3. ....
- validations:
- required: true
- - type: textarea
- id: expected-behaviour
- attributes:
- label: Expected behaviour
- description: >-
- Please provide a clear and concise description of what you expected to happen.
- validations:
- required: true
- - type: textarea
- id: screenshots
- attributes:
- label: Screenshots
- description: >-
- Please attach any screenshots to help explain the problem. Please ensure that you obscure any sensitive information.
- placeholder: |-
- Drag and drop screenshots here.
- - type: textarea
- id: operating-system
- attributes:
- label: Operating System
- description: Please provide information about the operating system are you using.
- placeholder: macOS Big Sur, Windows 10, Ubuntu 20.04 LTS
- validations:
- required: true
- - type: textarea
- id: powershell-version
- attributes:
- label: PowerShell Version
- description: Please provide information about the PowerShell version you are using. Please provide the output from the following PowerShell command `$PSVersionTable`.
- placeholder: $PSVersionTable
- validations:
- required: true
- - type: textarea
- id: powershell-modules
- attributes:
- label: PowerShell Modules
- description: Please provide information about the PowerShell modules are you using. Please provide the output from the following PowerShell command `Get-Module -ListAvailable @("AsBuiltReport.Core";"AsBuiltReport.VMware.Horizon";"PScribo") | Select Name, Version`
- placeholder: Get-Module -ListAvailable @("AsBuiltReport.Core";"AsBuiltReport.VMware.Horizon";"PScribo") | Select Name, Version
- validations:
- required: true
- - type: textarea
- id: additional-context
- attributes:
- label: Additional Context
- description: This field is optional. You may provide additional context for the bug you wish to report. You may wish to include links to any related [issues](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues) or other relevant information.
- - type: checkboxes
- id: checklist
- attributes:
- label: Before submitting
- description: >-
- Please ensure your bug report fulfills all of the following requirements.
- If you are unsure of what a specific requirement means, please follow the links to learn about it and understand why it is necessary before submitting.
- options:
- - label: >-
- I have read and followed the [bug reporting guidelines](https://www.asbuiltreport.com/about/contributing/#reporting-issues-and-bugs).
- required: true
- - label: >-
- I have read [the documentation](https://www.asbuiltreport.com/user-guide/new-asbuiltconfig),
- and referred to the [known issues](https://www.asbuiltreport.com/user-guide/known-issues/) before submitting this bug report.
- required: true
- - label: >-
- I have checked for previously opened & closed [issues](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues) before submitting this bug report.
- required: true
diff --git a/1.1.5/.github/ISSUE_TEMPLATE/change_request.yml b/1.1.5/.github/ISSUE_TEMPLATE/change_request.yml
deleted file mode 100644
index bf8e2f9..0000000
--- a/1.1.5/.github/ISSUE_TEMPLATE/change_request.yml
+++ /dev/null
@@ -1,34 +0,0 @@
-name: Change Request
-description: Request a new change or an improvement
-labels: ["change request"]
-assignees:
- - childebrandt42
-body:
- - type: textarea
- id: description
- attributes:
- label: Description
- description: >-
- Please provide a detailed description of your idea so that the project maintainers and contributors can fully understand what change, feature, or improvement you are proposing.
- validations:
- required: true
- - type: textarea
- id: additional-context
- attributes:
- label: Additional Context
- description: This field is optional. You may provide additional context for the idea you wish to propose. You may wish to include links to any related [issues](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues) or other relevant information.
- - type: checkboxes
- id: checklist
- attributes:
- label: Before submitting
- description: >-
- Please ensure your change request fulfills all of the following requirements.
- If you are unsure of what a specific requirement means, please follow the links to learn about it and understand why it is necessary before submitting.
- options:
- - label: >-
- I have read [the documentation](https://www.asbuiltreport.com/user-guide/new-asbuiltconfig),
- and referred to the [known issues](https://www.asbuiltreport.com/user-guide/known-issues/) before submitting this change request.
- required: true
- - label: >-
- I have checked for previously opened & closed [issues](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues) before submitting this change request.
- required: true
diff --git a/1.1.5/.github/ISSUE_TEMPLATE/config.yml b/1.1.5/.github/ISSUE_TEMPLATE/config.yml
deleted file mode 100644
index ec4bb38..0000000
--- a/1.1.5/.github/ISSUE_TEMPLATE/config.yml
+++ /dev/null
@@ -1 +0,0 @@
-blank_issues_enabled: false
\ No newline at end of file
diff --git a/1.1.5/.github/PULL_REQUEST_TEMPLATE.md b/1.1.5/.github/PULL_REQUEST_TEMPLATE.md
deleted file mode 100644
index 96f7bdf..0000000
--- a/1.1.5/.github/PULL_REQUEST_TEMPLATE.md
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-## Description
-
-
-## Related Issue
-
-
-
-
-
-## Motivation and Context
-
-
-## How Has This Been Tested?
-
-
-
-
-## Screenshots (if appropriate):
-
-## Types of changes
-
-- [ ] Bug fix (non-breaking change which fixes an issue)
-- [ ] New feature (non-breaking change which adds functionality)
-- [ ] Breaking change (fix or feature that would cause existing functionality to change)
-
-## Checklist:
-
-
-- [ ] My code follows the code style of this project.
-- [ ] My change requires a change to the documentation.
-- [ ] I have updated the documentation accordingly.
-- [ ] I have read the [**CONTRIBUTING**](/CONTRIBUTING.md) document.
diff --git a/1.1.5/.github/workflows/Codeql.yml b/1.1.5/.github/workflows/Codeql.yml
deleted file mode 100644
index e4c6e1c..0000000
--- a/1.1.5/.github/workflows/Codeql.yml
+++ /dev/null
@@ -1,47 +0,0 @@
-# This workflow uses actions that are not certified by GitHub.
-# They are provided by a third-party and are governed by
-# separate terms of service, privacy policy, and support
-# documentation.
-#
-# https://github.com/microsoft/action-psscriptanalyzer
-# For more information on PSScriptAnalyzer in general, see
-# https://github.com/PowerShell/PSScriptAnalyzer
-
-name: CodeQL
-
-on:
- push:
- branches: [ "dev" ]
- pull_request:
- branches: [ "dev" ]
-
-permissions:
- contents: read
-
-jobs:
- build:
- permissions:
- contents: read # for actions/checkout to fetch code
- security-events: write # for github/codeql-action/upload-sarif to upload SARIF results
- actions: read # only required for a private repository by github/codeql-action/upload-sarif to get the Action run status
- name: PSScriptAnalyzer
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v4
-
- - name: Run PSScriptAnalyzer
- uses: microsoft/psscriptanalyzer-action@v1.1
- with:
- # Check https://github.com/microsoft/action-psscriptanalyzer for more info about the options.
- # The below set up runs PSScriptAnalyzer to your entire repository and runs some basic security rules.
- path: .\
- recurse: true
- # Include your own basic security rules. Removing this option will run all the rules
- excludeRule: '"PSAvoidUsingPlainTextForPassword", "PSAvoidUsingUsernameAndPasswordParams", "PSAvoidUsingConvertToSecureStringWithPlainText"'
- output: results.sarif
-
- # Upload the SARIF file generated in the previous step
- - name: Upload SARIF results file
- uses: github/codeql-action/upload-sarif@v3
- with:
- sarif_file: results.sarif
diff --git a/1.1.5/.github/workflows/PSScriptAnalyzer.yml b/1.1.5/.github/workflows/PSScriptAnalyzer.yml
deleted file mode 100644
index 528cc2a..0000000
--- a/1.1.5/.github/workflows/PSScriptAnalyzer.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-name: PSScriptAnalyzer
-on: [push, pull_request]
-jobs:
- lint:
- name: Run PSScriptAnalyzer
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v4
- - name: lint
- uses: devblackops/github-action-psscriptanalyzer@master
- with:
- sendComment: true
- failOnErrors: true
- failOnWarnings: false
- failOnInfos: false
- repoToken: ${{ secrets.GITHUB_TOKEN }}
- settingsPath: .github/workflows/PSScriptAnalyzerSettings.psd1
\ No newline at end of file
diff --git a/1.1.5/.github/workflows/PSScriptAnalyzerSettings.psd1 b/1.1.5/.github/workflows/PSScriptAnalyzerSettings.psd1
deleted file mode 100644
index 24835e7..0000000
--- a/1.1.5/.github/workflows/PSScriptAnalyzerSettings.psd1
+++ /dev/null
@@ -1,8 +0,0 @@
-@{
- ExcludeRules = @(
- 'PSUseToExportFieldsInManifest',
- 'PSReviewUnusedParameter',
- 'PSUseDeclaredVarsMoreThanAssignments',
- 'PSAvoidGlobalVars'
- )
-}
\ No newline at end of file
diff --git a/1.1.5/.github/workflows/Release.yml b/1.1.5/.github/workflows/Release.yml
deleted file mode 100644
index ccddc65..0000000
--- a/1.1.5/.github/workflows/Release.yml
+++ /dev/null
@@ -1,53 +0,0 @@
-name: Publish PowerShell Module
-
-on:
- release:
- types: [published]
-
-jobs:
- publish-to-gallery:
- runs-on: windows-2019
- steps:
- - uses: actions/checkout@v4
- - name: Set PSRepository to Trusted for PowerShell Gallery
- shell: pwsh
- run: |
- Set-PSRepository -Name PSGallery -InstallationPolicy Trusted
- - name: Install AsBuiltReport.Core module
- shell: pwsh
- run: |
- Install-Module -Name AsBuiltReport.Core -Repository PSGallery -Force
- - name: Test Module Manifest
- shell: pwsh
- run: |
- Test-ModuleManifest .\AsBuiltReport.VMware.Horizon.psd1
- - name: Publish module to PowerShell Gallery
- shell: pwsh
- run: |
- Publish-Module -Path ./ -NuGetApiKey ${{ secrets.PSGALLERY_API_KEY }} -Verbose
- tweet:
- needs: publish-to-gallery
- runs-on: ubuntu-latest
- steps:
- - uses: Eomm/why-don-t-you-tweet@v2
- # We don't want to tweet if the repository is not a public one
- if: ${{ !github.event.repository.private }}
- with:
- # GitHub event payload
- # https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#release
- tweet-message: "[New Release] ${{ github.event.repository.name }} ${{ github.event.release.tag_name }}! Check out what's new! ${{ github.event.release.html_url }} #VMware #Horizon #AsBuiltReport #PowerShell #vExpert"
- env:
- TWITTER_CONSUMER_API_KEY: ${{ secrets.TWITTER_CONSUMER_API_KEY }}
- TWITTER_CONSUMER_API_SECRET: ${{ secrets.TWITTER_CONSUMER_API_SECRET }}
- TWITTER_ACCESS_TOKEN: ${{ secrets.TWITTER_ACCESS_TOKEN }}
- TWITTER_ACCESS_TOKEN_SECRET: ${{ secrets.TWITTER_ACCESS_TOKEN_SECRET }}
- bsky-post:
- needs: publish-to-gallery
- runs-on: ubuntu-latest
- steps:
- - uses: zentered/bluesky-post-action@v0.1.0
- with:
- post: "[New Release] ${{ github.event.repository.name }} ${{ github.event.release.tag_name }}! Check out what's new! ${{ github.event.release.html_url }} #Omnissa #VMware #Horizon #vExpert #AsBuiltReport #PowerShell"
- env:
- BSKY_IDENTIFIER: ${{ secrets.BSKY_IDENTIFIER }}
- BSKY_PASSWORD: ${{ secrets.BSKY_PASSWORD }}
\ No newline at end of file
diff --git a/1.1.5/.vscode/settings.json b/1.1.5/.vscode/settings.json
deleted file mode 100644
index 6f3e883..0000000
--- a/1.1.5/.vscode/settings.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- "powershell.codeFormatting.preset": "Custom",
- "powershell.codeFormatting.useCorrectCasing": true,
- "powershell.codeFormatting.autoCorrectAliases": true,
- "powershell.codeFormatting.whitespaceBeforeOpenBrace": true,
- "powershell.codeFormatting.whitespaceBeforeOpenParen": true,
- "powershell.codeFormatting.whitespaceAroundOperator": true,
- "powershell.codeFormatting.whitespaceAfterSeparator": true,
- "powershell.codeFormatting.addWhitespaceAroundPipe": true,
- "powershell.codeFormatting.ignoreOneLineBlock": true,
- "powershell.codeFormatting.newLineAfterCloseBrace": false,
- "powershell.codeFormatting.newLineAfterOpenBrace": true,
- "powershell.codeFormatting.openBraceOnSameLine": true,
- "powershell.codeFormatting.alignPropertyValuePairs": false,
- "powershell.codeFolding.enable": true,
- "powershell.scriptAnalysis.enable": true,
- "powershell.scriptAnalysis.settingsPath": ".github/workflows/PSScriptAnalyzerSettings.psd1",
- "editor.tabSize": 4,
- "editor.insertSpaces": true,
- "editor.detectIndentation": false,
- "editor.rulers": [
- 115
- ],
- "files.trimTrailingWhitespace": true,
- "cSpell.words": [
- "Hildebrandt",
- "Iain",
- "jcolonfzenpr",
- "karlnewick",
- "Newick",
- "Scribo"
- ]
-}
\ No newline at end of file
diff --git a/1.1.5/AsBuiltReport.VMware.Horizon.Style.ps1 b/1.1.5/AsBuiltReport.VMware.Horizon.Style.ps1
deleted file mode 100644
index a8615c8..0000000
--- a/1.1.5/AsBuiltReport.VMware.Horizon.Style.ps1
+++ /dev/null
@@ -1,109 +0,0 @@
-# VMware Horizon Default Document Style
-
-# Configure document options
-DocumentOption -EnableSectionNumbering -PageSize A4 -DefaultFont 'Arial' -MarginLeftAndRight 71 -MarginTopAndBottom 71 -Orientation $Orientation
-
-# Configure Heading and Font Styles
-Style -Name 'Title' -Size 24 -Color '717074' -Align Center
-Style -Name 'Title 2' -Size 18 -Color 'A1A0A4' -Align Center
-Style -Name 'Title 3' -Size 12 -Color '006A91' -Align Center
-Style -Name 'Heading 1' -Size 16 -Color '00364D'
-Style -Name 'Heading 2' -Size 14 -Color '004B6B'
-Style -Name 'NO TOC Heading 2' -Size 14 -Color '004B6B'
-Style -Name 'Heading 3' -Size 12 -Color '00567A'
-Style -Name 'Heading 4' -Size 11 -Color '00648F'
-Style -Name 'Heading 5' -Size 10 -Color '0072A3'
-Style -Name 'NO TOC Heading 5' -Size 10 -Color '0072A3'
-Style -Name 'Heading 6' -Size 10 -Color '0072A3'
-Style -Name 'NO TOC Heading 6' -Size 10 -Color '0072A3'
-Style -Name 'Heading 7' -Size 10 -Color '0072A3'
-Style -Name 'Normal' -Size 10 -Color '565656' -Default
-Style -Name 'Caption' -Size 10 -Color '565656' -Italic -Align Center
-Style -Name 'Header' -Size 10 -Color '565656' -Align Center
-Style -Name 'Footer' -Size 10 -Color '565656' -Align Center
-Style -Name 'TOC' -Size 16 -Color '00364D'
-#Style -Name 'TableDefaultHeading' -Size 10 -Color '565656' -BackgroundColor 'FAFAFA' # Light Theme
-Style -Name 'TableDefaultHeading' -Size 10 -Color 'FAFAFA' -BackgroundColor '00364D' # Dark Theme
-Style -Name 'TableDefaultRow' -Size 10 -Color '565656'
-Style -Name 'Critical' -Size 10 -Color '565656' -BackgroundColor 'FEDDD7'
-Style -Name 'Warning' -Size 10 -Color '565656' -BackgroundColor 'FFF4C7'
-Style -Name 'Info' -Size 10 -Color '565656' -BackgroundColor 'E3F5FC'
-Style -Name 'OK' -Size 10 -Color '565656' -BackgroundColor 'DFF0D0'
-
-# Configure Table Styles
-$TableDefaultProperties = @{
- Id = 'TableDefault'
- HeaderStyle = 'TableDefaultHeading'
- RowStyle = 'TableDefaultRow'
- #BorderColor = 'A6A6A6' # Light Theme
- BorderColor = '00364D' # Dark Theme
- Align = 'Left'
- CaptionStyle = 'Caption'
- CaptionLocation = 'Below'
- BorderWidth = 0.25
- PaddingTop = 1
- PaddingBottom = 1.5
- PaddingLeft = 2
- PaddingRight = 2
-}
-
-TableStyle @TableDefaultProperties -Default
-TableStyle -Id 'Borderless' -HeaderStyle Normal -RowStyle Normal -BorderWidth 0
-
-# VMware Cover Page Layout
-# Header & Footer
-if ($ReportConfig.Report.ShowHeaderFooter) {
- Header -Default {
- Paragraph -Style Header "$($ReportConfig.Report.Name) - v$($ReportConfig.Report.Version)"
- }
-
- Footer -Default {
- Paragraph -Style Footer 'Page '
- }
-}
-
-# Set position of report titles and information based on page orientation
-if (!($ReportConfig.Report.ShowCoverPageImage)) {
- $LineCount = 5
-}
-if ($Orientation -eq 'Portrait') {
- BlankLine -Count 11
- $LineCount = 32 + $LineCount
-} else {
- BlankLine -Count 7
- $LineCount = 15 + $LineCount
-}
-
-# VMware Logo Image
-if ($ReportConfig.Report.ShowCoverPageImage) {
- Try {
- Image -Text 'VMware Logo' -Align 'Center' -Percent 5 -Base64 "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"
- BlankLine -Count 2
- } Catch {
- Write-PScriboMessage -Message ".NET Core is required for cover page image support. Please install .NET Core or disable 'ShowCoverPageImage' in the report JSON configuration file."
- }
-}
-
-# Add Report Name
-Paragraph -Style Title $ReportConfig.Report.Name
-
-if ($AsBuiltConfig.Company.FullName) {
- # Add Company Name if specified
- BlankLine -Count 2
- Paragraph -Style Title2 $AsBuiltConfig.Company.FullName
- BlankLine -Count $LineCount
-} else {
- BlankLine -Count ($LineCount + 1)
-}
-Table -Name 'Cover Page' -List -Style Borderless -Width 0 -Hashtable ([Ordered] @{
- 'Author:' = $AsBuiltConfig.Report.Author
- 'Date:' = (Get-Date).ToLongDateString()
- 'Version:' = $ReportConfig.Report.Version
- })
-PageBreak
-
-if ($ReportConfig.Report.ShowTableOfContents) {
- # Add Table of Contents
- TOC -Name 'Table of Contents'
- PageBreak
-}
\ No newline at end of file
diff --git a/1.1.5/AsBuiltReport.VMware.Horizon.json b/1.1.5/AsBuiltReport.VMware.Horizon.json
deleted file mode 100644
index e084a0b..0000000
--- a/1.1.5/AsBuiltReport.VMware.Horizon.json
+++ /dev/null
@@ -1,104 +0,0 @@
-{
- "Report": {
- "Name": "Omnissa Horizon As Built Report",
- "Version": "1.0",
- "Status": "Released",
- "ShowCoverPageImage": true,
- "ShowTableOfContents": true,
- "ShowHeaderFooter": true,
- "ShowTableCaptions": true
- },
- "Options": {},
- "InfoLevel": {
- "_comment_": "0 = Disabled, 1 = Summary, 2 = Informative, 3 = Detailed",
- "UsersAndGroups": {
- "Entitlements": 1,
- "HomeSiteAssignments": 1,
- "UnauthenticatedAccess": 1
- },
- "Inventory": {
- "Desktop": 1,
- "Applications": 1,
- "Farms": 1,
- "Machines": 1,
- "GlobalEntitlements": 1
- },
- "Settings": {
- "Servers": {
- "vCenterServers": {
- "vCenter": 1,
- "ESXiHosts": 1,
- "DataStores": 1,
- "ADDomains": 1
- },
- "UAG": {
- "UAGServers": 1
- },
- "ConnectionServers": {
- "ConnectionServers": 1,
- "TrueSSO": 1
- }
- },
- "InstantClone": {
- "InstantCloneDomainAccounts": 1
- },
- "ProductLicensing": {
- "ProductLicensingandUsage": 1
- },
- "GlobalSettings": {
- "GlobalSettings": 1
- },
- "RegisteredMachines": {
- "RDSHosts": 1
- },
- "Administrators": {
- "AdministratorsandGroups": 1,
- "RolePrivileges": 1,
- "RolePermissions": 1,
- "AccessGroup": 1,
- "FederationAccessGroup": 1
- },
- "CloudPodArch": {
- "CloudPodArch": 1
- },
- "Sites": {
- "Sites": 1
- },
- "EventConfiguration": {
- "EventDatabase": 1,
- "Syslog": 1,
- "EventstoFileSystem": 1
- },
- "GlobalPolicies": {
- "GlobalPolicies": 1
- }
- }
- },
- "HealthCheck": {
- "HealthCheck": {
- "Overview": true
- },
- "Components": {
- "ConnectionServers": true,
- "GatewayServer": true,
- "EventDataBase": true,
- "TrueSSO": true
- },
- "RDSFarms": {
- "RDSFarms": true
- },
- "vSphere": {
- "DataStores": true,
- "vCenter": true,
- "ESXiHosts": true
- },
- "OtherComponents": {
- "Domains": true,
- "SAML2": true,
- "LicenseService": true
- },
- "RemotePod": {
- "RemotePod": true
- }
- }
-}
\ No newline at end of file
diff --git a/1.1.5/AsBuiltReport.VMware.Horizon.psd1 b/1.1.5/AsBuiltReport.VMware.Horizon.psd1
deleted file mode 100644
index 8265423..0000000
--- a/1.1.5/AsBuiltReport.VMware.Horizon.psd1
+++ /dev/null
@@ -1,135 +0,0 @@
-#
-# Module manifest for module 'AsBuiltReport.VMware.Horizon'
-#
-# Generated by: Chris.Hildebrandt
-#
-# Generated on: 7/6/2019
-#
-
-@{
-
- # Script module or binary module file associated with this manifest.
- RootModule = 'AsBuiltReport.VMware.Horizon.psm1'
-
- # Version number of this module.
- ModuleVersion = '1.1.5'
-
- # Supported PSEditions
- # CompatiblePSEditions = @()
-
- # ID used to uniquely identify this module
- GUID = '2d7d49b3-b010-453c-8a35-22b19f9b7a17'
-
- # Author of this module
- Author = 'Chris Hildebrandt'
-
- # Company or vendor of this module
- #CompanyName = 'Unknown'
-
- # Copyright statement for this module
- Copyright = '(c) 2025 Chris Hildebrandt. All rights reserved.'
-
- # Description of the functionality provided by this module
- Description = 'A PowerShell module to generate as built reports on the configuration of VMware Horizon'
-
- # Minimum version of the Windows PowerShell engine required by this module
- PowerShellVersion = '5.1'
-
- # Name of the Windows PowerShell host required by this module
- # PowerShellHostName = ''
-
- # Minimum version of the Windows PowerShell host required by this module
- # PowerShellHostVersion = ''
-
- # Minimum version of Microsoft .NET Framework required by this module. This prerequisite is valid for the PowerShell Desktop edition only.
- # DotNetFrameworkVersion = ''
-
- # Minimum version of the common language runtime (CLR) required by this module. This prerequisite is valid for the PowerShell Desktop edition only.
- # CLRVersion = ''
-
- # Processor architecture (None, X86, Amd64) required by this module
- # ProcessorArchitecture = ''
-
- # Modules that must be imported into the global environment prior to importing this module
- RequiredModules = @(
- @{
- ModuleName = 'AsBuiltReport.Core';
- ModuleVersion = '1.4.2'
- }
- )
- # Assemblies that must be loaded prior to importing this module
- # RequiredAssemblies = @()
-
- # Script files (.ps1) that are run in the caller's environment prior to importing this module.
- # ScriptsToProcess = @()
-
- # Type files (.ps1xml) to be loaded when importing this module
- # TypesToProcess = @()
-
- # Format files (.ps1xml) to be loaded when importing this module
- # FormatsToProcess = @()
-
- # Modules to import as nested modules of the module specified in RootModule/ModuleToProcess
- # NestedModules = @()
-
- # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export.
- FunctionsToExport = @('Invoke-AsBuiltReport.VMware.Horizon')
-
- # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export.
- #CmdletsToExport = @()
-
- # Variables to export from this module
- #VariablesToExport = '*'
-
- # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export.
- #AliasesToExport = @()
-
- # DSC resources to export from this module
- # DscResourcesToExport = @()
-
- # List of all modules packaged with this module
- # ModuleList = @()
-
- # List of all files packaged with this module
- # FileList = @()
-
- # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell.
- PrivateData = @{
-
- PSData = @{
- # Tags applied to this module. These help with module discovery in online galleries.
- Tags = 'AsBuiltReport', 'Report', 'VMware', 'Horizon', 'Documentation', 'PScribo', 'PSEdition_Desktop', 'Windows', 'Omnissa'
-
- # A URL to the license for this module.
- LicenseUri = 'https://raw.githubusercontent.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/master/LICENSE'
-
- # A URL to the main website for this project.
- ProjectUri = 'https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon'
-
- # A URL to an icon representing this module.
- IconUri = 'https://raw.githubusercontent.com/AsBuiltReport/AsBuiltReport/master/AsBuiltReport.png'
-
- # ReleaseNotes of this module
- ReleaseNotes = 'https://raw.githubusercontent.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/master/CHANGELOG.md'
-
- # Prerelease string of this module
- # Prerelease = ''
-
- # Flag to indicate whether the module requires explicit user acceptance for install/update/save
- # RequireLicenseAcceptance = $false
-
- # External dependent modules of this module
- # ExternalModuleDependencies = @()
-
- } # End of PSData hashtable
-
- } # End of PrivateData hashtable
-
- # HelpInfo URI of this module
- # HelpInfoURI = ''
-
- # Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix.
- # DefaultCommandPrefix = ''
-
-}
-
diff --git a/1.1.5/AsBuiltReport.VMware.Horizon.psm1 b/1.1.5/AsBuiltReport.VMware.Horizon.psm1
deleted file mode 100644
index 6519bad..0000000
--- a/1.1.5/AsBuiltReport.VMware.Horizon.psm1
+++ /dev/null
@@ -1,14 +0,0 @@
-# Get public and private function definition files and dot source them
-$Public = @(Get-ChildItem -Path $PSScriptRoot\Src\Public\*.ps1 -ErrorAction SilentlyContinue)
-$Private = @(Get-ChildItem -Path $PSScriptRoot\Src\Private\*.ps1 -ErrorAction SilentlyContinue)
-
-foreach ($Module in @($Public + $Private)) {
- try {
- . $Module.FullName
- } catch {
- Write-Error -Message "Failed to import function $($Module.FullName): $_"
- }
-}
-
-Export-ModuleMember -Function $Public.BaseName
-Export-ModuleMember -Function $Private.BaseName
\ No newline at end of file
diff --git a/1.1.5/CHANGELOG.md b/1.1.5/CHANGELOG.md
deleted file mode 100644
index 612df69..0000000
--- a/1.1.5/CHANGELOG.md
+++ /dev/null
@@ -1,89 +0,0 @@
-# :arrows_clockwise: VMware Horizon As Built Report Changelog
-
-All notable changes to this project will be documented in this file.
-
-The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
-and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-
-## [1.1.5] - 2025-1-21
-
-### Added
-
-- Added TrueSSO Certificate details and Health Check Section
-
-### Changed
-
-- Tested with Horizon 2406
-- Added TrueSSO Cetificate details section
-- Added Health Check module
-- Increased AsBuiltReport.Core minimum requirements to v1.4.2
-- Increased Eomm/why-don-t-you-tweet Github action to v2
-
-### Fixed
-
-- Resolved the Following issues:
-- [#30](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues/30)
-
-## [1.1.4] - 2024-11-22
-
-### Added
-
-- Tested Report with Horizon 8.13
-
-### Changed
-
-- Changed Required Modules to AsBuiltReport.Core v1.4.0
-- Improved detection of empty fields in tables
-- Improved detection of true/false elements in tables
-- Updated GitHub release workflow to add post to Bluesky social platform
-- Updated sample report
-
-## [1.1.3] - 2024-02-14
-
-### Added
-
-- Added module version validation
-
-### Changed
-
-- Updated VMware PowerCLI requirements to v13.2
-- Updated Sample Reports
-- Updated CodeQL upload-sarif action requirement to v3
-- Updated PSScriptAnalyzer checkout action requirement to v4
-- Updated PublishPowerShellModule checkout action requirement to v4
-
-### Fixed
-
-- Resolved the Following issues:
- - [#15](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues/15), [#16](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues/16), [#17](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues/17), [#18](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues/18), [#19](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues/19), [#20](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues/20), [#21](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues/21), [#22](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues/22), [#23](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues/23), [#24](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues/24)
-
-## [1.1.2] - 2024-02-02
-
-### Fixed
-
-- Renamed Domains Connection Server Section. Resolve [#13](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues/13)
-- Fixed Admin Users and Groups bug details reporting incorrectly. Resolve [#12](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues/12)
-
-## [1.1.0] - 2023-12-19
-
-### Added
-
-- Updated Report to work with Horizon 2309
-- Added Features for Certificates and Replication status
-- Improved functionaliy and layout.
-
-## [0.2.0] - 2022-08-17
-
-### Added
-
-- Migrate report to new module format
- - Implement better error handling
-- Improve report layout
-- A set of Horizon infrastructure health checks has been introduced.
-
-## [0.1.0] - 2020-07-27
-
-### Added
-
-- Initial Release @childebrandt42
- - Develop core horizon modules and sections
diff --git a/1.1.5/LICENSE b/1.1.5/LICENSE
deleted file mode 100644
index 8466cde..0000000
--- a/1.1.5/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2025 AsBuiltReport
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/1.1.5/PSGetModuleInfo.xml b/1.1.5/PSGetModuleInfo.xml
deleted file mode 100644
index dbbc079..0000000
--- a/1.1.5/PSGetModuleInfo.xml
+++ /dev/null
@@ -1,163 +0,0 @@
-
-
-
- Microsoft.PowerShell.Commands.PSRepositoryItemInfo
- System.Management.Automation.PSCustomObject
- System.Object
-
-
- AsBuiltReport.VMware.Horizon
- 1.1.5
- Module
- A PowerShell module to generate as built reports on the configuration of VMware Horizon
- Chris Hildebrandt
- tpcarman
- (c) 2025 Chris Hildebrandt. All rights reserved.
- 2025-02-01T00:39:45-04:00
-
- 2025-09-13T12:03:34.846732-04:00
-
-
-
- Microsoft.PowerShell.Commands.DisplayHintType
- System.Enum
- System.ValueType
- System.Object
-
- DateTime
- 2
-
-
-
-
- https://raw.githubusercontent.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/master/LICENSE
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- https://raw.githubusercontent.com/AsBuiltReport/AsBuiltReport/master/AsBuiltReport.png
-
-
- System.Object[]
- System.Array
- System.Object
-
-
- AsBuiltReport
- Report
- VMware
- Horizon
- Documentation
- PScribo
- PSEdition_Desktop
- Windows
- Omnissa
- PSModule
-
-
-
-
- System.Collections.Hashtable
- System.Object
-
-
-
- RoleCapability
-
-
-
-
-
-
- DscResource
-
-
-
- Cmdlet
-
-
-
- Function
-
-
-
- Invoke-AsBuiltReport.VMware.Horizon
-
-
-
-
- Command
-
-
-
- Invoke-AsBuiltReport.VMware.Horizon
-
-
-
-
- Workflow
-
-
-
-
-
- https://raw.githubusercontent.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/master/CHANGELOG.md
-
-
-
-
-
- System.Collections.Specialized.OrderedDictionary
- System.Object
-
-
-
- Name
- AsBuiltReport.Core
-
-
- MinimumVersion
- 1.4.2
-
-
- CanonicalId
- nuget:AsBuiltReport.Core/1.4.2
-
-
-
-
-
- https://www.powershellgallery.com/api/v2
- PSGallery
- NuGet
-
-
- System.Management.Automation.PSCustomObject
- System.Object
-
-
- (c) 2025 Chris Hildebrandt. All rights reserved.
- A PowerShell module to generate as built reports on the configuration of VMware Horizon
- False
- https://raw.githubusercontent.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/master/CHANGELOG.md
- True
- True
- 17592
- 36264
- 278721
- 2/1/2025 12:39:45 AM -04:00
- 2/1/2025 12:39:45 AM -04:00
- 9/13/2025 4:00:00 PM -04:00
- AsBuiltReport Report VMware Horizon Documentation PScribo PSEdition_Desktop Windows Omnissa PSModule PSFunction_Invoke-AsBuiltReport.VMware.Horizon PSCommand_Invoke-AsBuiltReport.VMware.Horizon PSIncludes_Function
- False
- 2025-09-13T16:00:00Z
- 1.1.5
- Chris Hildebrandt
- false
- Module
- AsBuiltReport.VMware.Horizon.nuspec|Samples\Sample VMware Horizon As Built Report.html|Src\Private\Get-AbrHRZGlobalEntitlement.ps1|Src\Private\Get-AbrHRZInfrastructure.ps1|AsBuiltReport.VMware.Horizon.json|Src\Private\Get-AbrHRZAccessGroup.ps1|Src\Private\Get-AbrHRZGlobalPolicy.ps1|Src\Private\Get-AbrHRZInstantClone.ps1|Src\Private\Get-AbrHRZADDomain.ps1|Src\Private\Get-AbrHRZGlobalSetting.ps1|Src\Private\Get-AbrHRZLicense.ps1|AsBuiltReport.VMware.Horizon.psd1|Src\Private\Get-AbrHRZAdminGroup.ps1|Src\Private\Get-AbrHRZHCConnection.ps1|Src\Private\Get-AbrHRZLocalEntitlement.ps1|AsBuiltReport.VMware.Horizon.psm1|Src\Private\Get-AbrHRZApplicationPool.ps1|Src\Private\Get-AbrHRZHCDataStore.ps1|Src\Private\Get-AbrHRZMachine.ps1|AsBuiltReport.VMware.Horizon.Style.ps1|Src\Private\Get-AbrHRZCertMgmt.ps1|Src\Private\Get-AbrHRZHCDomain.ps1|Src\Private\Get-AbrHRZRegisteredMachine.ps1|CHANGELOG.md|Src\Private\Get-AbrHRZCloudPod.ps1|Src\Private\Get-AbrHRZHCESXiHost.ps1|Src\Private\Get-AbrHRZRolePermission.ps1|LICENSE|Src\Private\Get-AbrHRZConnectionServer.ps1|Src\Private\Get-AbrHRZHCEventDataBase.ps1|Src\Private\Get-AbrHRZRolePrivilege.ps1|README.md|Src\Private\Get-AbrHRZDatastore.ps1|Src\Private\Get-AbrHRZHCGatewayServer.ps1|Src\Private\Get-AbrHRZSite.ps1|.github\PULL_REQUEST_TEMPLATE.md|Src\Private\Get-AbrHRZDesktopPool.ps1|Src\Private\Get-AbrHRZHCLicenseService.ps1|Src\Private\Get-AbrHRZTSSO.ps1|.github\ISSUE_TEMPLATE\bug_report.yml|Src\Private\Get-AbrHRZDomain.ps1|Src\Private\Get-AbrHRZHCRDSFarm.ps1|Src\Private\Get-AbrHRZUAG.ps1|.github\ISSUE_TEMPLATE\change_request.yml|Src\Private\Get-AbrHRZESXi.ps1|Src\Private\Get-AbrHRZHCRemotePod.ps1|Src\Private\Get-AbrHRZUnauthenticatedACL.ps1|.github\ISSUE_TEMPLATE\config.yml|Src\Private\Get-AbrHRZEventConf.ps1|Src\Private\Get-AbrHRZHCSAML2.ps1|Src\Private\Get-AbrHRZVcenter.ps1|.github\workflows\Codeql.yml|Src\Private\Get-AbrHRZFarm.ps1|Src\Private\Get-AbrHRZHCTrueSSO.ps1|Src\Private\Get-RequiredModule.ps1|.github\workflows\PSScriptAnalyzer.yml|Src\Private\Get-AbrHRZFederationAccessGroup.ps1|Src\Private\Get-AbrHRZHCvCenter.ps1|Src\Private\SharedUtilsFunctions.ps1|.github\workflows\PSScriptAnalyzerSettings.psd1|Src\Private\Get-AbrHRZGatewayCert.ps1|Src\Private\Get-AbrHRZHomeSite.ps1|Src\Public\Invoke-ASBuiltReport.VMware.Horizon.ps1|.github\workflows\Release.yml|.vscode\settings.json
- 2d7d49b3-b010-453c-8a35-22b19f9b7a17
- 5.1
-
-
- /home/rebelinux/.local/share/powershell/Modules/AsBuiltReport.VMware.Horizon/1.1.5
-
-
-
diff --git a/1.1.5/README.md b/1.1.5/README.md
deleted file mode 100644
index be2d26c..0000000
--- a/1.1.5/README.md
+++ /dev/null
@@ -1,208 +0,0 @@
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# Omnissa Horizon As Built Report
-
-Omnissa Horizon As Built Report is a PowerShell module which works in conjunction with [AsBuiltReport.Core](https://github.com/AsBuiltReport/AsBuiltReport.Core).
-
-[AsBuiltReport](https://github.com/AsBuiltReport/AsBuiltReport) is an open-sourced community project which utilises PowerShell to produce as-built documentation in multiple document formats for multiple vendors and technologies.
-
-Please refer to the AsBuiltReport [website](https://www.asbuiltreport.com) for more detailed information about this project.
-
-# :books: Sample Reports
-
-## Sample Report - Custom Style
-
-Sample Omnissa Horizon As Built report HTML file: [Sample VMware Horizon As-Built Report.html](https://htmlpreview.github.io/?https://raw.githubusercontent.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/dev/Samples/Sample%20VMware%20Horizon%20As%20Built%20Report.html)
-
-# :beginner: Getting Started
-
-Below are the instructions on how to install, configure and generate a Onmissa Horizon As Built report.
-
-## :floppy_disk: Supported Versions
-
-The Omnissa Horizon As Built Report supports the following Horizon versions;
-
-- Horizon 8+, 2+**
-
-### PowerShell
-
-This report is compatible with the following PowerShell versions;
-
-| Windows PowerShell 5.1 | PowerShell 7 |
-| :--------------------: | :----------------: |
-| :white_check_mark: | :white_check_mark: |
-
-## :wrench: System Requirements
-
-PowerShell 5.1 or PowerShell 7, and the following PowerShell modules are required for generating a VMware Horizon As Built Report.
-
-- [VMware PowerCLI Module](https://www.powershellgallery.com/packages/VMware.PowerCLI/) version 13.2.0.22643736 or older (VMware removed the "VMware.VimAutomation.HorizonView" in latest versions.)
-- [AsBuiltReport.VMware.Horizon Module](https://www.powershellgallery.com/packages/AsBuiltReport.VMware.Horizon/)
-
-### :closed_lock_with_key: Required Privileges
-
-- A Omnissa Horizon As Built Report can be generated with Administrators(Read only) privileges.
-
-## :package: Module Installation
-
-Open a PowerShell terminal window and install each of the required modules.
-
-:warning: VMware PowerCLI 13.2 is required. Please ensure older PowerCLI versions have been uninstalled.
-
-```powershell
-install-module VMware.PowerCLI -MaximumVersion 13.2.0.22643736 -AllowClobber
-install-module AsBuiltReport.VMware.Horizon
-```
-
-### GitHub
-
-If you are unable to use the PowerShell Gallery, you can still install the module manually. Ensure you repeat the following steps for the [system requirements](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon#wrench-system-requirements) also.
-
-1. Download the code package / [latest release](https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/releases/latest) zip from GitHub
-2. Extract the zip file
-3. Copy the folder `AsBuiltReport.VMware.Horizon` to a path that is set in `$env:PSModulePath`.
-4. Open a PowerShell terminal window and unblock the downloaded files with
- ```powershell
- $path = (Get-Module -Name AsBuiltReport.VMware.Horizon -ListAvailable).ModuleBase; Unblock-File -Path $path\*.psd1; Unblock-File -Path $path\Src\Public\*.ps1; Unblock-File -Path $path\Src\Private\*.ps1
- ```
-5. Close and reopen the PowerShell terminal window.
-
-_Note: You are not limited to installing the module to those example paths, you can add a new entry to the environment variable PSModulePath if you want to use another path._
-
-## :pencil2: Configuration
-
-The Omnissa Horizon As Built Report utilizes a JSON file to allow configuration of report information, options, detail and healthchecks.
-
-A Omnissa Horizon report configuration file can be generated by executing the following command;
-
-```powershell
-New-AsBuiltReportConfig -Report VMware.Horizon -FolderPath -Filename
-```
-
-Executing this command will copy the default Omnissa Horizon report JSON configuration to a user specified folder.
-
-All report settings can then be configured via the JSON file.
-
-The following provides information of how to configure each schema within the report's JSON file.
-
-
-### Report
-
-The **Report** schema provides configuration of the Omnissa Horizon report information.
-
-| Sub-Schema | Setting | Default | Description |
-| ------------------- | ------------ | ------------------------------ | ------------------------------------------------------------ |
-| Name | User defined | VMware Horizon As Built Report | The name of the As Built Report |
-| Version | User defined | 1.0 | The report version |
-| Status | User defined | Released | The report release status |
-| ShowCoverPageImage | true / false | true | Toggle to enable/disable the display of the cover page image |
-| ShowTableOfContents | true / false | true | Toggle to enable/disable table of contents |
-| ShowHeaderFooter | true / false | true | Toggle to enable/disable document headers & footers |
-| ShowTableCaptions | true / false | true | Toggle to enable/disable table captions/numbering |
-
-### Options
-
-The **Options** schema allows certain options within the report to be toggled on or off.
-
-
-### InfoLevel
-
-The **InfoLevel** schema allows configuration of each section of the report at a granular level. The following sections can be set.
-
-There are 3 levels (0-3) of detail granularity for each section as follows;
-
-| Setting | InfoLevel | Description |
-| :-----: | ----------------- | -------------------------------------------------------------------- |
-| 0 | Disabled | Does not collect or display any information |
-| 1 | Enabled / Summary | Provides summarized information for a collection of objects |
-| 2 | Adv Summary | Provides condensed, detailed information for a collection of objects |
-
-The table below outlines the default and maximum InfoLevel settings for each UsersandGroups section.
-
-| Sub-Schema | Default Setting | Maximum Setting |
-| --------------------- | :-------------: | :-------------: |
-| Entitlements | 1 | 2 |
-| HomeSiteAssignments | 1 | 1 |
-| UnauthenticatedAccess | 1 | 1 |
-
-The table below outlines the default and maximum InfoLevel settings for each Inventory section.
-
-| Sub-Schema | Default Setting | Maximum Setting |
-| ------------------ | :-------------: | :-------------: |
-| Desktop | 1 | 3 |
-| Applications | 1 | 2 |
-| Farms | 1 | 2 |
-| Machines | 1 | 1 |
-| GlobalEntitlements | 1 | 1 |
-
-The table below outlines the default and maximum InfoLevel settings for each Settings section.
-
-| Sub-Schema | Default Setting | Maximum Setting |
-| -------------------------- | :-------------: | :-------------: |
-| vCenter | 1 | 2 |
-| ESXiHosts | 1 | 2 |
-| DataStores | 1 | 2 |
-| ADDomains | 1 | 1 |
-| UAGServers | 1 | 1 |
-| ConnectionServers | 1 | 2 |
-| InstantCloneDomainAccounts | 1 | 1 |
-| ProductLicensingandUsage | 1 | 2 |
-| GlobalSettings | 1 | 1 |
-| RegisteredMachines | 1 | 2 |
-| AdministratorsandGroups | 1 | 2 |
-| RolePrivileges | 1 | 1 |
-| RolePermissions | 1 | 1 |
-| AccessGroup | 1 | 2 |
-| Cloud Pod | 1 | 2 |
-| Sites | 1 | 2 |
-| EventDatabase | 1 | 1 |
-| Syslog | 1 | 1 |
-| EventstoFileSystem | 1 | 1 |
-
-### Healthcheck
-
-The **Healthcheck** schema is used to toggle health checks on or off.
-
-## :computer: Examples
-
-```powershell
-# Generate a Horizon As Built Report for Horizon Connection Server 'horizon-cs-01.corp.local' using specified credentials. Export report to HTML & DOCX formats. Use default report style. Append timestamp to report filename. Save reports to 'C:\Users\Jon\Documents'
-PS C:\> New-AsBuiltReport -Report VMware.Horizon -Target 'Horizon-cs-01.corp.local' -Username 'administrator@domain.local' -Password 'VMware1!' -Format Html,Word -OutputFolderPath 'C:\Users\Jon\Documents' -Timestamp
-
-# Generate a Horizon As Built Report for Horizon Connection Server 'Horizon-cs-01.corp.local' using specified credentials and report configuration file. Export report to Text, HTML & DOCX formats. Use default report style. Save reports to 'C:\Users\Jon\Documents'. Display verbose messages to the console.
-PS C:\> New-AsBuiltReport -Report VMware.Horizon -Target 'Horizon-cs-01.corp.local' -Username 'administrator@domain.local' -Password 'VMware1!' -Format Text,Html,Word -OutputFolderPath 'C:\Users\Jon\Documents' -ReportConfigFilePath 'C:\Users\Jon\AsBuiltReport\AsBuiltReport.VMware.Horizon.json' -Verbose
-
-# Generate a Horizon As Built Report for Horizon Connection Server 'Horizon-cs-01.corp.local' using stored credentials. Export report to HTML & Text formats. Use default report style. Highlight environment issues within the report. Save reports to 'C:\Users\JOn\Documents'.
-PS C:\> $Creds = Get-Credential
-PS C:\> New-AsBuiltReport -Report VMware.Horizon -Target 'Horizon-cs-01.corp.local' -Credential $Creds -Format Html,Text -OutputFolderPath 'C:\Users\Jon\Documents' -EnableHealthCheck
-
-# Generate a single Horizon As Built Report for Horizon Connection Servers 'Horizon-cs-01.corp.local' and 'Horizon-cs-02.corp.local' using specified credentials. Report exports to WORD format by default. Apply custom style to the report. Reports are saved to the user profile folder by default.
-PS C:\> New-AsBuiltReport -Report VMware.Horizon -Target 'Horizon-cs-01.corp.local','Horizon-cs-02.corp.local' -Username 'administrator@domain.local' -Password 'VMware1!' -StyleFilePath 'C:\Scripts\Styles\MyCustomStyle.ps1'
-
-# Generate a Horizon As Built Report for Horizon Connection Server 'Horizon-cs-01.corp.local' using specified credentials. Export report to HTML & DOCX formats. Use default report style. Reports are saved to the user profile folder by default. Attach and send reports via e-mail.
-PS C:\> New-AsBuiltReport -Report VMware.Horizon -Target 'Horizon-cs-01.corp.local' -Username 'administrator@domain.local' -Password 'VMware1!' -Format Html,Word -OutputFolderPath 'C:\Users\Jon\Documents' -SendEmail
diff --git a/1.1.5/Samples/Sample VMware Horizon As Built Report.html b/1.1.5/Samples/Sample VMware Horizon As Built Report.html
deleted file mode 100644
index ed7dce4..0000000
--- a/1.1.5/Samples/Sample VMware Horizon As Built Report.html
+++ /dev/null
@@ -1,1212 +0,0 @@
-
-
-VMware Horizon As Built Report
-
-
-
-
-

-
-
VMware Horizon As Built Report
ACME Inc.
-| Author: | Bugs Bunny |
-| Date: | Friday, November 22, 2024 |
-| Version: | 1.0 |
-
-
-
-
1 HORIZON-CS-01V.PHARMAX.LOCAL
1.1 Executive Summary for HORIZON-CS-01V.PHARMAX.LOCAL
-
-| Number of Local Entitlements | 0 |
-| Number of Global Entitlements | 2 |
-| Number of Desktop Pools | 0 |
-| Number of Application Pool | 0 |
-| Number of Farms Pools | 0 |
-| Number of vCenter Servers | 1 |
-| Number of ESXi Hosts | 0 |
-| Number of Datastores | 0 |
-| Number of Active Directory Domains | 5 |
-| Number of UAG Servers | 2 |
-| Number of Connection Servers | 2 |
-| Number of Instant Clone Accounts | 2 |
-| Number of RDS Hosts | 0 |
-| Number of Administrators and Groups | 8 |
-
-
Table 1 - Executive Summary - HORIZON-CS-01V.PHARMAX.LOCAL
-
2 Users and Groups
The following section provides information about the permissions that control which remote desktops and applications your users can access.
2.1 Home Site
The following section provide a summary of user and group home site configuration.
-| User or Group Name | Domain | Group | Email | Home Site | Global Entitlement | Global Application Entitlement |
-| dbuser | pharmax.local | No | -- | PHARMAX-HQ | -- | -- |
-
-
Table 2 - Home Site General - HORIZON-CS-01V.PHARMAX.LOCAL
-
2.2 Unauthenticated Access
The following section provide a summary of user and group unauthenticated access configuration.
-| Login Name | User ID | Description | Hybrid Logon | Pod Name |
-| 2254824036SA | pharmax.local\2254824036SA | -- | -- | Cluster-HORIZON-CS-01V |
-| 447284480SA | pharmax.local\447284480SA | -- | -- | Cluster-HORIZON-CS-01V |
-
-
Table 3 - Unauthenticated Access - HORIZON-CS-01V.PHARMAX.LOCAL
-
3 Inventory
The following section provides detailed information about desktop, application, farm pools and global entitlement permissions that control which remote desktops and applications your users can access.
3.1 Global Entitlements
The following section details the Global Entitlements configuration for HORIZON-CS-01V.PHARMAX.LOCAL server.
-| Name | Type | Number of Pods |
-| APPVol-FARM | -- | 0 |
-| GEZ-Linux | -- | 0 |
-| Group-Ent | -- | 0 |
-
-
Table 4 - Global Entitlements - HORIZON-CS-01V.PHARMAX.LOCAL
-
3.1.1 Global Entitlement Summary Details
3.1.1.1 Summary - Group-Ent
-
-| Display Name | Group-Ent |
-| Alias Name | Group Entitlement |
-| Description | -- |
-| Scope | SITE |
-| From Home Site | Yes |
-| Require Home Site | Yes |
-| Multiple Session Auto Clean | No |
-| Enabled | Yes |
-| Supported Display Protocols | PCOIP, BLAST, RDP |
-| Default Display Protocol | BLAST |
-| Allow Users to Choose Display Protocol | Yes |
-| Allow User to Reset Machines | Yes |
-| Enable HTML Access | Yes |
-| Allow Multiple Sessions Per User | No |
-| Enable Pre-Launch | -- |
-| Connection Server Restrictions | -- |
-| Enable Prelaunch | -- |
-| Category Folder Name | -- |
-| Client Restrictions | Yes |
-| Enable Collaboration | Yes |
-| Shortcut Locations | -- |
-| Multisession Mode | -- |
-| Backup GAE | -- |
-| Display Assigned Machine Name | No |
-| Display Machine Alias | No |
-| Global Access Group ID | Root |
-
-
Table 5 - Detailed Information - Group-Ent
-
3.1.1.2 Local Pools - Group-Ent
-
-| Local Desktop Count | 0 |
-| Local Application Count | -- |
-| Remote Desktop Count | 0 |
-| Remote Application Count | -- |
-| User Count | 0 |
-| User or Group Count | 2 |
-| User or Group Site Override Count | 0 |
-| Member Pods | -- |
-
-
Table 6 - Local Pools - HORIZON-CS-01V.PHARMAX.LOCAL
-
3.1.1.3 Users and Groups - Group-Ent
-| Name | User or Group | Domain |
-| SCCM_Admins | Group | pharmax.local |
-| AD - SRM Admin Group | Group | pharmax.local |
-
-
Table 7 - Users and Groups - Group-Ent
-
3.1.1.4 Summary - GEZ-Linux
-
-| Display Name | GEZ-Linux |
-| Alias Name | GEZ Linux |
-| Description | -- |
-| Scope | ANY |
-| From Home Site | No |
-| Require Home Site | No |
-| Multiple Session Auto Clean | No |
-| Enabled | Yes |
-| Supported Display Protocols | PCOIP, BLAST, RDP |
-| Default Display Protocol | PCOIP |
-| Allow Users to Choose Display Protocol | Yes |
-| Allow User to Reset Machines | No |
-| Enable HTML Access | Yes |
-| Allow Multiple Sessions Per User | No |
-| Enable Pre-Launch | -- |
-| Connection Server Restrictions | -- |
-| Enable Prelaunch | -- |
-| Category Folder Name | -- |
-| Client Restrictions | No |
-| Enable Collaboration | No |
-| Shortcut Locations | -- |
-| Multisession Mode | -- |
-| Backup GAE | -- |
-| Display Assigned Machine Name | No |
-| Display Machine Alias | No |
-| Global Access Group ID | Root |
-
-
Table 8 - Detailed Information - GEZ-Linux
-
3.1.1.5 Local Pools - GEZ-Linux
-
-| Local Desktop Count | 0 |
-| Local Application Count | -- |
-| Remote Desktop Count | 0 |
-| Remote Application Count | -- |
-| User Count | 1 |
-| User or Group Count | 2 |
-| User or Group Site Override Count | 0 |
-| Member Pods | -- |
-
-
Table 9 - Local Pools - HORIZON-CS-01V.PHARMAX.LOCAL
-
3.1.1.6 Users and Groups - GEZ-Linux
-| Name | User or Group | Domain |
-| Jonathan A. Colon Feliciano | User | pharmax.local |
-| AD - SRM Recovery Group | Group | pharmax.local |
-
-
Table 10 - Users and Groups - GEZ-Linux
-
3.1.1.7 Summary - APPVol-FARM
-
-| Display Name | APPVol-FARM |
-| Alias Name | APPVol-FARM |
-| Description | -- |
-| Scope | ANY |
-| From Home Site | No |
-| Require Home Site | No |
-| Multiple Session Auto Clean | No |
-| Enabled | Yes |
-| Supported Display Protocols | PCOIP, BLAST |
-| Default Display Protocol | PCOIP |
-| Allow Users to Choose Display Protocol | Yes |
-| Allow User to Reset Machines | -- |
-| Enable HTML Access | Yes |
-| Allow Multiple Sessions Per User | -- |
-| Enable Pre-Launch | No |
-| Connection Server Restrictions | -- |
-| Enable Prelaunch | No |
-| Category Folder Name | -- |
-| Client Restrictions | No |
-| Enable Collaboration | -- |
-| Shortcut Locations | -- |
-| Multisession Mode | ENABLED_DEFAULT_OFF |
-| Backup GAE | -- |
-| Display Assigned Machine Name | -- |
-| Display Machine Alias | -- |
-| Global Access Group ID | Root |
-
-
Table 11 - Detailed Information - APPVol-FARM
-
3.1.1.8 Local Pools - APPVol-FARM
-
-| Local Desktop Count | -- |
-| Local Application Count | 0 |
-| Remote Desktop Count | -- |
-| Remote Application Count | 0 |
-| User Count | 1 |
-| User or Group Count | 3 |
-| User or Group Site Override Count | 0 |
-| Member Pods | -- |
-
-
Table 12 - Local Pools - HORIZON-CS-01V.PHARMAX.LOCAL
-
3.1.1.9 Users and Groups - APPVol-FARM
-| Name | User or Group | Domain |
-| Jonathan A. Colon Feliciano | User | pharmax.local |
-| Administrators | Group | pharmax.local |
-| Backup Operators | Group | pharmax.local |
-
-
Table 13 - Users and Groups - APPVol-FARM
-
4 Settings
The following section provides detailed information about the configuration of the components that comprise the Horizon Server infrastructure.
4.1 Servers
4.1.1 vCenter Servers
The following section details the vCenter Servers configuration for HORIZON-CS-01V.PHARMAX.LOCAL server.
-| Name | Version | Build Number | API Version | Provisioning Enabled |
-| vcenter-01v.pharmax.local | -- | -- | -- | Yes |
-
-
Table 14 - vCenter - HORIZON-CS-01V
-
4.1.1.1 vcenter-01v.pharmax.local
-
-| Name | vcenter-01v.pharmax.local |
-| Description | -- |
-| Certificate Override | -- |
-| Provisioning Enabled | Yes |
-| Reclaim Disk Space | Yes |
-| Port | 443 |
-| User SSL | Yes |
-| User Name | administrator@vsphere.local |
-| Type | VIRTUAL_CENTER |
-| TCP Port Number | 443 |
-| Max Concurrent Provisioning Operations | 20 |
-| Max Concurrent Power Operations | 50 |
-| Max Concurrent View Composer Maintenance Operations | 0 |
-| Max Concurrent View Composer Provisioning Operations | 12 |
-| Max Concurrent Instant Clone Engine Provisioning Operations | 20 |
-| Storage Acceleration Enabled | Yes |
-| Storage Accelerator Default Cache Size | 1024MB |
-
-
Table 15 - vCenter Server Details - vcenter-01v.pharmax.local
-
Storage Accelerator Overrides
-| Datacenter | Cluster | Host | Cache Size |
-| PHARMAX-VSI-DC | RegionB01-vSAN | vsan-01b.pharmax.local | 2048MB |
-| PHARMAX-VSI-DC | RegionHQ-MGMT | esxsvr-00f.pharmax.local | 4096MB |
-
-
Table 16 - Storage Accelerator Overrides - vcenter-01v.pharmax.local
-
4.1.2 ESXi Hosts
The following section details the hardware information of ESXi Hosts for HORIZON-CS-01V.PHARMAX.LOCAL server.
4.1.3 Gateway Servers
The following section details the Gateway Servers information for HORIZON-CS-01V.PHARMAX.LOCAL.
-| Name | IP | Version | Type | Zone Internal |
-| Horizon-UAG-01V | -- | -- | -- | No |
-| Horizon-UAG-02V | -- | -- | -- | No |
-
-
Table 17 - Gateway Servers - HORIZON-CS-01V.PHARMAX.LOCAL
-
4.1.4 Connection Servers
The following section details the configuration of Connection Servers for HORIZON-CS-01V.PHARMAX.LOCAL server.
-| Name | Version | Enabled |
-| HORIZON-CS-01V | 8.13.0-10070698069 | Yes |
-| HORIZON-CS-02V | 8.13.0-10070698069 | Yes |
-
-
Table 18 - Connection Servers - HORIZON-CS-01V.PHARMAX.LOCAL
-
4.1.4.1 General HORIZON-CS-01V Details
-
-| Name | HORIZON-CS-01V |
-| FQDN | Horizon-CS-01V.pharmax.local |
-| Server Address | https://horizon-cs-01v.pharmax.local:443 |
-| Version | 8.13.0-10070698069 |
-| Enabled | Yes |
-| Tags | -- |
-| External URL | https://Horizon-CS-01V.pharmax.local:443 |
-| External PCoIP URL | 192.168.7.202:4172 |
-| Auxiliary External PCoIP IPv4 Address | -- |
-| External App Blast URL | https://Horizon-CS-01V.pharmax.local:8443 |
-| Local Connection Server | Yes |
-| Bypass Tunnel | No |
-| Bypass PCoIP Gateway | Yes |
-| Bypass App Blast Gateway | No |
-| IP Mode | IPv4 |
-| FIPs Mode Enabled | No |
-| Replication Status | OK |
-| Current CPU Usage Percentage | 11% |
-| Current Memory Usage Percentage | 89% |
-
-
Table 19 - Connection Servers - HORIZON-CS-01V
-
4.1.4.2 Authentication HORIZON-CS-01V Details
-
-| Smart Card Support | OPTIONAL |
-| Log off When Smart Card Removed | No |
-| RSA Secure ID Enabled | No |
-| RSA Secure ID Name Mapping | No |
-| RSA Secure ID Clear Node Secret | No |
-| RSA Secure ID Security File Data | -- |
-| RSA Secure ID Security File Uploaded | No |
-| Radius Enabled | No |
-| Radius Authenticator | -- |
-| Radius Name Mapping | No |
-| Radius SSO | No |
-| SAML Support | DISABLED |
-| SAML Authenticator | -- |
-| SAML Authenticator Description | -- |
-| SAML Trigger Mode | -- |
-| SAML Password Mode | -- |
-| SAML Authenticator Type | -- |
-| SAML Metadata URL | -- |
-| SAML Administrator URL | -- |
-| SAML Static Meta Data | -- |
-| Unauthenticated Access Config Enabled | No |
-| Unauthenticated Access Default User | -- |
-| Unauthenticated Access User Idle Timeout | 10 |
-| Unauthenticated Access Client Puzzle Difficulty | 21 |
-| Block Unsupported Clients | No |
-
-
Table 20 - Authentication - HORIZON-CS-01V
-
4.1.4.3 Backup HORIZON-CS-01V Details
-
-| Automatic Backup Frequency | Every day |
-| Max Number of Backups | 10 |
-| Last Backup Time | 12/15/2023 00:00:10 |
-| Last Backup Status | OK |
-| Folder Location | C:\ProgramData\VMware\VDM\backups |
-
-
Table 21 - Backup - HORIZON-CS-01V
-
4.1.4.4 Certificate Details for HORIZON-CS-01V Details
-
-| Connection Server | HORIZON-CS-01V |
-| Self-Signed Certificate | No |
-| Certificate Subject | CN=Horizon-CS-01V, OU=IT, O=PHARMAX, L=CAYEY, S=PR, C=US |
-| Certificate Issuer | CN=pharmax-SERVER-DC-01V-CA, DC=pharmax, DC=local |
-| Certificate Not Before | 04/10/2023 11:03:20 |
-| Certificate Not After | 01/25/2025 19:45:15 |
-| Certificate SANs | Horizon-CS-01V.pharmax.local, Horizon-CS-00V.pharmax.local |
-| Certificate Thumbprint | A9470E4EBEED26CB71BD870E6E1E4607809E5122 |
-
-
Table 22 - Certificate Details for - HORIZON-CS-01V
-
4.1.4.5 Replication Status for Connection Server HORIZON-CS-01V
-
-| Connection Server | HORIZON-CS-01V |
-| Replication Partner | HORIZON-CS-02V |
-| Status | OK |
-| Message | No Replication Issues |
-
-
Table 23 - Connection Servers Replication- HORIZON-CS-01V
-
4.1.4.6 General HORIZON-CS-02V Details
-
-| Name | HORIZON-CS-02V |
-| FQDN | Horizon-CS-02V.pharmax.local |
-| Server Address | https://horizon-cs-02v.pharmax.local:443 |
-| Version | 8.13.0-10070698069 |
-| Enabled | Yes |
-| Tags | -- |
-| External URL | https://Horizon-CS-02V.pharmax.local:443 |
-| External PCoIP URL | 192.168.7.63:4172 |
-| Auxiliary External PCoIP IPv4 Address | -- |
-| External App Blast URL | https://Horizon-CS-02V.pharmax.local:8443 |
-| Local Connection Server | No |
-| Bypass Tunnel | No |
-| Bypass PCoIP Gateway | Yes |
-| Bypass App Blast Gateway | No |
-| IP Mode | IPv4 |
-| FIPs Mode Enabled | No |
-| Replication Status | OK |
-| Current CPU Usage Percentage | 4% |
-| Current Memory Usage Percentage | 78% |
-
-
Table 24 - Connection Servers - HORIZON-CS-02V
-
4.1.4.7 Authentication HORIZON-CS-02V Details
-
-| Smart Card Support | OPTIONAL |
-| Log off When Smart Card Removed | No |
-| RSA Secure ID Enabled | No |
-| RSA Secure ID Name Mapping | No |
-| RSA Secure ID Clear Node Secret | No |
-| RSA Secure ID Security File Data | -- |
-| RSA Secure ID Security File Uploaded | No |
-| Radius Enabled | No |
-| Radius Authenticator | -- |
-| Radius Name Mapping | No |
-| Radius SSO | No |
-| SAML Support | DISABLED |
-| SAML Authenticator | -- |
-| SAML Authenticator Description | -- |
-| SAML Trigger Mode | -- |
-| SAML Password Mode | -- |
-| SAML Authenticator Type | -- |
-| SAML Metadata URL | -- |
-| SAML Administrator URL | -- |
-| SAML Static Meta Data | -- |
-| Unauthenticated Access Config Enabled | No |
-| Unauthenticated Access Default User | -- |
-| Unauthenticated Access User Idle Timeout | 10 |
-| Unauthenticated Access Client Puzzle Difficulty | 21 |
-| Block Unsupported Clients | No |
-
-
Table 25 - Authentication - HORIZON-CS-02V
-
4.1.4.8 Backup HORIZON-CS-02V Details
-
-| Automatic Backup Frequency | Every day |
-| Max Number of Backups | 10 |
-| Last Backup Time | 12/15/2023 00:00:10 |
-| Last Backup Status | OK |
-| Folder Location | C:\ProgramData\VMware\VDM\backups |
-
-
Table 26 - Backup - HORIZON-CS-02V
-
4.1.4.9 Certificate Details for HORIZON-CS-02V Details
-
-| Connection Server | HORIZON-CS-02V |
-| Self-Signed Certificate | Yes |
-| Certificate Subject | CN=Horizon-CS-02V.pharmax.local, OU=VMware Horizon View default certificate, O="VMware, Inc." |
-| Certificate Issuer | CN=Horizon-CS-02V.pharmax.local, OU=VMware Horizon View default certificate, O="VMware, Inc." |
-| Certificate Not Before | 04/10/2023 12:19:45 |
-| Certificate Not After | 07/13/2025 12:19:45 |
-| Certificate SANs | Horizon-CS-02V.pharmax.local |
-| Certificate Thumbprint | B9AE51BC10F4D3FDE367640A687DB24032290C9D |
-
-
Table 27 - Certificate Details for - HORIZON-CS-02V
-
4.1.4.10 Replication Status for Connection Server HORIZON-CS-02V
-
-| Connection Server | HORIZON-CS-02V |
-| Replication Partner | HORIZON-CS-01V |
-| Status | OK |
-| Message | No Replication Issues |
-
-
Table 28 - Connection Servers Replication- HORIZON-CS-02V
-
4.1.5 Gateway Certificate
The following section details on the gateway certificate information for HORIZON-CS-01V.PHARMAX.LOCAL.
-
-| Certificate Name | uag-01 |
-| Common Name | OU=self-signed, CN=192.168.1.17 |
-| Issuer | OU=self-signed, CN=192.168.1.17 |
-| Expiry Date | 03/23/2026 10:08:00 |
-| Serial Number | 72012228190 |
-
-
Table 29 - Gateway Certificate - HORIZON-CS-01V.PHARMAX.LOCAL
-
4.2 Domains
4.2.1 Domain Accounts
The following section details the Domain Accounts configuration for HORIZON-CS-01V.PHARMAX.LOCAL server.
-| User Name | Domain Name |
-| horizon-ic | pharmax.local |
-| jocolon | pharmax.local |
-
-
Table 30 - Domain Accounts - HORIZON-CS-01V.PHARMAX.LOCAL
-
4.2.2 Connection Server Domain Status
The following section shows connection servers domains for HORIZON-CS-01V.PHARMAX.LOCAL environment.
-| Domain DNS Name | Status | Trust Relationship | Connection Status |
-| pharmax.local | OK | PRIMARYDOMAIN | FULLYACCESSIBLE |
-| uia.local | ERROR | TWOWAY | UNCONTACTABLE |
-| lab.local | ERROR | TWOWAY | UNCONTACTABLE |
-| acad.pharmax.local | ERROR | TWOWAY_FOREST | UNCONTACTABLE |
-| b12.local | ERROR | FROMBROKER | UNCONTACTABLE |
-
-
Table 31 - Connection Server Domain Status- HORIZON-CS-01V.PHARMAX.LOCAL
-
4.3 Certificate Management
The following section details on the certificate management information for HORIZON-CS-01V.PHARMAX.LOCAL.
-
-| Self-Signed Certificate | No |
-| Certificate Subject | CN=Horizon-CS-01V, OU=IT, O=PHARMAX, L=CAYEY, S=PR, C=US |
-| Certificate Issuer | CN=pharmax-SERVER-DC-01V-CA, DC=pharmax, DC=local |
-| Certificate Not Before | 04/10/2023 11:03:20 |
-| Certificate Not After | 01/25/2025 19:45:15 |
-| Certificate SANs | Horizon-CS-01V.pharmax.local Horizon-CS-00V.pharmax.local |
-| Certificate Thumbprint | A9470E4EBEED26CB71BD870E6E1E4607809E5122 |
-
-
Table 32 - Certificate Management - HORIZON-CS-01V.PHARMAX.LOCAL
-
4.4 Product Licensing and Usage
The following section details the product license and usage information for HORIZON-CS-01V.PHARMAX.LOCAL server.
4.4.1 Licensing
-
-| Is Licensed | No |
-| License Key | Z428Q-XXXXX-XXXXX-XXXXX-C9K30 |
-| License Expiration | 4/10/2024 |
-| Composer enabled | No |
-| Desktop Launching enabled | Yes |
-| Application Launching enabled | Yes |
-| Instant Clone enabled | Yes |
-| Helpdesk enabled | Yes |
-| Collaboration enabled | Yes |
-| License Edition | HORIZON_ENTERPRISE_CONCURRENT_USER |
-| License Usage Model | CONCURRENT_USER |
-| License Mode | DEFAULT |
-| Grace Period Days | -196 |
-| Subscription Slice Expiry | -- |
-| License Health | -- |
-
-
Table 33 - Licensing - HORIZON-CS-01V.PHARMAX.LOCAL
-
4.4.2 Usage
-| Name | Current Usage | Highest Usage |
-| Total Concurrent Connections | 0 | 1 |
-| Total Named Users | 17 | -- |
-| Total Concurrent Sessions | 0 | 1 |
-| Concurrent Full Vm Sessions | 0 | 1 |
-| Concurrent Linked Clone Sessions | 0 | 0 |
-| Concurrent Unmanaged Vm Sessions | 0 | 1 |
-| Concurrent Application Sessions | 0 | 1 |
-| Concurrent Collaborative Sessions | 0 | 0 |
-| Total Collaborators | 0 | 0 |
-
-
Table 34 - Usage - HORIZON-CS-01V.PHARMAX.LOCAL
-
4.4.3 Customer Experience Program
-
-| CEIP Enabled | Yes |
-| Company Size | SIZE_1_100 |
-| Geolocation | AMERICA_NORTH |
-| Vertical | SERVICES |
-
-
Table 35 - Customer Experience Program - HORIZON-CS-01V.PHARMAX.LOCAL
-
4.5 Global Settings
The following section details the Global Settings configuration for HORIZON-CS-01V.PHARMAX.LOCAL server.
4.5.1 General Settings
-
-| Client Session Time Out Policy | NEVER |
-| Client Max Session Time Minutes | 600 |
-| Client Idle Session Timeout Policy | NEVER |
-| Client Idle Session Timeout Minutes | -- |
-| Client Session Timeout Minutes | 1200 |
-| Desktop SSO Timeout Policy | ALWAYS_ENABLED |
-| Desktop SSO Timeout Minutes | -- |
-| Application SSO Timeout Policy | ALWAYS_ENABLED |
-| Application SSO Timeout Minutes | -- |
-| View API Session Timeout Minutes | 10 |
-| Pre-Login Message | -- |
-| Display Warning Before Forced Logoff | Yes |
-| Forced Logoff Timeout Minutes | 5 |
-| Forced Logoff Message | Your desktop is scheduled for an important update and will shut down in 5 minutes. Please save any unsaved work now |
-| Enable Server in Single User Mode | No |
-| Store CAL on Broker | Yes |
-| Store CAL on Client | Yes |
-| Enable UI User Name Caching | Yes |
-| Console Session Timeout in Minutes | 30 |
-| Enable Automatic Status Updates | No |
-| Send Domain List | Yes |
-| Enable Credential Cleanup for HTML Access | No |
-| Hide Server Information In Client | No |
-| Hide Domain List In Client | No |
-| Enable Multi Factor Reauthentication | No |
-| Disconnect Warning Time | 0 |
-| Disconnect Warning Message | Your virtual session is going to be logged off. Please save your work. |
-| Disconnect Message | Your session has expired. Please re-connect to the portal and restart the session. |
-| Display Pre-login Admin Banner | No |
-| Pre-Login Admin Banner Header | Attention |
-| Pre-Login Admin Banner Message | On proceeding, you agree that you fully comply with the laws of this organisation. |
-| Enforce CSRF Protection | -- |
-| Enforce E2E Encryption | No |
-
-
Table 36 - Global Settings - HORIZON-CS-01V.PHARMAX.LOCAL
-
4.5.2 Security Settings
-
-| Reauthenticate Secure Tunnel After Interruption | No |
-| Disallow Enhanced Security Mode | No |
-| No Managed Certs | No |
-| Message Security Mode | ENHANCED |
-| Message Security Status | ENHANCED |
-| Enable IP Sec for Security Server Pairing | No |
-
-
Table 37 - Security Settings - HORIZON-CS-01V.PHARMAX.LOCAL
-
4.5.3 Client Restriction Settings
-| Type | Version | Warn Specific Versions | Block Specific Versions |
-| WINDOWS | -- | 5.5.0 | -- |
-| CHROME | -- | 5.5.0 | -- |
-| ANDROID | -- | 5.5.0 | -- |
-| IOS | -- | 5.5.0 | -- |
-| MAC | -- | 5.5.0 | -- |
-
-
Table 38 - Client Restriction Settings - HORIZON-CS-01V.PHARMAX.LOCAL
-
4.6 Administrators
4.6.1 Administrators and Groups
The following section details the configuration of Administrators and Groups for HORIZON-CS-01V.PHARMAX.LOCAL server.
-| Display Name | Type | Permission Role |
-| pharmax.local\12-051-distlist1 | Group | Local, Administrators, (Read, only) |
-| pharmax.local\4256122656SA | User | Inventory, Administrators |
-| pharmax.local\4362712809SA | User | Inventory, Administrators, (Read, only) |
-| pharmax.local\AD - SRM Admin Group | Group | Inventory, Administrators |
-| pharmax.local\Administrator | User | Administrators, |
-| pharmax.local\Domain Admins | Group | PHARMAX-God-Admin, |
-| pharmax.local\horizon-ic | User | Administrators, (Read, only), |
-| pharmax.local\jocolon | User | Local, Administrators, , Help, Desk, Inventory |
-
-
Table 39 - Administrators and Groups - HORIZON-CS-01V.PHARMAX.LOCAL
-
4.6.1.1 Administrators Users and Groups Details for Jonathan A. Colon Feliciano
Jonathan A. Colon Feliciano
-
-| Name | Jonathan A. Colon Feliciano |
-| First Name | Jonathan |
-| Last Name | Colon Feliciano |
-| Login Name | jocolon |
-| Display Name | pharmax.local\jocolon |
-| Long Display Name | jocolon@pharmax.local (Jonathan A. Colon Feliciano) |
-| Is Assignment a Group of User | User |
-| Domain | pharmax.local |
-| AD Distinguished Name | CN=Jonathan A. Colon Feliciano,CN=Users,DC=pharmax,DC=local |
-| Email | jocolon@pharmax.local |
-| Kiosk User | No |
-| Un-Authenticated User | -- |
-| Phone Number | -- |
-| Description | -- |
-| in Folder | -- |
-| UPN | jocolon@pharmax.local |
-| Permission Role | Local, Administrators, , Help, Desk, Inventory |
-
-
Table 40 - Administrator - Jonathan A. Colon Feliciano
-
4.6.1.2 Administrators Users and Groups Details for Administrator
Administrator
-
-| Name | Administrator |
-| First Name | -- |
-| Last Name | -- |
-| Login Name | Administrator |
-| Display Name | pharmax.local\Administrator |
-| Long Display Name | Administrator@pharmax.local (Administrator) |
-| Is Assignment a Group of User | User |
-| Domain | pharmax.local |
-| AD Distinguished Name | CN=Administrator,CN=Users,DC=pharmax,DC=local |
-| Email | -- |
-| Kiosk User | No |
-| Un-Authenticated User | -- |
-| Phone Number | -- |
-| Description | -- |
-| in Folder | -- |
-| UPN | Administrator@pharmax.local |
-| Permission Role | Administrators, |
-
-
Table 41 - Administrator - Administrator
-
4.6.1.3 Administrators Users and Groups Details for Domain Admins
Domain Admins
-
-| Name | Domain Admins |
-| First Name | -- |
-| Last Name | -- |
-| Login Name | Domain Admins |
-| Display Name | pharmax.local\Domain Admins |
-| Long Display Name | Domain Admins/pharmax.local |
-| Is Assignment a Group of User | Group |
-| Domain | pharmax.local |
-| AD Distinguished Name | CN=Domain Admins,CN=Users,DC=pharmax,DC=local |
-| Email | -- |
-| Kiosk User | No |
-| Un-Authenticated User | -- |
-| Phone Number | -- |
-| Description | -- |
-| in Folder | -- |
-| UPN | -- |
-| Permission Role | PHARMAX-God-Admin, |
-
-
Table 42 - Administrator - Domain Admins
-
4.6.1.4 Administrators Users and Groups Details for 12-051-distlist1
12-051-distlist1
-
-| Name | 12-051-distlist1 |
-| First Name | -- |
-| Last Name | -- |
-| Login Name | 12-051-distlist1 |
-| Display Name | pharmax.local\12-051-distlist1 |
-| Long Display Name | 12-051-distlist1/pharmax.local |
-| Is Assignment a Group of User | Group |
-| Domain | pharmax.local |
-| AD Distinguished Name | CN=12-051-distlist1,OU=Devices,OU=ESM,OU=Tier 1,DC=pharmax,DC=local |
-| Email | -- |
-| Kiosk User | No |
-| Un-Authenticated User | -- |
-| Phone Number | -- |
-| Description | -- |
-| in Folder | -- |
-| UPN | -- |
-| Permission Role | Local, Administrators, (Read, only) |
-
-
Table 43 - Administrator - 12-051-distlist1
-
4.6.1.5 Administrators Users and Groups Details for 4362712809SA
4362712809SA
-
-| Name | 4362712809SA |
-| First Name | -- |
-| Last Name | 4362712809SA |
-| Login Name | 4362712809SA |
-| Display Name | pharmax.local\4362712809SA |
-| Long Display Name | 4362712809SA@pharmax.local (4362712809SA) |
-| Is Assignment a Group of User | User |
-| Domain | pharmax.local |
-| AD Distinguished Name | CN=4362712809SA,OU=Test,OU=AWS,OU=Tier 2,DC=pharmax,DC=local |
-| Email | -- |
-| Kiosk User | No |
-| Un-Authenticated User | -- |
-| Phone Number | -- |
-| Description | -- |
-| in Folder | -- |
-| UPN | 4362712809SA@pharmax.local |
-| Permission Role | Inventory, Administrators, (Read, only) |
-
-
Table 44 - Administrator - 4362712809SA
-
4.6.1.6 Administrators Users and Groups Details for AD - SRM Admin Group
AD - SRM Admin Group
-
-| Name | AD - SRM Admin Group |
-| First Name | -- |
-| Last Name | -- |
-| Login Name | AD - SRM Admin Group |
-| Display Name | pharmax.local\AD - SRM Admin Group |
-| Long Display Name | AD - SRM Admin Group/pharmax.local |
-| Is Assignment a Group of User | Group |
-| Domain | pharmax.local |
-| AD Distinguished Name | CN=AD - SRM Admin Group,CN=Users,DC=pharmax,DC=local |
-| Email | -- |
-| Kiosk User | No |
-| Un-Authenticated User | -- |
-| Phone Number | -- |
-| Description | -- |
-| in Folder | -- |
-| UPN | -- |
-| Permission Role | Inventory, Administrators |
-
-
Table 45 - Administrator - AD - SRM Admin Group
-
4.6.1.7 Administrators Users and Groups Details for VMware IC Account
VMware IC Account
-
-| Name | VMware IC Account |
-| First Name | VMware IC Account |
-| Last Name | -- |
-| Login Name | horizon-ic |
-| Display Name | pharmax.local\horizon-ic |
-| Long Display Name | horizon-ic@pharmax.local (VMware IC Account) |
-| Is Assignment a Group of User | User |
-| Domain | pharmax.local |
-| AD Distinguished Name | CN=VMware IC Account,CN=Users,DC=pharmax,DC=local |
-| Email | -- |
-| Kiosk User | No |
-| Un-Authenticated User | -- |
-| Phone Number | -- |
-| Description | -- |
-| in Folder | -- |
-| UPN | horizon-ic@pharmax.local |
-| Permission Role | Administrators, (Read, only), |
-
-
Table 46 - Administrator - VMware IC Account
-
4.6.1.8 Administrators Users and Groups Details for 4256122656SA
4256122656SA
-
-| Name | 4256122656SA |
-| First Name | -- |
-| Last Name | 4256122656SA |
-| Login Name | 4256122656SA |
-| Display Name | pharmax.local\4256122656SA |
-| Long Display Name | 4256122656SA@pharmax.local (4256122656SA) |
-| Is Assignment a Group of User | User |
-| Domain | pharmax.local |
-| AD Distinguished Name | CN=4256122656SA,OU=Test,OU=AWS,OU=Tier 2,DC=pharmax,DC=local |
-| Email | -- |
-| Kiosk User | No |
-| Un-Authenticated User | -- |
-| Phone Number | -- |
-| Description | -- |
-| in Folder | -- |
-| UPN | 4256122656SA@pharmax.local |
-| Permission Role | Inventory, Administrators |
-
-
Table 47 - Administrator - 4256122656SA
-
4.6.2 Role Privileges
The following section details the Role Privileges information for HORIZON-CS-01V.PHARMAX.LOCAL server.
-| Name | Description |
-| Administrators | Administration users with full administrative rights |
-| Administrators (Read only) | Administration users with full read-only administrative rights |
-| Agent Registration Administrators | Administration users with rights to register View agents. |
-| Global Configuration and Policy Administrators | Administration users with rights for global and per Connection Server configuration settings. |
-| Global Configuration and Policy Administrators (Read Only) | Administration users with read only rights for global and per Connection Server configuration settings. |
-| Help Desk Administrators | Administration users with rights for Help Desk portal management. |
-| Help Desk Administrators (Read Only) | Administration users with rights for Help Desk portal view. |
-| Horizon Cloud Service | Allows subscription license activation and monitoring from horizon cloud. |
-| Inventory Administrators | Administration users with rights for inventory management. |
-| Inventory Administrators (Read only) | Administration users with rights to read inventory. |
-| Local Administrators | Administration users with rights on Local POD. |
-| Local Administrators (Read only) | Administration users with Read only rights on Local POD. |
-| PHARMAX-God-Admin | -- |
-
-
Table 48 - Role Privileges - HORIZON-CS-01V.PHARMAX.LOCAL
-
4.6.3 Role Privileges Details
The following section details the Role Privilege details for information for HORIZON-CS-01V.PHARMAX.LOCAL server.
-| Name | Description |
-| Administrators | ADMINISTRATOR
-ADMINISTRATOR_VIEW
-CAPACITY_PROVIDER_CONFIG_MANAGEMENT
-CAPACITY_PROVIDER_CONFIG_VIEW
-CLOUD_ADMIN
-CLOUD_ON_BOARDING_MANAGEMENT
-CLOUD_OPS_MANAGEMENT
-CVP_INTERACTIVE
-CVP_MANAGEMENT
-CVP_OWNERSHIP
-CVP_VIEW
-FEDERATED_LDAP_MANAGE
-FEDERATED_LDAP_VIEW
-FEDERATED_SESSIONS_MANAGE
-FEDERATED_SESSIONS_VIEW
-FOLDER_MANAGEMENT
-FOLDER_VIEW
-GLOBAL_ADMINISTRATOR
-GLOBAL_ADMINISTRATOR_VIEW
-GLOBAL_ADMIN_SDK_INTERACTIVE
-GLOBAL_ADMIN_UI_INTERACTIVE
-GLOBAL_CONFIG_MANAGEMENT
-GLOBAL_CONFIG_VIEW
-GLOBAL_CVP_PUBLICATION
-GLOBAL_CVP_REGISTER
-GLOBAL_MACHINE_REGISTER
-GLOBAL_PERMISSION_MANAGEMENT
-GLOBAL_PERMISSION_VIEW
-GLOBAL_ROLE_MANAGEMENT
-GLOBAL_ROLE_PERMISSION_MANAGEMENT
-GLOBAL_ROLE_VIEW
-HELPDESK_ADMINISTRATOR
-HELPDESK_ADMINISTRATOR_VIEW
-HORIZON_CLOUD_SERVICE
-INVENTORY_ADMINISTRATOR
-INVENTORY_ADMINISTRATOR_VIEW
-LOCAL_ADMINISTRATOR
-LOCAL_ADMINISTRATOR_VIEW
-MACHINE_MAINTENANCE
-MACHINE_MANAGEMENT
-MACHINE_MANAGE_OFFLINE_SESSION
-MACHINE_MANAGE_VDI_SESSION
-MACHINE_REBOOT
-MACHINE_SHUTDOWN
-MACHINE_USER_MANAGEMENT
-MACHINE_VIEW
-MANAGE_REMOTE_PROCESS
-POOL_ENABLE
-POOL_ENTITLE
-POOL_MANAGEMENT
-POOL_SVI_IMAGE_MANAGEMENT
-POOL_VIEW
-REMOTE_ASSISTANCE
-SUBSCRIPTION_LICENSE_ADD
-UDD_MANAGEMENT
-UDD_VIEW
-VC_CONFIG_VIEW |
-| Administrators (Read only) | ADMINISTRATOR_VIEW
-CAPACITY_PROVIDER_CONFIG_VIEW
-CVP_VIEW
-FEDERATED_LDAP_VIEW
-FEDERATED_SESSIONS_VIEW
-FOLDER_VIEW
-GLOBAL_ADMINISTRATOR_VIEW
-GLOBAL_ADMIN_SDK_INTERACTIVE
-GLOBAL_ADMIN_UI_INTERACTIVE
-GLOBAL_CONFIG_VIEW
-GLOBAL_PERMISSION_VIEW
-GLOBAL_ROLE_VIEW
-HELPDESK_ADMINISTRATOR_VIEW
-INVENTORY_ADMINISTRATOR_VIEW
-LOCAL_ADMINISTRATOR_VIEW
-MACHINE_VIEW
-POOL_VIEW
-UDD_VIEW
-VC_CONFIG_VIEW |
-| Agent Registration Administrators | GLOBAL_MACHINE_REGISTER |
-| Global Configuration and Policy Administrators | GLOBAL_ADMIN_UI_INTERACTIVE
-GLOBAL_CONFIG_MANAGEMENT
-GLOBAL_CONFIG_VIEW
-GLOBAL_CVP_PUBLICATION |
-| Global Configuration and Policy Administrators (Read Only) | GLOBAL_ADMIN_UI_INTERACTIVE
-GLOBAL_CONFIG_VIEW |
-| Help Desk Administrators | CVP_VIEW
-FEDERATED_LDAP_VIEW
-FEDERATED_SESSIONS_MANAGE
-FEDERATED_SESSIONS_VIEW
-FOLDER_VIEW
-GLOBAL_ADMIN_UI_INTERACTIVE
-GLOBAL_CONFIG_VIEW
-HELPDESK_ADMINISTRATOR
-HELPDESK_ADMINISTRATOR_VIEW
-MACHINE_MAINTENANCE
-MACHINE_MANAGEMENT
-MACHINE_MANAGE_OFFLINE_SESSION
-MACHINE_MANAGE_VDI_SESSION
-MACHINE_REBOOT
-MACHINE_SHUTDOWN
-MACHINE_USER_MANAGEMENT
-MACHINE_VIEW
-MANAGE_REMOTE_PROCESS
-POOL_VIEW
-REMOTE_ASSISTANCE
-UDD_VIEW |
-| Help Desk Administrators (Read Only) | CVP_VIEW
-FEDERATED_LDAP_VIEW
-FEDERATED_SESSIONS_VIEW
-FOLDER_VIEW
-GLOBAL_ADMIN_UI_INTERACTIVE
-GLOBAL_CONFIG_VIEW
-HELPDESK_ADMINISTRATOR_VIEW
-MACHINE_VIEW
-POOL_VIEW
-UDD_VIEW |
-| Horizon Cloud Service | CLOUD_ADMIN
-GLOBAL_ADMIN_SDK_INTERACTIVE
-GLOBAL_CONFIG_VIEW
-GLOBAL_CVP_REGISTER
-HORIZON_CLOUD_SERVICE
-POOL_VIEW
-SUBSCRIPTION_LICENSE_ADD |
-| Inventory Administrators | CVP_MANAGEMENT
-CVP_OWNERSHIP
-CVP_VIEW
-FOLDER_VIEW
-GLOBAL_ADMIN_UI_INTERACTIVE
-INVENTORY_ADMINISTRATOR
-INVENTORY_ADMINISTRATOR_VIEW
-MACHINE_MAINTENANCE
-MACHINE_MANAGEMENT
-MACHINE_MANAGE_OFFLINE_SESSION
-MACHINE_MANAGE_VDI_SESSION
-MACHINE_REBOOT
-MACHINE_SHUTDOWN
-MACHINE_USER_MANAGEMENT
-MACHINE_VIEW
-MANAGE_REMOTE_PROCESS
-POOL_ENABLE
-POOL_ENTITLE
-POOL_MANAGEMENT
-POOL_SVI_IMAGE_MANAGEMENT
-POOL_VIEW
-REMOTE_ASSISTANCE
-UDD_MANAGEMENT
-UDD_VIEW
-VC_CONFIG_VIEW |
-| Inventory Administrators (Read only) | CVP_VIEW
-FOLDER_VIEW
-GLOBAL_ADMIN_UI_INTERACTIVE
-INVENTORY_ADMINISTRATOR_VIEW
-MACHINE_VIEW
-POOL_VIEW
-UDD_VIEW
-VC_CONFIG_VIEW |
-| Local Administrators | CAPACITY_PROVIDER_CONFIG_MANAGEMENT
-CAPACITY_PROVIDER_CONFIG_VIEW
-CLOUD_ADMIN
-CLOUD_ON_BOARDING_MANAGEMENT
-CLOUD_OPS_MANAGEMENT
-CVP_INTERACTIVE
-CVP_MANAGEMENT
-CVP_OWNERSHIP
-CVP_VIEW
-FOLDER_MANAGEMENT
-FOLDER_VIEW
-GLOBAL_ADMIN_SDK_INTERACTIVE
-GLOBAL_ADMIN_UI_INTERACTIVE
-GLOBAL_CONFIG_MANAGEMENT
-GLOBAL_CONFIG_VIEW
-GLOBAL_CVP_PUBLICATION
-GLOBAL_CVP_REGISTER
-GLOBAL_MACHINE_REGISTER
-GLOBAL_PERMISSION_VIEW
-GLOBAL_ROLE_VIEW
-INVENTORY_ADMINISTRATOR
-INVENTORY_ADMINISTRATOR_VIEW
-LOCAL_ADMINISTRATOR
-LOCAL_ADMINISTRATOR_VIEW
-MACHINE_MAINTENANCE
-MACHINE_MANAGEMENT
-MACHINE_MANAGE_OFFLINE_SESSION
-MACHINE_MANAGE_VDI_SESSION
-MACHINE_REBOOT
-MACHINE_SHUTDOWN
-MACHINE_USER_MANAGEMENT
-MACHINE_VIEW
-MANAGE_REMOTE_PROCESS
-POOL_ENABLE
-POOL_ENTITLE
-POOL_MANAGEMENT
-POOL_SVI_IMAGE_MANAGEMENT
-POOL_VIEW
-REMOTE_ASSISTANCE
-SUBSCRIPTION_LICENSE_ADD
-UDD_MANAGEMENT
-UDD_VIEW
-VC_CONFIG_VIEW |
-| Local Administrators (Read only) | CAPACITY_PROVIDER_CONFIG_VIEW
-CVP_VIEW
-FOLDER_VIEW
-GLOBAL_ADMIN_SDK_INTERACTIVE
-GLOBAL_ADMIN_UI_INTERACTIVE
-GLOBAL_CONFIG_VIEW
-GLOBAL_PERMISSION_VIEW
-GLOBAL_ROLE_VIEW
-INVENTORY_ADMINISTRATOR_VIEW
-LOCAL_ADMINISTRATOR_VIEW
-MACHINE_VIEW
-POOL_VIEW
-UDD_VIEW
-VC_CONFIG_VIEW |
-| PHARMAX-God-Admin | CVP_VIEW
-FEDERATED_LDAP_MANAGE
-FEDERATED_LDAP_VIEW
-FEDERATED_SESSIONS_MANAGE
-FEDERATED_SESSIONS_VIEW
-FOLDER_MANAGEMENT
-FOLDER_VIEW
-GLOBAL_ADMIN_SDK_INTERACTIVE
-GLOBAL_ADMIN_UI_INTERACTIVE
-GLOBAL_CONFIG_MANAGEMENT
-GLOBAL_CONFIG_VIEW
-GLOBAL_CVP_PUBLICATION
-GLOBAL_MACHINE_REGISTER
-GLOBAL_PERMISSION_MANAGEMENT
-GLOBAL_PERMISSION_VIEW
-GLOBAL_ROLE_MANAGEMENT
-GLOBAL_ROLE_PERMISSION_MANAGEMENT
-GLOBAL_ROLE_VIEW
-HELPDESK_ADMINISTRATOR_VIEW
-LOG_COLLECTION
-MACHINE_MAINTENANCE
-MACHINE_MANAGEMENT
-MACHINE_MANAGE_OFFLINE_SESSION
-MACHINE_MANAGE_VDI_SESSION
-MACHINE_REBOOT
-MACHINE_SHUTDOWN
-MACHINE_USER_MANAGEMENT
-MACHINE_VIEW
-MANAGE_REMOTE_PROCESS
-POOL_ENABLE
-POOL_ENTITLE
-POOL_MANAGEMENT
-POOL_SVI_IMAGE_MANAGEMENT
-POOL_VIEW
-REMOTE_ASSISTANCE
-UDD_VIEW
-VC_CONFIG_VIEW |
-
-
Table 49 - Role Privileges Details - Inventory Administrators (Read only)
-
4.6.4 Role Permissions
The following section details the Role Permissions information for HORIZON-CS-01V.PHARMAX.LOCAL server.
-| User or Group Name | Role | Access Group |
-| 12-051-distlist1 | Local Administrators (Read only) | /Root/Gurabo-Sites |
-| 4256122656SA | Inventory Administrators | /Root/Gurabo-Sites |
-| 4362712809SA | Inventory Administrators (Read only) | /Root/CISA |
-| AD - SRM Admin Group | Inventory Administrators | /Root/Prueba |
-| Administrator | Administrators | /Root |
-| Domain Admins | PHARMAX-God-Admin | /Root |
-| Jonathan A. Colon Feliciano | Local Administrators | /Root/Gurabo-Sites |
-| Jonathan A. Colon Feliciano | Inventory Administrators | /Root |
-| Jonathan A. Colon Feliciano | Help Desk Administrators | /Root |
-| VMware IC Account | Administrators (Read only) | /Root |
-
-
Table 50 - Role Permissions - HORIZON-CS-01V.PHARMAX.LOCAL
-
4.6.5 Access Groups
The following section summarizes the configuration of Access Groups for HORIZON-CS-01V.PHARMAX.LOCAL server.
-| Name | Description |
-| CISA | -- |
-| Gurabo-Sites | -- |
-| Prueba | Prueba Description |
-| Root | ROOT FOLDER |
-
-
Table 51 - Access Groups - HORIZON-CS-01V.PHARMAX.LOCAL
-
4.6.5.1 Access Groups Details
Root
-| Name | Permissions |
-| Administrator | Administrators |
-| Domain Admins | PHARMAX-God-Admin |
-| Jonathan A. Colon Feliciano | Local Administrators, Help Desk Administrators, Inventory Administrators |
-| VMware IC Account | Administrators (Read only) |
-
-
Table 52 - Access Groups - Root
-
CISA
-| Name | Permissions |
-| 4362712809SA | Inventory Administrators (Read only) |
-
-
Table 53 - Access Groups - CISA
-
Prueba
-| Name | Permissions |
-| AD - SRM Admin Group | Inventory Administrators |
-
-
Table 54 - Access Groups - Prueba
-
Gurabo-Sites
-| Name | Permissions |
-| 12-051-distlist1 | Local Administrators (Read only) |
-| 4256122656SA | Inventory Administrators |
-| Jonathan A. Colon Feliciano | Local Administrators, Help Desk Administrators, Inventory Administrators |
-
-
Table 55 - Access Groups - Gurabo-Sites
-
4.6.6 Federation Access Groups
The following section details the Federation Access Group information for HORIZON-CS-01V.PHARMAX.LOCAL server.
-| User or Group Name | Role | Global Access Group |
-| Administrator | Administrators | Root |
-| Domain Admins | PHARMAX-God-Admin | Root |
-| Jonathan A. Colon Feliciano | Help Desk Administrators | Root |
-| VMware IC Account | Administrators (Read only) | Root |
-
-
Table 56 - Role Permissions - HORIZON-CS-01V.PHARMAX.LOCAL
-
4.7 Cloud Pod Architecture
The following section details on the cloud pod architecture information for HORIZON-CS-01V.PHARMAX.LOCAL.
-
-| Pod Name | Cluster-HORIZON-CS-01V |
-| Pod Local | Yes |
-| Pod Site | PHARMAX-HQ |
-| Pod Description | -- |
-| Pod Cloud Managed | No |
-| Pod Connection Servers | HORIZON-CS-01V HORIZON-CS-02V
|
-| Pod Active Global Entitlements | -- |
-| Pod Active Global Application Entitlements | -- |
-
-
Table 57 - Cloud Pod Architecture - HORIZON-CS-01V.PHARMAX.LOCAL
-
4.8 Site
The following section details on the Cloud Pod Site information for HORIZON-CS-01V.PHARMAX.LOCAL.
-
-| Cloud Pod Sites Name | PHARMAX-HQ |
-| Cloud Pod Sites Description | -- |
-| Cloud Pod Site Pod Name | Cluster-HORIZON-CS-01V |
-
-
-
4.9 Event Configuration
The following section details on the events configuration information for HORIZON-CS-01V.PHARMAX.LOCAL.
4.9.1 Event Database
-
-| Server | horizon-sql-01v |
-| Type | SQLSERVER |
-| Port | 1433 |
-| Name | HZ-Event-DB |
-| User Name | hz-event-user |
-| Table Prefix | PHM |
-| Show Events for | THREE_MONTHS |
-| Classify Events as New for | 2 Days |
-| Timing Profiler Events | 7 Days |
-| Enabled | Yes |
-
-
Table 58 - Event Database - HORIZON-CS-01V
-
4.9.2 Syslog Configuration
-| Server | Port |
-| 10.10.10.33 | 514 |
-| 192.168.5.1 | 514 |
-
-
Table 59 - Syslog Configuration - HORIZON-CS-01V
-
4.9.3 Events to File System
-
-| Enabled | Yes |
-| Enabled on Error | No |
-| Path | \\192.168.5.1\WsusContent\HorizonEvents |
-| User name | administrator |
-| Domain | pharmax.local |
-
-
Table 60 - Events to File System - HORIZON-CS-01V
-
4.10 Global Policies
The following section details on the Global Policies information for HORIZON-CS-01V.PHARMAX.LOCAL.
-
-| Allow Multimedia Redirection | Deny |
-| Allow USB Access | Allow |
-| Allow Remote Mode | Allow |
-| Allow PCoIP Hardware Acceleration | Allow |
-| PCoIP Hardware Acceleration Priority | Medium |
-
-
Table 61 - Global Policies - HORIZON-CS-01V.PHARMAX.LOCAL
-
-
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZADDomain.ps1 b/1.1.5/Src/Private/Get-AbrHRZADDomain.ps1
deleted file mode 100644
index d02a904..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZADDomain.ps1
+++ /dev/null
@@ -1,70 +0,0 @@
-function Get-AbrHRZADDomain {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
- begin {
- Write-PScriboMessage "ADDomains InfoLevel set at $($InfoLevel.Settings.Servers.vCenterServers.ADDomains)."
- Write-PScriboMessage "Collecting Active Directory Domain information."
- }
- process {
- try {
- if ($Domains) {
- if ($InfoLevel.Settings.Servers.vCenterServers.ADDomains -ge 1) {
- Section -Style Heading4 "Active Directory Domains" {
- Paragraph "The following section summarizes the configuration of Active Directory Domains for $($HVEnvironment.split('.')[0]) server."
- BlankLine
- $OutObj = @()
- foreach ($Domain in $Domains) {
- try {
- Write-PScriboMessage "Discovered Domain Information $($Domain.DNSName)."
- $inObj = [ordered] @{
- 'Domain DNS Name' = $Domain.DNSName
- 'Status' = $Domain.ConnectionServerState[0].Status
- 'Trust Relationship' = $Domain.ConnectionServerState[0].TrustRelationship
- 'Connection Status' = $Domain.ConnectionServerState[0].Contactable
- }
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- if ($HealthCheck.DataStores.Status) {
- $OutObj | Where-Object { $_.'Status' -eq 'ERROR' } | Set-Style -Style Warning
- }
- $TableParams = @{
- Name = "Active Directory Domains - $($HVEnvironment.split(".").toUpper()[0])"
- List = $false
- ColumnWidths = 25, 25, 25, 25
- }
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Sort-Object -Property 'Name' | Table @TableParams
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZAccessGroup.ps1 b/1.1.5/Src/Private/Get-AbrHRZAccessGroup.ps1
deleted file mode 100644
index 43dd353..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZAccessGroup.ps1
+++ /dev/null
@@ -1,131 +0,0 @@
-function Get-AbrHRZAccessGroup {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "AccessGroup InfoLevel set at $($InfoLevel.Settings.Administrators.AccessGroup)."
- Write-PScriboMessage "Collecting Access Group information."
- }
-
- process {
- try {
- if ($AccessGroups) {
- if ($InfoLevel.Settings.Administrators.AccessGroup -ge 1) {
- Section -Style Heading3 "Access Groups" {
- Paragraph "The following section summarizes the configuration of Access Groups for $($HVEnvironment.toUpper()) server."
- BlankLine
- $OutObj = @()
- $AccessGroupJoined = @()
- $AccessGroupJoined += $AccessGroups
- $AccessGroupJoined += $AccessGroups.Children
- foreach ($AccessGroup in $AccessGroupJoined) {
- Write-PScriboMessage "Discovered $($AccessGroup.base.Name) Access Groups Information."
- $inObj = [ordered] @{
- 'Name' = $AccessGroup.base.Name
- 'Description' = $AccessGroup.base.Description
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
-
- $TableParams = @{
- Name = "Access Groups - $($HVEnvironment.toUpper())"
- List = $false
- ColumnWidths = 35, 65
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Sort-Object -Property 'Name' | Table @TableParams
- try {
- if ($InfoLevel.Settings.Administrators.AccessGroup -ge 2) {
- Section -Style Heading4 "Access Groups Details" {
- $AccessGroupJoined = @()
- $AccessGroupJoined += $AccessGroups
- $AccessGroupJoined += $AccessGroups.Children
- foreach ($AccessGroup in $AccessGroupJoined) {
- Write-PScriboMessage "Discovered $($AccessGroup.base.Name) Access Groups Detailed Information."
- $AdministratorIDNameResults = @()
- # Find Administrator ID Name
- foreach ($AccessGroupID in $AccessGroup.data.Permissions.id) {
- foreach ($Permission in $Permissions) {
- if ($AccessGroupID -eq $Permission.id.id) {
- foreach ($PermissionGroup in $Permission.base.UserOrGroup.id) {
- foreach ($Administrator in $Administrators) {
- if ($Administrator.Id.id -eq $PermissionGroup) {
- $AdministratorIDNameResults += $Administrator.base.name
- break
- }
- }
- $AdministratorIDName = $AdministratorIDNameResults
- }
- }
- }
- }
- if ($AdministratorIDName) {
- Section -ExcludeFromTOC -Style NOTOCHeading5 $AccessGroup.base.Name {
- $OutObj = @()
- foreach ($Principal in ($AdministratorIDName | Select-Object -Unique)) {
- $PrincipalPermissionsName = @()
- $PrincipalID = ($Administrators | Where-Object { $_.Base.Name -eq $Principal }).Id.Id
- $PrincipalPermissions = ($Permissions.Base | Where-Object { $_.UserOrGroup.Id -eq $PrincipalID }).Role.Id
- foreach ($PrincipalPermission in $PrincipalPermissions) {
- $PrincipalPermissionsName += $(($Roles | Where-Object { $_.Id.id -eq $PrincipalPermission }).Base.Name)
- }
-
- $inObj = [ordered] @{
- 'Name' = $Principal
- 'Permissions' = [string](($PrincipalPermissionsName | Select-Object -Unique) -join ', ')
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
-
- $TableParams = @{
- Name = "Access Groups - $($AccessGroup.base.Name)"
- List = $false
- ColumnWidths = 35, 65
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Sort-Object -Property 'Name' | Table @TableParams
- }
- }
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
diff --git a/1.1.5/Src/Private/Get-AbrHRZAdminGroup.ps1 b/1.1.5/Src/Private/Get-AbrHRZAdminGroup.ps1
deleted file mode 100644
index dfe0395..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZAdminGroup.ps1
+++ /dev/null
@@ -1,160 +0,0 @@
-function Get-AbrHRZAdminGroup {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "Administrators InfoLevel set at $($InfoLevel.Settings.Administrators.AdministratorsandGroups)."
- Write-PScriboMessage "Collecting Registered Machines information."
- }
-
- process {
- try {
- if ($Administrators) {
- if ($InfoLevel.Settings.Administrators.AdministratorsandGroups -ge 1) {
- Section -Style Heading3 "Administrators and Groups" {
- Paragraph "The following section details the configuration of Administrators and Groups for $($HVEnvironment.toUpper()) server."
- BlankLine
- $OutObj = @()
- foreach ($Administrator in $Administrators) {
- $RoleIDNameResults = ''
- foreach ($Permission in $Permissions) {
- if ($Administrator.PermissionData.Permissions.id -eq $Permission.id.id) {
- # Find Role ID Name
- $RoleIDName = ''
- $PermissionGroups = $Permission.base.Role.id
- foreach ($PermissionGroup in $PermissionGroups) {
- foreach ($Role in $Roles) {
- if ($Role.Id.id -eq $PermissionGroup) {
- $RoleIDName = $Role.base.name
- break
- }
- }
- if ($Administrator.PermissionData.Permissions.id.count -gt 1) {
- $RoleIDNameResults += "$RoleIDName, "
- $RoleIDName = $RoleIDNameResults.TrimEnd(', ')
- }
- }
- }
- }
-
- Write-PScriboMessage "Discovered Administrators and Groups Information."
- $inObj = [ordered] @{
- 'Display Name' = $Administrator.base.DisplayName
- 'Type' = Switch ($Administrator.base.Group) {
- $False { 'User' }
- $True { 'Group' }
- }
- 'Permission Role' = [string](($RoleIDName.split(', ') | Select-Object -Unique) -join ', ')
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
-
- $TableParams = @{
- Name = "Administrators and Groups - $($HVEnvironment.toUpper())"
- List = $false
- ColumnWidths = 42, 15, 43
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Sort-Object -Property 'Display Name' | Table @TableParams
- try {
- if ($InfoLevel.Settings.Administrators.AdministratorsandGroups -ge 2) {
- foreach ($Administrator in $Administrators) {
- Section -Style Heading4 "Administrators Users and Groups Details for $($Administrator.base.Name)" {
- Write-PScriboMessage "Discovered $($Administrator.base.Name) Information."
- $RoleIDNameResults = ''
- foreach ($Permission in $Permissions) {
- if ($Administrator.PermissionData.Permissions.id -eq $Permission.id.id) {
- # Find Role ID Name
- $RoleIDName = ''
- $PermissionGroups = $Permission.base.Role.id
- foreach ($PermissionGroup in $PermissionGroups) {
- foreach ($Role in $Roles) {
- if ($Role.Id.id -eq $PermissionGroup) {
- $RoleIDName = $Role.base.name
- break
- }
- }
- if ($Administrator.PermissionData.Permissions.id.count -gt 1) {
- $RoleIDNameResults += "$RoleIDName, "
- $RoleIDName = $RoleIDNameResults.TrimEnd(', ')
- }
- }
- }
- }
- Switch ($Administrator.base.Group) {
- 'True' { $Administratorbasegroup = 'Group' }
- 'False' { $Administratorbasegroup = 'User' }
- }
- Section -ExcludeFromTOC -Style NOTOCHeading6 $Administrator.Base.Name {
- $OutObj = @()
- $inObj = [ordered] @{
- 'Name' = $Administrator.base.Name
- 'First Name' = $Administrator.base.FirstName
- 'Last Name' = $Administrator.base.LastName
- 'Login Name' = $Administrator.base.LoginName
- 'Display Name' = $Administrator.base.DisplayName
- 'Long Display Name' = $Administrator.base.LongDisplayName
- 'Is Assignment a Group of User' = $Administratorbasegroup
- 'Domain' = $Administrator.base.Domain
- 'AD Distinguished Name' = $Administrator.base.AdDistinguishedName
- 'Email' = $Administrator.base.Email
- 'Kiosk User' = $Administrator.base.KioskUser
- 'Un-Authenticated User' = $Administrator.base.UnauthenticatedUser
- 'Phone Number' = $Administrator.base.Phone
- 'Description' = $Administrator.base.Description
- 'in Folder' = $Administrator.base.InFolder
- 'UPN' = $Administrator.base.UserPrincipalName
- 'Permission Role' = [string](($RoleIDName.split(', ') | Select-Object -Unique) -join ', ')
- }
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
-
- $TableParams = @{
- Name = "Administrator - $($Administrator.base.Name)"
- List = $true
- ColumnWidths = 40, 60
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZApplicationPool.ps1 b/1.1.5/Src/Private/Get-AbrHRZApplicationPool.ps1
deleted file mode 100644
index adfb120..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZApplicationPool.ps1
+++ /dev/null
@@ -1,171 +0,0 @@
-function Get-AbrHRZApplicationPool {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "Applications InfoLevel set at $($InfoLevel.Inventory.Applications)."
- Write-PScriboMessage "Collecting Applications information."
- }
-
- process {
- try {
- if ($Apps) {
- if ($InfoLevel.Inventory.Applications -ge 1) {
- Section -Style Heading3 "Application Pool" {
- Paragraph "The following section details the configuration of Application Pool for $($HVEnvironment.toUpper()) server."
- BlankLine
- $OutObj = @()
- foreach ($App in $Apps) {
- Write-PScriboMessage "Discovered Applications Information for $($App.Data.DisplayName)."
- $inObj = [ordered] @{
- 'Name' = $App.Data.DisplayName
- 'Version' = $App.ExecutionData.Version
- 'Enabled' = $App.Data.Enabled
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
-
- $TableParams = @{
- Name = "Applications - $($HVEnvironment.toUpper())"
- List = $false
- ColumnWidths = 34, 33, 33
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Sort-Object -Property 'Name' | Table @TableParams
- try {
- if ($InfoLevel.Inventory.Applications -ge 2) {
- Section -Style Heading4 "Application Pool Details" {
- foreach ($App in $Apps) {
- # Find out Farm Name for Applications
- $farmMatch = $false
- foreach ($farm in $farms) {
- if ($farm.Id.id -eq $app.executiondata.farm.id) {
- $ApplicationFarmName = $farm.data.name
- $farmMatch = $true
- }
- if ($farmMatch) {
- break
- }
- }
- # Find out Access Group for Applications
- $AccessgroupMatch = $false
- foreach ($Accessgroup in $Accessgroups) {
- if ($Accessgroup.Id.id -eq $app.accessgroup.id) {
- $AccessGroupName = $Accessgroup.base.name
- $AccessgroupMatch = $true
- }
- if ($AccessgroupMatch) {
- break
- }
- }
- # Find out Global Application Entitlement Group for Applications
- $GlobalApplicationEntitlementGroupDisplayName = ('')
- $GlobalApplicationEntitlementGroupMatch = $false
- foreach ($GlobalApplicationEntitlementGroup in $GlobalApplicationEntitlementGroups) {
- if ($GlobalApplicationEntitlementGroup.Id.id -eq $app.data.GlobalApplicationEntitlement.id) {
- $GlobalApplicationEntitlementGroupDisplayName = $GlobalApplicationEntitlementGroup.base.DisplayName
- $GlobalApplicationEntitlementGroupMatch = $true
- } else {
- $GlobalApplicationEntitlementGroupDisplayName = "No Global Application Entitlement"
- }
- if ($GlobalApplicationEntitlementGroupMatch) {
- break
- }
- }
- If ([string]::IsNullOrEmpty($App.Data.AvApplicationPackageGuid)) {
-
- $AppVolumesApp = "False"
- } else {
- $AppVolumesApp = "True"
- }
- $ApplicationFileTypes = $App.ExecutionData.FileTypes | ForEach-Object { $_.FileType }
- $ApplicationFileTypesresult = $ApplicationFileTypes -join ', '
- $OtherApplicationFileTypes = $App.ExecutionData.OtherFileTypes | ForEach-Object { $_.FileType }
- $OtherApplicationFileTypesresult = $OtherApplicationFileTypes -join ', '
-
- Section -Style NOTOCHeading5 "Application Summary - $($App.Data.DisplayName)" {
- $OutObj = @()
- Write-PScriboMessage "Discovered $($App.Data.DisplayName) Applications Information."
- $inObj = [ordered] @{
- 'Display Name' = $App.Data.DisplayName
- 'Description' = $App.Data.Description
- 'Enabled' = $App.Data.Enabled
- 'Global Application Entitlement' = $GlobalApplicationEntitlementGroupDisplayName
- 'Enable Anti Affinity Rules' = $App.Data.EnableAntiAffinityRules
- 'Anti-Affinity Patterns' = $App.Data.AntiAffinityPatterns
- 'Anti-Affinity Count' = $App.Data.AntiAffinityCount
- 'Enable Pre-Launch' = $App.Data.EnablePreLaunch
- 'Connection Server Restrictions' = $App.Data.ConnectionServerRestrictions
- 'Category Folder' = $App.Data.CategoryFolder
- 'Client Restrictions' = $App.Data.ClientRestrictions
- 'Shortcut Location' = $App.Data.ShortcutLocation
- 'Multi Session Mode' = $App.Data.MultiSessionMode
- 'Max Multi Sessions' = $App.Data.MaxMultiSessions
- 'Cloud Brokered' = $App.Data.CloudBrokered
- 'App Volumes App' = $AppVolumesApp
- 'App Volumes Package' = $App.Data.AvApplicationPackageGuid
- 'Executable Path' = $App.ExecutionData.ExecutablePath
- 'Version' = $App.ExecutionData.Version
- 'Publisher' = $App.ExecutionData.Publisher
- 'Start Folder' = $App.ExecutionData.StartFolder
- 'Argument' = $App.ExecutionData.Args
- 'Farm' = $ApplicationFarmName
- 'File Types' = $ApplicationFileTypesresult
- 'Auto Update File Types' = $App.ExecutionData.AutoUpdateFileTypes
- 'Other File Types' = $OtherApplicationFileTypesresult
- 'Auto Update Other File Types' = $App.ExecutionData.AutoUpdateFileTypes
- 'Access Group' = $AccessGroupName
- }
-
- $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
-
- $TableParams = @{
- Name = "Application Summary - $($App.Data.DisplayName)"
- List = $true
- ColumnWidths = 50, 50
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZCertMgmt.ps1 b/1.1.5/Src/Private/Get-AbrHRZCertMgmt.ps1
deleted file mode 100644
index 33b709f..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZCertMgmt.ps1
+++ /dev/null
@@ -1,77 +0,0 @@
-function Get-AbrHRZCertMgmt {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "Certificate Management InfoLevel set at $($InfoLevel.Settings.Servers.ConnectionServers.ConnectionServers)."
- Write-PScriboMessage "Collecting Certificate Management information."
- }
-
- process {
- try {
- if ($ConnectionServersHealth) {
- if ($InfoLevel.Settings.CloudPodArch.CloudPodArch -ge 1) {
- # Connection Server Health Data
- $ConnectionServerHealthData = $ConnectionServersHealth | Select-Object -First 1
-
- Section -Style Heading2 "Certificate Management" {
- Paragraph "The following section details on the certificate management information for $($HVEnvironment.toUpper())."
- BlankLine
- $OutObj = @()
- Write-PScriboMessage "Working on Certificate Information for $($ConnectionServerHealthData.Name)."
-
- $Cert = $ConnectionServerHealthData.CertificateHealth.ConnectionServerCertificate
- $Bytes = [System.Text.Encoding]::UTF8.GetBytes($Cert)
- $PodCert = [System.Security.Cryptography.X509Certificates.X509Certificate2]::new($Bytes)
-
- $inObj = [ordered] @{
- 'Self-Signed Certificate' = $ConnectionServerHealthData.DefaultCertificate
- 'Certificate Subject' = $PodCert.Subject
- 'Certificate Issuer' = $PodCert.Issuer
- 'Certificate Not Before' = $PodCert.NotBefore
- 'Certificate Not After' = $PodCert.NotAfter
- 'Certificate SANs' = $PodCert.DnsNameList
- 'Certificate Thumbprint' = $PodCert.Thumbprint
- }
- $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
- if ($HealthCheck.ConnectionServers.Status) {
- $OutObj | Where-Object { $_.'Enabled' -eq 'No' } | Set-Style -Style Warning -Property 'Enabled'
- }
- $TableParams = @{
- Name = "Certificate Management - $($HVEnvironment.toUpper())"
- List = $true
- ColumnWidths = 30, 70
- }
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZCloudPod.ps1 b/1.1.5/Src/Private/Get-AbrHRZCloudPod.ps1
deleted file mode 100644
index 5af9930..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZCloudPod.ps1
+++ /dev/null
@@ -1,103 +0,0 @@
-function Get-AbrHRZCloudPod {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "Cloud Pod Architecture InfoLevel set at $($InfoLevel.Settings.CloudPodArch.CloudPodArch)."
- Write-PScriboMessage "Collecting Cloud Pod Architecture information."
- }
-
- process {
- try {
- if ($CloudPodFederation) {
- if ($InfoLevel.Settings.CloudPodArch.CloudPodArch -ge 1) {
- Section -Style Heading2 "Cloud Pod Architecture" {
- Paragraph "The following section details on the cloud pod architecture information for $($HVEnvironment.toUpper())."
- BlankLine
- $OutObj = @()
- foreach ($CloudPodList in $CloudPodLists) {
- if ($CloudPodList) {
-
- # CP Site Info
- $CloudPodSiteInfo = $hzServices.Site.Site_Get($CloudPodList.site)
-
- # Connection Server Info
- $CloudPodListEndpoints = $CloudPodList.Endpoints
- $CloudPodListEndpointConnectionServerList = ''
- foreach ($CloudPodListEndpoint in $CloudPodListEndpoints) {
- $CloudPodListEndpointConnectionServer = $hzServices.PodEndpoint.PodEndpoint_Get($CloudPodListEndpoint)
- $CloudPodListEndpointConnectionServerList += $CloudPodListEndpointConnectionServer.name -join "`r`n" | Out-String
- }
-
- # Active Global Entitlements
- $CloudPodListActiveGlobalEntitlements = $CloudPodList.ActiveGlobalEntitlements
- $CloudPodListActiveGlobalEntitlementList = ''
- foreach ($CloudPodListActiveGlobalEntitlement in $CloudPodListActiveGlobalEntitlements) {
- $CloudPodListActiveGlobalEntitlementInfo = $hzServices.GlobalEntitlement.GlobalEntitlement_Get($CloudPodListActiveGlobalEntitlement)
- $CloudPodListActiveGlobalEntitlementList += $CloudPodListActiveGlobalEntitlementInfo.Base.DisplayName -join "`r`n" | Out-String
- }
-
- # Active Global Application Entitlements
- $CloudPodListActiveGlobalApplicationEntitlements = $CloudPodList.ActiveGlobalApplicationEntitlements
- $CloudPodListActiveGlobalApplicationEntitlementList = ''
- foreach ($CloudPodListActiveGlobalApplicationEntitlement in $CloudPodListActiveGlobalApplicationEntitlements) {
- $CloudPodListActiveGlobalApplicationEntitlementInfo = $hzServices.GlobalApplicationEntitlement.GlobalApplicationEntitlement_Get($CloudPodListActiveGlobalApplicationEntitlement)
- $CloudPodListActiveGlobalApplicationEntitlementList += $CloudPodListActiveGlobalApplicationEntitlementInfo.Base.DisplayName -join "`r`n" | Out-String
- }
-
-
- Write-PScriboMessage "Discovered Cloud Pod Federation Information."
- $inObj = [ordered] @{
- 'Pod Name' = $CloudPodList.DisplayName
- 'Pod Local' = $CloudPodList.Localpod
- 'Pod Site' = $CloudPodSiteInfo.Base.DisplayName
- 'Pod Description' = $CloudPodList.Description
- 'Pod Cloud Managed' = $CloudPodList.CloudManaged
- 'Pod Connection Servers' = $CloudPodListEndpointConnectionServerList
- 'Pod Active Global Entitlements' = $CloudPodListActiveGlobalEntitlementList
- 'Pod Active Global Application Entitlements' = $CloudPodListActiveGlobalApplicationEntitlementList
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
- }
-
- $TableParams = @{
- Name = "Cloud Pod Architecture - $($HVEnvironment.toUpper())"
- List = $true
- ColumnWidths = 50, 50
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZConnectionServer.ps1 b/1.1.5/Src/Private/Get-AbrHRZConnectionServer.ps1
deleted file mode 100644
index b8e82ad..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZConnectionServer.ps1
+++ /dev/null
@@ -1,351 +0,0 @@
-function Get-AbrHRZConnectionServer {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "ConnectionServers InfoLevel set at $($InfoLevel.Settings.Servers.ConnectionServers.ConnectionServers)."
- Write-PScriboMessage "Collecting Connection Servers information."
- }
-
- process {
- try {
- if ($ConnectionServers) {
- if ($InfoLevel.Settings.Servers.ConnectionServers.ConnectionServers -ge 1) {
- Section -Style Heading3 "Connection Servers" {
- Paragraph "The following section details the configuration of Connection Servers for $($HVEnvironment.toUpper()) server."
- BlankLine
- $OutObj = @()
- foreach ($ConnectionServer in $ConnectionServers) {
- try {
- Write-PScriboMessage "Discovered Connection Servers Information $($ConnectionServer.General.Name)."
- #Switch ($GatewayServer.Type)
- #{
- # 'AP' {$GatewayType = 'UAG' }
- #}
- $inObj = [ordered] @{
- 'Name' = $ConnectionServer.General.Name
- 'Version' = $ConnectionServer.General.Version
- 'Enabled' = $ConnectionServer.General.Enabled
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
-
- if ($HealthCheck.ConnectionServers.Status) {
- $OutObj | Where-Object { $_.'Enabled' -eq 'No' } | Set-Style -Style Warning -Property 'Enabled'
- }
-
- $TableParams = @{
- Name = "Connection Servers - $($HVEnvironment.toUpper())"
- List = $false
- ColumnWidths = 42, 43, 15
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Sort-Object -Property 'Name' | Table @TableParams
- if ($InfoLevel.Settings.Servers.ConnectionServers.ConnectionServers -ge 2) {
- try {
- $OutObj = @()
- foreach ($ConnectionServer in $ConnectionServers) {
- Section -Style NOTOCHeading5 "General $($ConnectionServer.General.Name) Details" {
- try {
- $ConnectionServerTags = $ConnectionServer.General | ForEach-Object { $_.Tags }
- $ConnectionServerTagsresult = $ConnectionServerTags -join ', '
-
- # Connection Server Health Data
- $ConnectionServerHealthMatch = $false
- foreach ($ConnectionServerHealth in $ConnectionServersHealth) {
- if ($ConnectionServerHealth.id.id -eq $ConnectionServer.id.id) {
- $ConnectionServerHealthData = $ConnectionServerHealth
- $ConnectionServerHealthMatch = $true
- }
- if ($ConnectionServerHealthMatch) {
- break
- }
- }
-
- Write-PScriboMessage "Discovered Connection Servers Information $($ConnectionServer.General.Name)."
- $inObj = [ordered] @{
- 'Name' = $ConnectionServer.General.Name
- 'FQDN' = $ConnectionServer.General.Fqhn
- 'Server Address' = $ConnectionServer.General.ServerAddress
- 'Version' = $ConnectionServer.General.Version
- 'Enabled' = $ConnectionServer.General.Enabled
- 'Tags' = $ConnectionServerTagsresult
- 'External URL' = $ConnectionServer.General.ExternalURL
- 'External PCoIP URL' = $ConnectionServer.General.ExternalPCoIPURL
- 'Auxiliary External PCoIP IPv4 Address' = $ConnectionServer.General.AuxillaryExternalPCoIPIPv4Address
- 'External App Blast URL' = $ConnectionServer.General.ExternalAppblastURL
- 'Local Connection Server' = $ConnectionServer.General.LocalConnectionServer
- 'Bypass Tunnel' = $ConnectionServer.General.BypassTunnel
- 'Bypass PCoIP Gateway' = $ConnectionServer.General.BypassPCoIPGateway
- 'Bypass App Blast Gateway' = $ConnectionServer.General.BypassAppBlastGateway
- 'IP Mode' = $ConnectionServer.General.IpMode
- 'FIPs Mode Enabled' = $ConnectionServer.General.FipsModeEnabled
- 'Replication Status' = $ConnectionServerHealthData.ReplicationStatus.Status
- 'Current CPU Usage Percentage' = $($ConnectionServerHealthData.ResourcesData.CpuUsagePercentage).ToString() + '%'
- 'Current Memory Usage Percentage' = $($ConnectionServerHealthData.ResourcesData.MemoryUsagePercentage).ToString() + '%'
- }
-
- $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
-
- if ($HealthCheck.ConnectionServers.Status) {
- $OutObj | Where-Object { $_.'Enabled' -eq 'No' } | Set-Style -Style Warning -Property 'Enabled'
- }
-
- $TableParams = @{
- Name = "Connection Servers - $($ConnectionServer.General.Name)"
- List = $true
- ColumnWidths = 50, 50
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
-
-
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
-
- try {
- $OutObj = @()
- Section -Style NOTOCHeading5 "Authentication $($ConnectionServer.General.Name) Details" {
- try {
- Write-PScriboMessage "Discovered Connection Servers Authentication Information $($ConnectionServer.General.Name)."
-
- if ($connectionserver.authentication.samlconfig.SamlAuthenticators) {
- $SAMLAuth = $hzServices.SAMLAuthenticator.SAMLAuthenticator_Get($connectionserver.authentication.samlconfig.SamlAuthenticator)
- #$SAMLAuthList = $hzServices.SAMLAuthenticator.SAMLAuthenticator_list()
- }
-
- $inObj = [ordered] @{
- 'Smart Card Support' = $ConnectionServer.Authentication.SmartCardSupport
- 'Log off When Smart Card Removed' = $ConnectionServer.Authentication.LogoffWhenRemoveSmartCard
- 'RSA Secure ID Enabled' = $ConnectionServer.Authentication.RsaSecureIdConfig.SecureIdEnabled
- 'RSA Secure ID Name Mapping' = $ConnectionServer.Authentication.RsaSecureIdConfig.NameMapping
- 'RSA Secure ID Clear Node Secret' = $ConnectionServer.Authentication.RsaSecureIdConfig.ClearNodeSecret
- 'RSA Secure ID Security File Data' = $ConnectionServer.Authentication.RsaSecureIdConfig.SecurityFileData
- 'RSA Secure ID Security File Uploaded' = $ConnectionServer.Authentication.RsaSecureIdConfig.SecurityFileUploaded
- 'Radius Enabled' = $ConnectionServer.Authentication.RadiusConfig.RadiusEnabled
- 'Radius Authenticator' = $ConnectionServer.Authentication.RadiusConfig.RadiusAuthenticator
- 'Radius Name Mapping' = $ConnectionServer.Authentication.RadiusConfig.RadiusNameMapping
- 'Radius SSO' = $ConnectionServer.Authentication.RadiusConfig.RadiusSSO
- 'SAML Support' = $ConnectionServer.Authentication.SamlConfig.SamlSupport
- 'SAML Authenticator' = $SAMLAuth.General.Label
- 'SAML Authenticator Description' = $SAMLAuth.General.Description
- 'SAML Trigger Mode' = $SAMLAuth.General.CertificateSSOData.TriggerMode
- 'SAML Password Mode' = $SAMLAuth.General.CertificateSSOData.PasswordMode
- 'SAML Authenticator Type' = $SAMLAuth.server.AuthenticatorType
- 'SAML Metadata URL' = $SAMLAuth.server.MetadataURL
- 'SAML Administrator URL' = $SAMLAuth.server.AdministratorURL
- 'SAML Static Meta Data' = $SAMLAuth.server.StaticMetaData
- 'Unauthenticated Access Config Enabled' = $ConnectionServer.Authentication.UnauthenticatedAccessConfig.Enabled
- 'Unauthenticated Access Default User' = $ConnectionServer.Authentication.UnauthenticatedAccessConfig.DefaultUser
- 'Unauthenticated Access User Idle Timeout' = $ConnectionServer.Authentication.UnauthenticatedAccessConfig.UserIdleTimeout
- 'Unauthenticated Access Client Puzzle Difficulty' = $ConnectionServer.Authentication.UnauthenticatedAccessConfig.ClientPuzzleDifficulty
- 'Block Unsupported Clients' = $ConnectionServer.Authentication.UnauthenticatedAccessConfig.BlockUnsupportedClients
- }
- $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
- $TableParams = @{
- Name = "Authentication - $($ConnectionServer.General.Name)"
- List = $true
- ColumnWidths = 40, 60
- }
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- try {
- $OutObj = @()
- Section -Style NOTOCHeading5 "Backup $($ConnectionServer.General.Name) Details" {
- try {
- Write-PScriboMessage "Discovered Connection Servers Authentication Information $($ConnectionServer.General.Name)."
- $inObj = [ordered] @{
- 'Automatic Backup Frequency' = Switch ($ConnectionServer.Backup.LdapBackupFrequencyTime) {
- 'DAY_1' { 'Every day' }
- 'DAY_2' { 'Every 2 day' }
- 'HOUR_1' { 'Every hour' }
- 'HOUR_12' { 'Every 12 hours' }
- 'WEEK_1' { 'Every week' }
- 'WEEK_2' { 'Every 2 week' }
- 'HOUR_0' { 'Disabled' }
-
- }
- 'Max Number of Backups' = $ConnectionServer.Backup.LdapBackupMaxNumber
- 'Last Backup Time' = $ConnectionServer.Backup.LastLdapBackupTime
- 'Last Backup Status' = $ConnectionServer.Backup.LastLdapBackupStatus
- 'Folder Location' = $ConnectionServer.Backup.LdapBackupFolder
- }
-
- $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
-
- if ($HealthCheck.ConnectionServers.Status) {
- $OutObj | Where-Object { $_.'Last Backup Status' -ne 'OK' } | Set-Style -Style Warning -Property 'Last Backup Status'
- $OutObj | Where-Object { $_.'Automatic Backup Frequency' -eq 'Disabled' } | Set-Style -Style Critical -Property 'Automatic Backup Frequency'
- }
-
- $TableParams = @{
- Name = "Backup - $($ConnectionServer.General.Name)"
- List = $true
- ColumnWidths = 50, 50
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- try {
- $OutObj = @()
- Section -Style NOTOCHeading5 "Certificate Details for $($ConnectionServer.General.Name) Details" {
- try {
-
- # Connection Server Health Data
- $ConnectionServerHealthMatch = $false
- foreach ($ConnectionServerHealth in $ConnectionServersHealth) {
- if ($ConnectionServerHealth.id.id -eq $ConnectionServer.id.id) {
- $ConnectionServerHealthData = $ConnectionServerHealth
- $ConnectionServerHealthMatch = $true
- }
- if ($ConnectionServerHealthMatch) {
- break
- }
- }
-
- Write-PScriboMessage "Working on Certificate Information for $($ConnectionServerHealthData.Name)."
-
- if (![string]::IsNullOrEmpty($ConnectionServerHealthData.CertificateHealth.ConnectionServerCertificate)) {
- $Cert = $ConnectionServerHealthData.CertificateHealth.ConnectionServerCertificate
- $Bytes = [System.Text.Encoding]::UTF8.GetBytes($Cert)
- $PodCert = [System.Security.Cryptography.X509Certificates.X509Certificate2]::new($Bytes)
- }
-
- $inObj = [ordered] @{
- 'Connection Server' = $ConnectionServerHealthData.Name
- 'Self-Signed Certificate' = $ConnectionServerHealthData.DefaultCertificate
- 'Certificate Subject' = $PodCert.Subject
- 'Certificate Issuer' = $PodCert.Issuer
- 'Certificate Not Before' = $PodCert.NotBefore
- 'Certificate Not After' = $PodCert.NotAfter
- 'Certificate SANs' = $(($PodCert.DnsNameList | ForEach-Object { $_.Punycode }) -join ', ')
- 'Certificate Thumbprint' = $PodCert.Thumbprint
- }
- $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
- if ($HealthCheck.ConnectionServers.Status) {
- $OutObj | Where-Object { $_.'Enabled' -eq 'No' } | Set-Style -Style Warning -Property 'Enabled'
- }
- $TableParams = @{
- Name = "Certificate Details for - $($ConnectionServerHealthData.Name)"
- List = $true
- ColumnWidths = 30, 70
- }
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- if ($ConnectionServersHealth.replicationstatus) {
- if ($InfoLevel.settings.servers.ConnectionServers.ConnectionServers -ge 2) {
- try {
- $OutObj = @()
- Section -Style NOTOCHeading5 "Replication Status for Connection Server $($connectionserver.General.Name)" {
- try {
- Write-PScriboMessage "Working on Replication Information for $($connectionserver.General.Name)."
-
- If ($CSHealth.Message) {
- $CSHealthMessage = $CSHealth.Message
- } else {
- $CSHealthMessage = "No Replication Issues"
- }
-
- foreach ($CSHealth in ($ConnectionServersHealth | Where-Object { $_.Name -EQ $connectionserver.General.Name })) {
- $inObj = [ordered] @{
- 'Connection Server' = $CSHealth.Name
- 'Replication Partner' = $($CSHealth.ReplicationStatus | ForEach-Object { $_.ServerName }) -join ','
- 'Status' = $($CSHealth.ReplicationStatus | ForEach-Object { $_.Status }) -join ','
- 'Message' = $CSHealthMessage
- }
- $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
- }
-
- $TableParams = @{
- Name = "Connection Servers Replication- $($connectionserver.General.Name)"
- List = $true
- ColumnWidths = 30, 70
- }
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
-
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
-
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZDatastore.ps1 b/1.1.5/Src/Private/Get-AbrHRZDatastore.ps1
deleted file mode 100644
index 86b6ff6..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZDatastore.ps1
+++ /dev/null
@@ -1,119 +0,0 @@
-function Get-AbrHRZDatastore {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "Datastore InfoLevel set at $($InfoLevel.Settings.Servers.vCenterServers.DataStores)."
- Write-PScriboMessage "Collecting DataStores information."
- }
-
- process {
- try {
- if ($vCenterHealth) {
- if ($InfoLevel.Settings.Servers.vCenterServers.DataStores -ge 1) {
- Section -Style NOTOCHeading5 "Datastores" {
- $OutObj = @()
- $Datastores = $vCenterHealth.datastoredata
- foreach ($DataStore in $Datastores) {
- if ($DataStore.Name) {
- try {
- Write-PScriboMessage "Discovered Datastore Information from $($DataStore.name)."
- $inObj = [ordered] @{
- 'Name' = $DataStore.name
- 'Accessible' = $DataStore.Accessible
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- }
-
- if ($HealthCheck.DataStores.Status) {
- $OutObj | Where-Object { $_.'Accessible' -eq 'No' } | Set-Style -Style Warning
- }
-
- $TableParams = @{
- Name = "Datastores - $($HVEnvironment.toUpper())"
- List = $false
- ColumnWidths = 50, 50
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Sort-Object -Property 'Name' | Table @TableParams
- try {
- if ($InfoLevel.Settings.Servers.vCenterServers.DataStores -ge 2) {
- Section -Style NOTOCHeading6 "Datastores Detailed" {
- foreach ($DataStore in $Datastores) {
- if ($DataStore) {
- try {
- Section -ExcludeFromTOC -Style NOTOCHeading6 "$($DataStore.Name)" {
- $OutObj = @()
- Write-PScriboMessage "Discovered Datastore Information from $($DataStore.Name)."
- $inObj = [ordered] @{
- 'Path' = $DataStore.Path
- 'Type' = $DataStore.DataStoreType
- 'Capacity' = "$([math]::round($DataStore.CapacityMB / 1KB))GB"
- 'Free Space' = "$([math]::round($DataStore.FreeSpaceMB / 1KB))GB"
- 'Accessible' = $DataStore.Accessible
- }
-
- $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
-
- if ($HealthCheck.DataStores.Status) {
- $OutObj | Where-Object { $_.'Accessible' -eq 'No' } | Set-Style -Style Warning -Property 'Accessible'
- }
-
- $TableParams = @{
- Name = "Datastores Details - $($DataStore.Name)"
- List = $true
- ColumnWidths = 50, 50
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZDesktopPool.ps1 b/1.1.5/Src/Private/Get-AbrHRZDesktopPool.ps1
deleted file mode 100644
index 8968840..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZDesktopPool.ps1
+++ /dev/null
@@ -1,710 +0,0 @@
-function Get-AbrHRZDesktopPool {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "Pool Desktop InfoLevel set at $($InfoLevel.Inventory.Desktop)."
- Write-PScriboMessage "Collecting Pool Desktop information."
- }
-
- process {
- try {
- if ($Pools) {
- if ($InfoLevel.Inventory.Desktop -ge 1) {
- Section -Style Heading3 "Desktop Pools" {
- Paragraph "The following section details the Desktop Pools configuration for $($HVEnvironment.toUpper()) server."
- BlankLine
- $OutObj = @()
- foreach ($Pool in $Pools) {
- Write-PScriboMessage "Discovered Desktop Pool Information for Pool $($Pool.Base.Name)."
- Switch ($Pool.Automateddesktopdata.ProvisioningType) {
- 'INSTANT_CLONE_ENGINE' { $ProvisioningType = 'Instant Clone' }
- 'VIRTUAL_CENTER' { $ProvisioningType = 'Full Virtual Machines' }
- }
-
- if ($Pool.Type -eq "MANUAL") {
- $UserAssign = $Pool.ManualDesktopData.UserAssignment.UserAssignment
- } else { $UserAssign = $Pool.AutomatedDesktopData.UserAssignment.UserAssignment }
-
- $inObj = [ordered] @{
- 'Name' = $Pool.Base.Name
- 'Type' = $Pool.Type
- 'Provisioning Type' = $ProvisioningType
- 'User Assignment' = $UserAssign
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
-
- $TableParams = @{
- Name = "Desktop Pools - $($HVEnvironment.toUpper())"
- List = $false
- ColumnWidths = 25, 25, 25, 25
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Sort-Object -Property 'Name' | Table @TableParams
- try {
- if ($InfoLevel.Inventory.Desktop -ge 2) {
- Section -Style Heading4 "Desktop Pools Details" {
- foreach ($Pool in $Pools) {
- # Find Access Group for Desktop Pool
- $AccessgroupsJoined = $hzServices.AccessGroup.AccessGroup_List() + $hzServices.AccessGroup.AccessGroup_List().Children
- $AccessGroupMatch = $AccessgroupsJoined | Where-Object { $_.Id.id -eq $Pool.base.accessgroup.id }
-
- if ($AccessGroupMatch) {
- $AccessGroupName = $AccessGroupMatch.base.name
- } else {
- $AccessGroupName = '' # Set to a default value if no match is found
- }
- <#
- # Find out Global Entitlement Group for Applications
- $InstantCloneDomainAdminGroupMatch = $false
- foreach ($InstantCloneDomainAdminGroup in $InstantCloneDomainAdminGroups) {
- if ($InstantCloneDomainAdminGroup.Id.id -eq $Pool.automateddesktopdata.CustomizationSettings.CloneprepCustomizationSettings.InstantCloneEngineDomainAdministrator.id) {
- $InstantCloneDomainAdminGroupDisplayName = $InstantCloneDomainAdmins.base.username
- $InstantCloneDomainAdminGroupMatch = $true
- }
- if ($InstantCloneDomainAdminGroupMatch) {
- break
- }
- }
-
- # Find out Global Entitlement Group for Applications
- $GlobalEntitlementMatch = $false
- foreach ($GlobalEntitlement in $GlobalEntitlements) {
- if ($GlobalEntitlement.Id.id -eq $Pool.globalentitlementdata.globalentitlement.id) {
- $GlobalEntitlementDisplayName = $GlobalEntitlement.base.DisplayName
- $GlobalEntitlementMatch = $true
- }
- if ($GlobalEntitlementMatch) {
- break
- }
- }
-
- $farmMatch = $false
- foreach ($farm in $farms) {
- if ($farm.Id.id -eq $Pool.rdsdesktopdata.farm.id) {
- $FarmIDName = $farm.data.name
- $farmMatch = $true
- }
- if ($farmMatch) {
- break
- }
- }
- #>
- # Desktop OS Data
- $DesktopAssignmentViewResultsDataMatch = $false
- foreach ($DesktopAssignmentViewResult in $DesktopAssignmentViewResultsData.DesktopAssignmentData) {
- if ($DesktopAssignmentViewResult.name -eq $Pool.Base.Name) {
- $NumberofPoolMachines = $DesktopAssignmentViewResult.Name
- $PooLOpperatingSystem = $DesktopAssignmentViewResult.OperatingSystem
- $PoolOpperatingSystemArch = $DesktopAssignmentViewResult.OperatingSystemArchitecture
- $DesktopAssignmentViewResultsDataMatch = $true
- }
- if ($DesktopAssignmentViewResultsDataMatch) {
- break
- }
- }
-
- # Find vCenter ID Name
- $vCenterServerIDName = ''
- $PoolGroups = $pool.manualdesktopdata.virtualcenter.id
- foreach ($PoolGroup in $PoolGroups) {
- foreach ($vCenterServer in $vCenterServers) {
- if ($vCenterServer.Id.id -eq $PoolGroup) {
- $vCenterServerIDName = $vCenterServer.serverspec.ServerName
- break
- }
- }
- if ($PoolGroups.count -gt 1) {
- $vCenterServerIDNameResults += "$vCenterServerIDName, "
- $vCenterServerIDName = $vCenterServerIDNameResults.TrimEnd(', ')
- }
- }
-
- # Find vCenter Auto ID Name
- $vCenterServerAutoIDName = ''
- $PoolGroups = $Pool.automateddesktopdata.virtualcenter.id
- foreach ($PoolGroup in $PoolGroups) {
- foreach ($vCenterServer in $vCenterServers) {
- if ($vCenterServer.Id.id -eq $PoolGroup) {
- $vCenterServerAutoIDName = $vCenterServer.serverspec.ServerName
- break
- }
-
- }
- if ($PoolGroups.count -gt 1) {
- $vCenterServerAutoIDNameResults += "$vCenterServerAutoIDName, "
- $vCenterServerAutoIDName = $vCenterServerAutoIDNameResults.TrimEnd(', ')
- }
- }
-
- # Find Base Image ID Name
- $PoolBaseImage = ''
- $PoolBaseImagePath = ''
- if ($Pool.automateddesktopdata.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.ParentVM.id) {
- foreach ($CompatibleBaseImageVM in $CompatibleBaseImageVMs) {
- if ($CompatibleBaseImageVM.id.id -eq $Pool.automateddesktopdata.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.ParentVM.id) {
- $PoolBaseImage = $CompatibleBaseImageVM.name
- $PoolBaseImagePath = $CompatibleBaseImageVM.Path
- break
- }
- }
- }
-
- # Get Pool Base Image Snapshot
- $BaseImageSnapshotListLast = ''
- if ( $Pool.automateddesktopdata.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.Snapshot.id) {
- $BaseImageSnapshotList = $hzServices.BaseImageSnapshot.BaseImageSnapshot_List($Pool.automateddesktopdata.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.ParentVM)
- $BaseImageSnapshotListLast = $BaseImageSnapshotList | Select-Object -Last 1
- }
-
- # DataCenters
- $PoolDataCenterName = ''
- $PoolDatacenterPath = ''
- if ($Pool.automateddesktopdata.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.Datacenter.id) {
- $DataCenterList = $hzServices.Datacenter.Datacenter_List($Pool.automateddesktopdata.virtualcenter)
-
- # Find DataCenter ID Name
- foreach ($DataCenter in $DataCenterList) {
- if ($DataCenter.id.id -eq $Pool.automateddesktopdata.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.Datacenter.id) {
- $PoolDataCenterName = $DataCenter.base.name
- $PoolDatacenterPath = $DataCenter.base.Path
- break
- }
- }
- }
-
- # VM Folder List
- $VMFolder = ''
- $VMFolderPath = ''
- if ($Pool.automateddesktopdata.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.VmFolder.id) {
-
- $VMFolderPath = $Pool.automateddesktopdata.VirtualCenterNamesData.VmFolderPath
- $VMFolder = $VMFolderPath -replace '^(.*[\\\/])'
- }
-
- # VM Host or Cluster
- $VMhostandCluter = ''
- if ($Pool.automateddesktopdata.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.HostOrCluster.id) {
- #$HostAndCluster = $hzServices.HostOrCluster.HostOrCluster_GetHostOrClusterTree($Pool.automateddesktopdata.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.Datacenter)
- $VMhostandCluterPath = $Pool.automateddesktopdata.VirtualCenterNamesData.HostOrClusterPath
- $VMhostandCluter = $VMhostandCluterPath -replace '^(.*[\\\/])'
- }
-
- # VM Resource Pool
- $VMResourcePool = ''
- if ($Pool.automateddesktopdata.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.ResourcePool.id) {
- #$ResourcePoolTree = $hzServices.ResourcePool.ResourcePool_GetResourcePoolTree($Pool.automateddesktopdata.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.Datacenter)
- $VMResourcePoolPath = $Pool.automateddesktopdata.VirtualCenterNamesData.ResourcePoolPath
- $VMResourcePool = $VMResourcePoolPath -replace '^(.*[\\\/])'
- }
-
- <#
- # VM Persistent Disk DataStores
- if ($Pool.automateddesktopdata.VirtualCenterNamesData.PersistentDiskDatastorePaths){
- $VMPersistentDiskDatastorePath = $Pool.automateddesktopdata.VirtualCenterNamesData.PersistentDiskDatastorePaths
- $VMPersistentDiskDatastore = $VMPersistentDiskDatastorePath -replace '^(.*[\\\/])'
- }
- #>
-
- # VM Network Card
- if ($Pool.automateddesktopdata.VirtualCenterProvisioningSettings.VirtualCenterNetworkingSettings.nics.nic.id) {
- $NetworkInterfaceCardList = $hzServices.NetworkInterfaceCard.NetworkInterfaceCard_ListBySnapshot($BaseImageSnapshotListLast.Id)
- }
-
- # VM AD Container
- $PoolContainerName = ''
- if ($Pool.automateddesktopdata.CustomizationSettings.AdContainer.id) {
- foreach ($ADDomain in $ADDomains) {
- $ADDomainID = ($ADDomain.id.id -creplace '^[^/]*/', '')
- if ($Pool.automateddesktopdata.CustomizationSettings.AdContainer.id -like "ADContainer/$ADDomainID/*") {
- $ADContainers = $hzServices.ADContainer.ADContainer_ListByDomain($ADDomain.id)
- foreach ($ADContainer in $ADContainers) {
- if ($ADContainer.id.id -eq $Pool.automateddesktopdata.CustomizationSettings.AdContainer.id) {
- $PoolContainerName = $ADContainer.rdn
- break
- }
- }
- }
- }
- }
-
- # Black out Times
- $BlackOutDates = $pool.ManualDesktopData.ViewStorageAcceleratorSettings.BlackoutTimes
- $BlackOutDateString = $BlackOutDates | Format-Table | Out-String
-
- # Pool Customization Type
- $Customizations = ('')
- If ($pool.AutomatedDesktopData.CustomizationSettings.CustomizationType -eq "SYS_PREP") {
- Foreach ($vCenterServer in $vCenterServers) {
- $Customizations = $hzServices.CustomizationSpec.CustomizationSpec_List($vCenterServer.id)
- Foreach ($Customization in $Customizations) {
- if ($pool.AutomatedDesktopData.CustomizationSettings.SysprepCustomizationSettings.CustomizationSpec.id -eq $Customization.id.id) {
- $PoolCustomization = $($Customization.CustomizationSpecData.Name)
- }
- }
- }
- }
- # VM Template
- $PoolTemplateName = ''
- if ($Pool.automateddesktopdata.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.Template.id) {
- foreach ($Template in $CompatibleTemplateVMs) {
- if ($Template.id.id -eq $Pool.automateddesktopdata.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.Template.id) {
- $PoolTemplateName = $Template.name
- break
- }
- }
- }
- try {
- Section -Style NOTOCHeading5 "Pool - $($Pool.Base.name)" {
- $SupportedDisplayProtocolsresult = ''
- $SupportedDisplayProtocols = $Pool.DesktopSettings.DisplayProtocolSettings | ForEach-Object { $_.SupportedDisplayProtocols }
- $SupportedDisplayProtocolsresult = $SupportedDisplayProtocols -join ', '
-
- $StorageOvercommitsresult = ''
- $StorageOvercommit = $Pool.automateddesktopdata.VirtualCenterProvisioningSettings.VirtualCenterStorageSettings.datastores | ForEach-Object { $_.StorageOvercommit }
- $StorageOvercommitsresult = $StorageOvercommit -join ', '
-
- $DatastoreFinal = ''
- Switch ($Pool.Type) {
- 'MANUAL' { $POOLDST = $Pool.ManualDesktopData.VirtualCenterNamesData }
- default { $POOLDST = $Pool.automateddesktopdata.VirtualCenterNamesData }
- }
- $DatastorePaths = $POOLDST | ForEach-Object { $_.DatastorePaths }
- foreach ($Datastore in $DatastorePaths) {
- $Datastorename = $Datastore -replace '^(.*[\\\/])'
- $DatastoreFinal += $DatastoreName -join "`r`n" | Out-String
- }
- #$DatastorePathsresult = $DatastorePaths -join ', '
- try {
- Section -ExcludeFromTOC -Style NOTOCHeading5 "General Summary - $($Pool.Base.name)" {
- $OutObj = @()
- Write-PScriboMessage "Discovered $($Pool.Base.name) General Information."
- $inObj = [ordered] @{
- 'Name' = $Pool.Base.name
- 'Display Name' = $Pool.base.displayName
- 'Description' = $Pool.base.description
- 'Access Group' = $AccessGroupName
- 'Enabled' = $Pool.DesktopSettings.Enabled
- 'Type' = $Pool.Type
- 'Machine Source' = Switch ($pool.Source) {
- 'INSTANT_CLONE_ENGINE' { 'vCenter(Instant Clone)' }
- 'VIRTUAL_CENTER' { 'vCenter' }
- default { $pool.Source }
- }
- 'Provisioning Type' = Switch ($Pool.Automateddesktopdata.ProvisioningType) {
- 'INSTANT_CLONE_ENGINE' { 'Instant Clone' }
- 'VIRTUAL_CENTER' { 'Full Virtual Machines' }
- default { $Pool.Automateddesktopdata.ProvisioningType }
- }
- 'Enabled for Provisioning' = $Pool.automateddesktopdata.VirtualCenterProvisioningSettings.EnableProvisioning
- 'Client Restrictions Enabled' = $Pool.DesktopSettings.ClientRestrictions
- }
-
- if ($Pool.Type -eq 'MANUAL') {
- $inObj.Remove('Provisioning Type')
- $inObj.Remove('Enabled for Provisioning')
- }
-
- $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
-
- $TableParams = @{
- Name = "General - $($Pool.Base.name)"
- List = $true
- ColumnWidths = 50, 50
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- try {
- Section -ExcludeFromTOC -Style NOTOCHeading5 "Detailed Settings - $($Pool.Base.name)" {
- $OutObj = @()
- Write-PScriboMessage "Discovered $($Pool.Base.name) Pool Setting Information."
- $inObj = [ordered] @{
- 'Name' = $Pool.Base.name
- 'Display Name' = $Pool.base.displayName
- 'Description' = $Pool.base.description
- 'Access Group' = $AccessGroupName
- 'Enabled' = $Pool.DesktopSettings.Enabled
- 'Type' = $Pool.Type
- 'Machine Source' = Switch ($pool.Source) {
- 'INSTANT_CLONE_ENGINE' { 'vCenter(Instant Clone)' }
- 'VIRTUAL_CENTER' { 'vCenter' }
- default { $pool.Source }
- }
- 'Provisioning Type' = Switch ($Pool.Automateddesktopdata.ProvisioningType) {
- 'INSTANT_CLONE_ENGINE' { 'Instant Clone' }
- 'VIRTUAL_CENTER' { 'Full Virtual Machines' }
- default { $Pool.Automateddesktopdata.ProvisioningType }
- }
- 'Enabled for Provisioning' = $Pool.automateddesktopdata.VirtualCenterProvisioningSettings.EnableProvisioning
- 'Client Restrictions Enabled' = $Pool.DesktopSettings.ClientRestrictions
-
- 'Max Number of Machines' = $pool.automateddesktopdata.vmnamingsettings.patternnamingsettings.MaxNumberOfMachines
- 'Min number of Machines' = $pool.automateddesktopdata.vmnamingsettings.patternnamingsettings.MinNumberOfMachines
- 'Number of Spare Machines' = $pool.automateddesktopdata.vmnamingsettings.patternnamingsettings.NumberOfSpareMachines
- 'Connection Server Restrictions' = [string]($Pool.DesktopSettings.ConnectionServerRestrictions -join ",")
- 'Stop Provisioning on Error' = $Pool.automateddesktopdata.VirtualCenterProvisioningSettings.StopProvisioningOnError
- 'Add Virtual TPM' = $Pool.automateddesktopdata.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.AddVirtualTPM
- 'Minimum Number of Machines Ready' = $Pool.automateddesktopdata.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.MinReadyVMsOnVComposerMaintenance
- 'Naming Method' = $Pool.automateddesktopdata.VmNamingSettings.NamingMethod
- 'Naming Pattern' = $pool.automateddesktopdata.vmnamingsettings.patternnamingsettings.namingpattern
- 'Power Policy' = $Pool.DesktopSettings.LogoffSettings.PowerPolicy
- 'Provisioning Time' = $pool.automateddesktopdata.vmnamingsettings.patternnamingsettings.ProvisioningTime
- 'Automatic Logoff Policy' = $Pool.DesktopSettings.LogoffSettings.AutomaticLogoffPolicy
- 'Automatic Logoff Minutes' = $Pool.DesktopSettings.LogoffSettings.AutomaticLogoffMinutes
- 'Allow Users to Reset Machines' = $Pool.DesktopSettings.LogoffSettings.AllowUsersToResetMachines
- 'Allow Multiple Sessions Per User' = $Pool.DesktopSettings.LogoffSettings.AllowMultipleSessionsPerUser
- 'Delete or Refresh Machine After Logoff' = $Pool.DesktopSettings.LogoffSettings.DeleteOrRefreshMachineAfterLogoff
- 'Refresh OS Disk After Logoff' = $Pool.DesktopSettings.LogoffSettings.RefreshOsDiskAfterLogoff
- 'Refresh Period Days for Replica OS Disk' = $Pool.DesktopSettings.LogoffSettings.RefreshPeriodDaysForReplicaOsDisk
- 'Refresh Threshold Percentage For Replica OS Disk' = $Pool.DesktopSettings.LogoffSettings.RefreshThresholdPercentageForReplicaOsDisk
- 'Empty Session Timeout Policy' = $Pool.DesktopSettings.LogoffSettings.EmptySessionTimeoutPolicy
- 'Empty Session Timeout Minutes' = $Pool.DesktopSettings.LogoffSettings.EmptySessionTimeoutMinutes
- 'Log off After Timeout' = $Pool.DesktopSettings.LogoffSettings.LogoffAfterTimeout
- 'Prelaunch Session Timeout Policy' = $Pool.DesktopSettings.LogoffSettings.PreLaunchSessionTimeoutPolicy
- 'Prelaunch Session Timeout Minutes' = $Pool.DesktopSettings.LogoffSettings.PreLaunchSessionTimeoutMinutes
- 'Session Timeout Policy' = $Pool.DesktopSettings.LogoffSettings.SessionTimeoutPolicy
- 'Category Folder Name' = $pool.DesktopSettings.CategoryFolderName
- 'Client Restrictions' = $Pool.DesktopSettings.ClientRestrictions
- 'Shortcut Locations' = $Pool.DesktopSettings.ShortcutLocations
- 'Allow Users to use Multiple Sessions Per User' = $Pool.DesktopSettings.LogoffSettings.AllowMultipleSessionsPerUser
- 'Supported Session Types' = $Pool.DesktopSettings.SupportedSessionTypes
- 'Cloud Managed' = $Pool.DesktopSettings.CloudManaged
- 'Cloud Assigned' = $Pool.DesktopSettings.CloudAssigned
- 'Display Assigned Machine Name' = $Pool.DesktopSettings.DisplayAssignedMachineName
- 'Display Machine Alias' = $Pool.DesktopSettings.DisplayMachineAlias
- 'Supported Display Protocols' = $SupportedDisplayProtocolsresult
- 'Default Display Protocol' = $Pool.DesktopSettings.DisplayProtocolSettings.DefaultDisplayProtocol
- 'Allow Users to Choose Protocol' = $Pool.DesktopSettings.DisplayProtocolSettings.AllowUsersToChooseProtocol
- 'Enable HTML Access' = $Pool.DesktopSettings.DisplayProtocolSettings.EnableHTMLAccess
- 'Enable Collaboration' = $Pool.DesktopSettings.DisplayProtocolSettings.EnableCollaboration
- 'Renderer 3D' = $Pool.DesktopSettings.DisplayProtocolSettings.PcoipDisplaySettings.Renderer3D
- 'Enable GRID vGPUs' = $Pool.DesktopSettings.DisplayProtocolSettings.PcoipDisplaySettings.EnableGRIDvGPUs
- 'vGPU Grid Profile' = $Pool.DesktopSettings.DisplayProtocolSettings.PcoipDisplaySettings.VGPUGridProfile
- 'vRam Size MB' = $Pool.DesktopSettings.DisplayProtocolSettings.PcoipDisplaySettings.VRamSizeMB
- 'Max Number of Monitors' = $Pool.DesktopSettings.DisplayProtocolSettings.PcoipDisplaySettings.MaxNumberOfMonitors
- 'Max Resolution of Any One Monitor' = $Pool.DesktopSettings.DisplayProtocolSettings.PcoipDisplaySettings.MaxResolutionOfAnyOneMonitor
- 'Use View Storage Accelerator' = $pool.ManualDesktopData.ViewStorageAcceleratorSettings.UseViewStorageAccelerator
- 'Regenerate View Storage Accelerator Days' = $pool.ManualDesktopData.ViewStorageAcceleratorSettings.RegenerateViewStorageAcceleratorDays
- 'Black Out Times' = $BlackOutDateString
- 'Transparent Page Sharing Scope' = $Pool.ManualDesktopData.VirtualCenterManagedCommonSettings.TransparentPageSharingScope
- }
- if ($Pool.Type -eq 'AUTOMATED') {
- $inObj.Remove('Use View Storage Accelerator')
- $inObj.Remove('Regenerate View Storage Accelerator Days')
- $inObj.Remove('Black Out Times')
- $inObj.Remove('Transparent Page Sharing Scope')
- }
-
- if ($Pool.Type -eq 'MANUAL') {
- $inObj.Remove('Max Number of Machines')
- $inObj.Remove('Min number of Machines')
- $inObj.Remove('Number of Spare Machines')
- $inObj.Remove('Connection Server Restrictions')
- $inObj.Remove('Stop Provisioning on Error')
- $inObj.Remove('Naming Method')
- $inObj.Remove('Naming Pattern')
- $inObj.Remove('Provisioning Time')
- $inObj.Remove('Refresh Period Days for Replica OS Disk')
- $inObj.Remove('Refresh Threshold Percentage For Replica OS Disk')
- }
-
- if ($Pool.Type -eq 'RDS') {
- $inObj.Remove('Max Number of Machines')
- $inObj.Remove('Min number of Machines')
- $inObj.Remove('Number of Spare Machines')
- $inObj.Remove('Stop Provisioning on Error')
- $inObj.Remove('Naming Method')
- $inObj.Remove('Naming Pattern')
- $inObj.Remove('Provisioning Time')
- $inObj.Remove('Refresh Period Days for Replica OS Disk')
- $inObj.Remove('Refresh Threshold Percentage For Replica OS Disk')
- }
-
- $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
-
- $TableParams = @{
- Name = "Pool Settings - $($Pool.Base.name)"
- List = $true
- ColumnWidths = 50, 50
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- try {
- Section -ExcludeFromTOC -Style NOTOCHeading5 "vCenter Server Settings - $($Pool.Base.name)" {
- $OutObj = @()
- Write-PScriboMessage "Discovered $($Pool.Base.name) vCenter Server Information."
- $inObj = [ordered] @{
- 'Virtual Center' = Switch ($Pool.Type) {
- 'MANUAL' { $vCenterServerIDName }
- default { $vCenterServerAutoIDName }
- }
- 'Template' = $PoolTemplateName
- 'Parent VM' = $PoolBaseImage
- 'Parent VM Path' = $PoolBaseImagePath
- 'Current Number of Machines' = $NumberofPoolMachines
- 'Parent Operating System' = $PooLOpperatingSystem
- 'Parent Operating System Architecture' = $PoolOpperatingSystemArch
- 'Snapshot' = $BaseImageSnapshotListLast.name
- 'Snapshot Path' = $BaseImageSnapshotListLast.path
- 'Datacenter' = $PoolDataCenterName
- 'Datacenter Path' = $PoolDatacenterPath
- 'VM Folder' = $VMFolder
- 'VM Folder Path' = Switch ($Pool.Type) {
- 'MANUAL' { $Pool.ManualDesktopData.VirtualCenterNamesData.VmFolderPath }
- default { $Pool.automateddesktopdata.VirtualCenterNamesData.VmFolderPath }
- }
- 'Host or Cluster' = $VMhostandCluter
- 'Host or Cluster Path' = Switch ($Pool.Type) {
- 'MANUAL' { $Pool.ManualDesktopData.VirtualCenterNamesData.HostOrClusterPath }
- default { $Pool.automateddesktopdata.VirtualCenterNamesData.HostOrClusterPath }
- }
- 'Resource Pool' = $VMResourcePool
- 'Resource Pool Path' = Switch ($Pool.Type) {
- 'MANUAL' { $Pool.ManualDesktopData.VirtualCenterNamesData.ResourcePoolPath }
- default { $Pool.automateddesktopdata.VirtualCenterNamesData.ResourcePoolPath }
- }
- 'Datastores' = $DatastoreFinal
- 'Datastores Storage Over-Commit' = $StorageOvercommitsresult
- 'Use VSAN' = $pool.AutomatedDesktopData.VirtualCenterProvisioningSettings.VirtualCenterStorageSettings.usevsan
- 'Storage Cluster Path' = $pool.AutomatedDesktopData.VirtualCenterNamesData.SdrsClusterPath
- 'View Storage Accelerator' = Switch ($Pool.Type) {
- 'MANUAL' { $Pool.ManualDesktopData.ViewStorageAcceleratorSettings.UseViewStorageAccelerator }
- 'AUTOMATED' { $Pool.AutomatedDesktopData.VirtualCenterProvisioningSettings.VirtualCenterStorageSettings.ViewStorageAcceleratorSettings.UseViewStorageAccelerator }
- default { 'Not Supported' }
- }
- 'Transparent Page Sharing Scope' = Switch ($Pool.Type) {
- 'MANUAL' { $Pool.ManualDesktopData.VirtualCenterManagedCommonSettings.TransparentPageSharingScope }
- 'AUTOMATED' { $Pool.AutomatedDesktopData.VirtualCenterManagedCommonSettings.TransparentPageSharingScope }
- default { 'Not Supported' }
- }
- 'Replica Disk Datastore Path' = $Pool.automateddesktopdata.VirtualCenterNamesData.ReplicaDiskDatastorePath
- 'Networks' = Switch ($Pool.AutomatedDesktopData.VirtualCenterNamesData.NetworkLabelNames) {
- $null { 'Golden Image network selected' }
- default { $Pool.AutomatedDesktopData.VirtualCenterNamesData.NetworkLabelNames }
- }
- 'Network Card' = $NetworkInterfaceCardList.data.name
- 'Network Label Enabled' = $pool.AutomatedDesktopData.VirtualCenterProvisioningSettings.VirtualCenterNetworkingSettings.nics.NetworkLabelAssignmentSpecs.Enabled
- 'Network Nic Name' = $pool.AutomatedDesktopData.VirtualCenterProvisioningSettings.VirtualCenterNetworkingSettings.nics.NicName
- 'Network Label Names' = [string]($Pool.DesktopSettings.ConnectionServerRestrictions -join ",")
- 'Network Max Label Type' = $pool.AutomatedDesktopData.VirtualCenterProvisioningSettings.VirtualCenterNetworkingSettings.nics.NetworkLabelAssignmentSpecs.MaxLabelType
- 'Network Max Label' = $pool.AutomatedDesktopData.VirtualCenterProvisioningSettings.VirtualCenterNetworkingSettings.nics.NetworkLabelAssignmentSpecs.MaxLabel
- 'Customization Type' = $Pool.automateddesktopdata.CustomizationSettings.CustomizationType
- 'Customization Spec Name' = $Pool.automateddesktopdata.CustomizationSettings.CustomizationSpecName
- 'Power off Script Name' = $pool.AutomatedDesktopData.CustomizationSettings.CloneprepCustomizationSettings.PowerOffScriptName
- 'Power off Script Parameters' = $pool.AutomatedDesktopData.CustomizationSettings.CloneprepCustomizationSettings.PowerOffScriptParameters
- 'Post Synchronization Script Name' = $pool.AutomatedDesktopData.CustomizationSettings.CloneprepCustomizationSettings.PostSynchronizationScriptName
- 'Post Synchronization Script Parameters' = $pool.AutomatedDesktopData.CustomizationSettings.CloneprepCustomizationSettings.PostSynchronizationScriptParameters
- 'Priming Computer Account' = $pool.AutomatedDesktopData.CustomizationSettings.CloneprepCustomizationSettings.PrimingComputerAccount
- 'Guest Customization Account' = ($InstantCloneDomainAdmins | Where-Object { $_.id.id -eq $Pool.automateddesktopdata.CustomizationSettings.InstantCloneEngineDomainAdministrator.id }).Base.Username
- 'No Customization Settings' = $pool.AutomatedDesktopData.CustomizationSettings.NoCustomizationSettings
- 'Sysprep Customization Settings' = $PoolCustomization
- 'Quick Prep Customization Settings' = $pool.AutomatedDesktopData.CustomizationSettings.QuickprepCustomizationSettings
- 'Ad Container' = $PoolContainerName
- 'Reuse Pre-Existing Accounts' = $Pool.automateddesktopdata.CustomizationSettings.ReusePreExistingAccounts
- 'Image Management Stream' = $pool.AutomatedDesktopData.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.ImageManagementStream
- 'Image Management Tag' = $pool.AutomatedDesktopData.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.ImageManagementTag
- 'Compute Profile' = $pool.AutomatedDesktopData.VirtualCenterProvisioningSettings.VirtualCenterProvisioningData.ComputeProfile
- }
-
- if ($Pool.Automateddesktopdata.ProvisioningType -eq 'VIRTUAL_CENTER') {
- $inObj.Remove('Parent VM')
- $inObj.Remove('Parent VM Path')
- $inObj.Remove('Snapshot')
- $inObj.Remove('Snapshot Path')
- $inObj.Remove('VM Folder')
- $inObj.Remove('VM Folder Path')
- $inObj.Remove('Datastores')
- $inObj.Remove('Datastores Storage Over-Commit')
- $inObj.Remove('Replica Disk Datastore Path')
- $inObj.Remove('Pool Customization Type')
- $inObj.Remove('Pool Domain Administrator')
- $inObj.Remove('Pool Reuse Pre-Existing Accounts')
- $inObj.Remove('Ad Container')
- $inObj.Remove('Reuse Pre-Existing Accounts')
- $inObj.Remove('Customization Type')
- }
-
- if ($Pool.Type -eq 'MANUAL') {
- $inObj.Remove('Template')
- $inObj.Remove('Parent VM')
- $inObj.Remove('Parent VM Path')
- $inObj.Remove('Snapshot')
- $inObj.Remove('Snapshot Path')
- $inObj.Remove('VM Folder')
- $inObj.Remove('VM Folder Path')
- $inObj.Remove('Datastores')
- $inObj.Remove('Datastores Storage Over-Commit')
- $inObj.Remove('Replica Disk Datastore Path')
- $inObj.Remove('Pool Customization Type')
- $inObj.Remove('Pool Domain Administrator')
- $inObj.Remove('Pool Reuse Pre-Existing Accounts')
- $inObj.Remove('Ad Container')
- $inObj.Remove('Reuse Pre-Existing Accounts')
- $inObj.Remove('Customization Type')
- $inObj.Remove('Datacenter')
- $inObj.Remove('Datacenter Path')
- $inObj.Remove('Host or Cluster')
- $inObj.Remove('Host or Cluster Path')
- $inObj.Remove('Resource Pool')
- $inObj.Remove('Resource Pool Path')
- $inObj.Remove('Networks')
- $inObj.Remove('Guest Customization Account')
- }
-
- if ($Pool.Automateddesktopdata.ProvisioningType -eq 'INSTANT_CLONE_ENGINE') {
- $inObj.Remove('Template')
-
- }
-
- if ([string]::IsNullOrEmpty($pool.AutomatedDesktopData.CustomizationSettings.CloneprepCustomizationSettings)) {
- $inObj.Remove('Power off Script Name')
- $inObj.Remove('Power Off Script Parameters')
- $inObj.Remove('Post Synchronization Script Name')
- $inObj.Remove('Post Synchronization Script Parameters')
- $inObj.Remove('Priming Computer Account')
- }
-
- $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
-
- $TableParams = @{
- Name = "vCenter Server Settings - $($Pool.Base.name)"
- List = $true
- ColumnWidths = 40, 60
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
-
- if ($InfoLevel.Inventory.Desktop -ge 3) {
- try {
- Section -ExcludeFromTOC -Style NOTOCHeading6 "Pool Machine Summary - $($Pool.Base.name)" {
- $OutObj = @()
- foreach ($Machine in $Machines) {
- if($Machine.Base.Name) {
- If ($Machine.Base.DesktopName -like $Pool.base.Name) {
- $inObj = [ordered] @{
- 'Machine Name' = $Machine.Base.Name
- 'Agent Version' = $Machine.Base.AgentVersion
- 'User' = $Machine.Base.User
- 'Host' = $Machine.ManagedMachineData.VirtualCenterData.Hostname
- 'Data Store' = $Machine.ManagedMachineData.VirtualCenterData.VirtualDisks.DatastorePath
- 'Basic State' = $Machine.Base.BasicState
- }
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
- }
- }
- $TableParams = @{
- Name = "Pool Machine Summary - $($Pool.Base.Name)"
- List = $false
- ColumnWidths = 15, 10, 20, 25, 15, 15
- }
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Sort-Object -Property 'Name' | Table @TableParams
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
-
- }
-
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- try {
- if($EntitledUserOrGrouplocalMachines | Where-Object { $_.localData.Desktops.id -eq $Pool.Id.id }){
- Section -ExcludeFromTOC -Style NOTOCHeading6 "Desktop Pools Entitlements - $($Pool.Base.Name)" {
- try {
- $OutObj = @()
- Write-PScriboMessage "Discovered Desktop Pool Entitlements Information for - $($Pool.Base.Name)."
- foreach ($Principal in ($EntitledUserOrGrouplocalMachines | Where-Object { $_.localData.Desktops.id -eq $Pool.Id.id })) {
- if($Principal.Base.LoginName){
- Write-PScriboMessage "Discovered Desktop Pool Entitlements Name for - $($Principal.Base.LoginName)."
- $inObj = [ordered] @{
- 'Name' = $Principal.Base.LoginName
- 'Domain' = $Principal.Base.Domain
- 'Is Group?' = $Principal.Base.Group
- }
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
- }
- $TableParams += @{
- Name = "Desktop Pools Entitlements - $($Pool.Base.Name)"
- List = $false
- ColumnWidths = 34, 33, 33
- }
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Sort-Object -Property 'Name' | Table @TableParams
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZDomain.ps1 b/1.1.5/Src/Private/Get-AbrHRZDomain.ps1
deleted file mode 100644
index bc21697..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZDomain.ps1
+++ /dev/null
@@ -1,113 +0,0 @@
-function Get-AbrHRZDomain {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "InstantCloneDomainAccounts InfoLevel set at $($InfoLevel.Settings.InstantClone.InstantCloneDomainAccounts)."
- Write-PScriboMessage "Collecting Instant Clone Domain Accounts information."
- }
-
- process {
- try {
- Section -Style Heading2 "Domains" {
- if ($InstantCloneDomainAdmins) {
- if ($InfoLevel.Settings.InstantClone.InstantCloneDomainAccounts -ge 1) {
- Section -Style Heading3 "Domain Accounts" {
- Paragraph "The following section details the Domain Accounts configuration for $($HVEnvironment.toUpper()) server."
- BlankLine
- $OutObj = @()
- foreach ($InstantCloneDomainAdmin in $InstantCloneDomainAdmins) {
- try {
- Write-PScriboMessage "Discovered Domain Accounts Information."
- $inObj = [ordered] @{
- 'User Name' = $InstantCloneDomainAdmin.Base.UserName
- 'Domain Name' = $InstantCloneDomainAdmin.NamesData.DnsName
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
-
- $TableParams = @{
- Name = "Domain Accounts - $($HVEnvironment.toUpper())"
- List = $false
- ColumnWidths = 50, 50
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Sort-Object -Property 'User Name' | Table @TableParams
- }
- }
- }
- if ($Domains) {
- if ($InfoLevel.Settings.Servers.vCenterServers.ADDomains -ge 1) {
- Section -Style Heading3 "Connection Server Domain Status" {
- Paragraph "The following section shows connection servers domains for $($HVEnvironment.toUpper()) environment."
- BlankLine
- $OutObj = @()
- foreach ($Domain in $Domains) {
- try {
- Write-PScriboMessage "Discovered Domain Information $($Domain.DNSName)."
- $inObj = [ordered] @{
- 'Domain DNS Name' = $Domain.DNSName
- 'Status' = $Domain.ConnectionServerState[0].Status
- 'Trust Relationship' = $Domain.ConnectionServerState[0].TrustRelationship
- 'Connection Status' = $Domain.ConnectionServerState[0].Contactable
-
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
-
- if ($HealthCheck.DataStores.Status) {
- $OutObj | Where-Object { $_.'Status' -eq 'ERROR' } | Set-Style -Style Warning
- }
-
- $TableParams = @{
- Name = "Connection Server Domain Status- $($HVEnvironment.toUpper())"
- List = $false
- ColumnWidths = 25, 25, 25, 25
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Sort-Object -Property 'Name' | Table @TableParams
- }
- }
- }
- }
-
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZESXi.ps1 b/1.1.5/Src/Private/Get-AbrHRZESXi.ps1
deleted file mode 100644
index 2054e7e..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZESXi.ps1
+++ /dev/null
@@ -1,117 +0,0 @@
-function Get-AbrHRZESXi {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "Esxi Servers InfoLevel set at $($InfoLevel.Settings.Servers.vCenterServers.ESXiHosts)."
- Write-PScriboMessage "Collecting Esxi Servers information."
- }
-
- process {
- try {
- if ($vCenterHealth) {
- if ($InfoLevel.Settings.Servers.vCenterServers.ESXiHosts -ge 1) {
- Section -Style NOTOCHeading5 "ESXi Hosts" {
- Paragraph "The following section details the hardware information of ESXi Hosts for $($HVEnvironment.toUpper()) server."
- BlankLine
- $ESXHosts = $vCenterHealth.hostdata
- foreach ($ESXCLUSTER in ($ESXHosts.ClusterName | Select-Object -Unique)) {
- Section -Style NOTOCHeading5 "$($ESXCLUSTER) Cluster" {
- $OutObj = @()
- try {
- foreach ($ESXHost in ($ESXHosts | Where-Object { $_.ClusterName -eq $ESXCLUSTER })) {
- Write-PScriboMessage "Discovered ESXI Server Information from $($ESXCLUSTER)."
- $inObj = [ordered] @{
- 'Name' = $ESXHost.Name
- 'Version' = $ESXHost.Version
- 'API Version' = $ESXHost.APIVersion
- 'Status' = $ESXHost.Status
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
- if ($HealthCheck.ESXiHosts.Status) {
- $OutObj | Where-Object { $_.'Status' -ne 'CONNECTED' } | Set-Style -Style Warning
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
-
- $TableParams = @{
- Name = "ESXI Hosts - $($ESXCLUSTER)"
- List = $false
- ColumnWidths = 25, 25, 25, 25
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Sort-Object -Property 'Name' | Table @TableParams
- try {
- if ($InfoLevel.Settings.Servers.vCenterServers.ESXiHosts -ge 2) {
- foreach ($ESXHost in ($ESXHosts | Where-Object { $_.ClusterName -eq $ESXCLUSTER })) {
- if ($ESXHost.Name) {
- try {
- Section -ExcludeFromTOC -Style NOTOCHeading6 "$($ESXHost.Name) Details" {
- Write-PScriboMessage "Discovered ESXI Server Information from $($ESXHost.Name)."
- $inObj = [ordered] @{
- 'CPU Cores' = $ESXHost.NumCpuCores
- 'CPU in Mhz' = $ESXHost.CpuMhz
- 'Memory Size' = "$([math]::round($ESXHost.MemorySizeBytes / 1GB))GB"
- 'vGPU Types' = $ESXHost.VGPUTypes
- 'VDI Machines' = $ESXHost.NumMachines
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
-
- $TableParams = @{
- Name = "ESXI Hosts - $($ESXHost.Name)"
- List = $true
- ColumnWidths = 50, 50
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- }
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZEventConf.ps1 b/1.1.5/Src/Private/Get-AbrHRZEventConf.ps1
deleted file mode 100644
index b9198a9..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZEventConf.ps1
+++ /dev/null
@@ -1,147 +0,0 @@
-function Get-AbrHRZEventConf {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "EventDatabase InfoLevel set at $($InfoLevel.Settings.EventConfiguration.EventDatabase)."
- Write-PScriboMessage "Collecting Event Configuration information."
- }
-
- process {
- try {
- if ($EventDataBases -or $Syslog) {
- if ($InfoLevel.Settings.EventConfiguration.PSObject.Properties.Value -ne 0) {
- Section -Style Heading2 "Event Configuration" {
- Paragraph "The following section details on the events configuration information for $($HVEnvironment.toUpper())."
- BlankLine
- if ($InfoLevel.Settings.EventConfiguration.EventDatabase -ge 1) {
- try {
- Section -Style Heading3 "Event Database" {
- $OutObj = @()
- foreach ($EventDataBase in $EventDataBases) {
- Write-PScriboMessage "Discovered Event Database Information."
- $inObj = [ordered] @{
- 'Server' = $EventDataBase.database.Server
- 'Type' = $EventDataBase.database.Type
- 'Port' = $EventDataBase.database.Port
- 'Name' = $EventDataBase.database.Name
- 'User Name' = $EventDataBase.database.UserName
- 'Table Prefix' = $EventDataBase.database.TablePrefix
- 'Show Events for' = $EventDataBase.Settings.ShowEventsForTime
- 'Classify Events as New for' = "$($EventDataBase.Settings.ClassifyEventsAsNewForDays) Days"
- 'Timing Profiler Events' = "$($EventDataBase.Settings.TimingProfilerDataLongevity) Days"
- 'Enabled' = $EventDataBases.EventDatabaseSet
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
-
- if ($HealthCheck.EventConfiguration.EventDatabase) {
- $OutObj | Where-Object { $_.'Enabled' -eq 'No' } | Set-Style -Style Warning -Property 'Enabled'
- }
-
- $TableParams = @{
- Name = "Event Database - $($HVEnvironment.split(".").toUpper()[0])"
- List = $true
- ColumnWidths = 50, 50
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- if ($InfoLevel.Settings.EventConfiguration.Syslog -ge 1 -and $Syslog.UdpData.Enabled) {
- try {
- Section -Style Heading3 "Syslog Configuration" {
- $OutObj = @()
- foreach ($Logging in $Syslog.UdpData.NetworkAddresses) {
- Write-PScriboMessage "Discovered Syslog Information."
- $inObj = [ordered] @{
- 'Server' = $Logging.split(':')[0]
- 'Port' = $Logging.split(':')[1]
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
-
- $TableParams = @{
- Name = "Syslog Configuration - $($HVEnvironment.split(".").toUpper()[0])"
- List = $false
- ColumnWidths = 50, 50
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Sort-Object -Property 'Server' | Table @TableParams
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- if ($InfoLevel.Settings.EventConfiguration.EventstoFileSystem -ge 1 -and ($Syslog.FileData.Enabled -or $Syslog.FileData.EnabledOnError)) {
- try {
- Section -Style Heading3 "Events to File System" {
- $OutObj = @()
- foreach ($Logging in $Syslog) {
- Write-PScriboMessage "Discovered Events to File System Information."
- $inObj = [ordered] @{
- 'Enabled' = $Logging.FileData.Enabled
- 'Enabled on Error' = $Logging.FileData.EnabledOnError
- 'Path' = $Logging.FileData.UncPath
- 'User name' = $Logging.FileData.UncUserName
- 'Domain' = $Logging.FileData.UncDomain
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
-
- $TableParams = @{
- Name = "Events to File System - $($HVEnvironment.split(".").toUpper()[0])"
- List = $true
- ColumnWidths = 50, 50
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZFarm.ps1 b/1.1.5/Src/Private/Get-AbrHRZFarm.ps1
deleted file mode 100644
index 06e322d..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZFarm.ps1
+++ /dev/null
@@ -1,315 +0,0 @@
-function Get-AbrHRZFarm {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "Farm InfoLevel set at $($InfoLevel.Inventory.Farms)."
- Write-PScriboMessage "Collecting Farm information."
- }
-
- process {
- try {
- if ($Farms) {
- if ($InfoLevel.Inventory.Farms -ge 1) {
- Section -Style Heading3 "Farm Pools" {
- Paragraph "The following section details the Farms configuration for $($HVEnvironment.toUpper()[0]) server."
- BlankLine
- $OutObj = @()
- foreach ($Farm in $Farms) {
- Write-PScriboMessage "Discovered Farms Information."
- $inObj = [ordered] @{
- 'Name' = $Farm.Data.displayName
- 'Type' = $Farm.Type
- 'Enabled' = $Farm.Data.Enabled
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
-
- if ($HealthCheck.Farms.Status) {
- $OutObj | Where-Object { $_.'Enabled' -eq 'No' } | Set-Style -Style Warning -Property 'Enabled'
- }
-
- $TableParams = @{
- Name = "Farms - $($HVEnvironment.toUpper()[0])"
- List = $false
- ColumnWidths = 34, 33, 33
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Sort-Object -Property 'Name' | Table @TableParams
- try {
- if ($InfoLevel.Inventory.Farms -ge 2) {
- Section -Style Heading4 "Farm Pools Details" {
- foreach ($Farm in $Farms) {
- Section -Style NOTOCHeading5 $($Farm.Data.name) {
- # Find out Access Group for Applications
- $AccessgroupMatch = $false
- $AccessgroupJoined = @()
- $AccessgroupJoined += $Accessgroups
- $AccessgroupJoined += $Accessgroups.Children
- foreach ($Accessgroup in $AccessgroupJoined) {
- if ($Accessgroup.Id.id -eq $Farm.data.accessgroup.id) {
- $AccessGroupName = $Accessgroup.base.name
- $AccessgroupMatch = $true
- }
- if ($AccessgroupMatch) {
- break
- }
- }
-
- # Farm AD Container
- $FarmContainerName = ''
- if ($Farm.AutomatedFarmData.CustomizationSettings.AdContainer.id) {
- foreach ($ADDomain in $ADDomains) {
- $ADDomainID = ($ADDomain.id.id -creplace '^[^/]*/', '')
- if ($Farm.AutomatedFarmData.CustomizationSettings.AdContainer.id -like "ADContainer/$ADDomainID/*") {
- $ADContainers = $hzServices.ADContainer.ADContainer_ListByDomain($ADDomain.id)
- foreach ($ADContainer in $ADContainers) {
- if ($ADContainer.id.id -eq $Farm.AutomatedFarmData.CustomizationSettings.AdContainer.id) {
- $FarmContainerName = $ADContainer.rdn
- break
- }
- }
- }
- }
- }
-
- # Farm Customization Type
- $Customizations = ('')
- If ($Farm.AutomatedFarmData.CustomizationSettings.SysprepCustomizationSettings.CustomizationSpec) {
- Foreach ($vCenterServer in $vCenterServers) {
- $Customizations = $hzServices.CustomizationSpec.CustomizationSpec_List($vCenterServer.id)
- Foreach ($Customization in $Customizations) {
- if ($Farm.AutomatedFarmData.CustomizationSettings.SysprepCustomizationSettings.CustomizationSpec.id -eq $Customization.id.id) {
- $FarmCustomization = $($Customization.CustomizationSpecData.Name)
- }
- }
- }
- }
-
- try {
- Section -ExcludeFromTOC -Style NOTOCHeading5 "General" {
- $OutObj = @()
- Write-PScriboMessage "Discovered $($Farm.Data.name) General Information."
- $inObj = [ordered] @{
- 'Pool Name' = $Farm.Data.name
- 'Display Name' = $Farm.Data.displayName
- 'Description' = $Farm.Data.description
- 'Access Group' = $AccessGroupName
- 'Type' = $Farm.Type
- 'Source' = $Farm.Source
- 'Enabled' = $Farm.Data.Enabled
- 'Deleting' = $Farm.Data.Deleting
- 'Desktop' = $Farm.Data.Desktop
- 'App Volumes Server' = $Farm.Data.AppVolumesManagerGuid
- 'Default Display Protocol' = $Farm.Data.DisplayProtocolSettings.DefaultDisplayProtocol
- 'Allow Users to Choose Protocol' = $Farm.Data.DisplayProtocolSettings.AllowDisplayProtocolOverride
- 'HTML Access' = $Farm.Data.DisplayProtocolSettings.EnableHTMLAccess
- 'Enable Grid GPUs' = $Farm.Data.DisplayProtocolSettings.EnableGridGpu
- 'vGPU Profile' = $Farm.Data.DisplayProtocolSettings.VGPUGridProfile
- }
-
- $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
-
- if ($HealthCheck.Farms.Status) {
- $OutObj | Where-Object { $_.'Enabled' -eq 'No' } | Set-Style -Style Warning -Property 'Enabled'
- }
-
- $TableParams = @{
- Name = "General Information - $($Farm.Data.name)"
- List = $true
- ColumnWidths = 50, 50
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- try {
- Section -ExcludeFromTOC -Style NOTOCHeading5 "Load Balancing Settings" {
- $OutObj = @()
- Write-PScriboMessage "Discovered $($Farm.Data.name) Load Balancing Settings."
- $inObj = [ordered] @{
- 'Use Custom Script' = $Farm.Data.LbSettings.UseCustomScript
- 'Include Session Count' = $Farm.Data.LbSettings.LbMetricsSettings.IncludeSessionCount
- 'CPU Usage Threshold' = $Farm.Data.LbSettings.LbMetricsSettings.CpuThreshold
- 'Memory Usage Threshold' = $Farm.Data.LbSettings.LbMetricsSettings.MemThreshold
- 'Disk Queue Length Threshold' = $Farm.Data.LbSettings.LbMetricsSettings.DiskQueueLengthThreshold
- 'Disk Read Latency Threshold' = $Farm.Data.LbSettings.LbMetricsSettings.DiskReadLatencyThreshold
- 'Disk Write Latency Threshold' = $Farm.Data.LbSettings.LbMetricsSettings.DiskWriteLatencyThreshold
-
- }
-
- $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
-
- $TableParams = @{
- Name = "Load Balancing Settings - $($Farm.Data.name)"
- List = $true
- ColumnWidths = 50, 50
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- try {
- Section -ExcludeFromTOC -Style NOTOCHeading5 "Provisioning Settings" {
- $OutObj = @()
- Write-PScriboMessage "Discovered $($Farm.Data.name) Settings."
- $inObj = [ordered] @{
- 'Provisioning Enabled' = $Farm.AutomatedFarmData.VirtualCenterProvisioningSettings.EnableProvisioning
- 'Stop Provisioning on Error' = $Farm.AutomatedFarmData.VirtualCenterProvisioningSettings.StopProvisioningOnError
- 'Disconnected Session Timeout Minutes' = $Farm.Data.settings.DisconnectedSessionTimeoutMinutes
- 'Disconnected Session Timeout Policy' = $Farm.Data.settings.DisconnectedSessionTimeoutPolicy
- 'Empty Session Timeout Minutes' = $Farm.Data.settings.EmptySessionTimeoutMinutes
- 'Empty Session Timeout Policy' = $Farm.data.Settings.EmptySessionTimeoutPolicy
- 'Log off After Timeout' = $Farm.data.Settings.LogoffAfterTimeout
- }
-
- $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
-
- if ($HealthCheck.Farms.Status) {
- $OutObj | Where-Object { $_.'Provisioning Enabled' -eq 'No' } | Set-Style -Style Warning -Property 'Provisioning Enabled'
- }
-
- $TableParams = @{
- Name = "Provisioning Settings - $($Farm.Data.name)"
- List = $true
- ColumnWidths = 50, 50
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- try {
- Section -ExcludeFromTOC -Style NOTOCHeading6 "vCenter Server Settings" {
- $OutObj = @()
- Write-PScriboMessage "Discovered $($Farm.Data.name) vCenter Server Settings Information."
- $inObj = [ordered] @{
- 'VM folder' = $Farm.AutomatedFarmData.VirtualCenterNamesData.VmFolderPath
- 'Host Or Cluster Path' = $Farm.AutomatedFarmData.VirtualCenterNamesData.HostOrClusterPath
- 'Resource Pool' = $Farm.AutomatedFarmData.VirtualCenterNamesData.ResourcePoolPath
- 'Golden Image' = $Farm.AutomatedFarmData.VirtualCenterNamesData.ParentVmPath
- 'Snapshot' = $Farm.AutomatedFarmData.VirtualCenterNamesData.SnapshotPath
- 'Datastore Paths' = ($Farm.AutomatedFarmData.VirtualCenterNamesData.DatastorePaths | ForEach-Object { $_.Split('/')[4] }) -join ', '
- 'Networks' = Switch ($Farm.AutomatedFarmData.VirtualCenterNamesData.NetworkLabelNames) {
- $null { 'Golden Image network selected' }
- default { $Farm.AutomatedFarmData.VirtualCenterNamesData.NetworkLabelNames }
- }
- }
-
- $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
-
- $TableParams = @{
- Name = "vCenter Settings - $($Farm.Data.name)"
- List = $true
- ColumnWidths = 50, 50
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
-
- try {
- Section -ExcludeFromTOC -Style NOTOCHeading5 "Guest Customization" {
- $OutObj = @()
- Write-PScriboMessage "Guest Customization $($Farm.Data.name) Settings."
- $inObj = [ordered] @{
- 'Guest Customization' = $Farm.AutomatedFarmData.CustomizationSettings.CustomizationType
- 'Guest Customization Domain and Account' = ($InstantCloneDomainAdmins | Where-Object { $_.Id.id -eq $Farm.AutomatedFarmData.CustomizationSettings.InstantCloneEngineDomainAdministrator.id }).Base.UserName
- 'Allow Reuse of Existing Computer Accounts' = $Farm.AutomatedFarmData.CustomizationSettings.ReusePreExistingAccounts
- 'AD Container' = $FarmContainerName
- 'Farm Customization Specification' = $FarmCustomization
- 'Power Off Script Name' = $Farm.AutomatedFarmData.CustomizationSettings.CloneprepCustomizationSettings.PowerOffScriptName
- 'Power Off Script Parameters' = $Farm.AutomatedFarmData.CustomizationSettings.CloneprepCustomizationSettings.PowerOffScriptParameters
- 'Post Sync Script Name' = $Farm.AutomatedFarmData.CustomizationSettings.CloneprepCustomizationSettings.PostSynchronizationScriptName
- 'Post Sync Script Parameters' = $Farm.AutomatedFarmData.CustomizationSettings.CloneprepCustomizationSettings.PostSynchronizationScriptParameters
- 'Priming Computer Account' = $Farm.AutomatedFarmData.CustomizationSettings.CloneprepCustomizationSettings.PrimingComputerAccount
- }
-
- $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
-
- if ($Farm.AutomatedFarmData.CustomizationSettings.SysprepCustomizationSettings.CustomizationSpec -eq "SYS_PREP") {
- $inObj.Remove('Power Off Script Name')
- $inObj.Remove('Power Off Script Parameters')
- $inObj.Remove('Post Sync Script Name')
- $inObj.Remove('Post Sync Script Parameters')
- $inObj.Remove('Priming Computer Account')
-
- }
-
-
-
- $TableParams = @{
- Name = "Guest Customization - $($Farm.Data.name)"
- List = $true
- ColumnWidths = 50, 50
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
-
-
- }
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZFederationAccessGroup.ps1 b/1.1.5/Src/Private/Get-AbrHRZFederationAccessGroup.ps1
deleted file mode 100644
index 9ce3790..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZFederationAccessGroup.ps1
+++ /dev/null
@@ -1,135 +0,0 @@
-function Get-AbrHRZFederationAccessGroup {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "Role Permissions InfoLevel set at $($InfoLevel.Settings.Administrators.RolePermissions)."
- Write-PScriboMessage "Collecting Role Federation Access Groups information."
- }
-
- process {
- try {
- if ($Permissions) {
- if ($InfoLevel.Settings.Administrators.FederationAccessGroup -ge 1) {
- Section -Style Heading3 "Federation Access Groups" {
- Paragraph "The following section details the Federation Access Group information for $($HVEnvironment.toUpper()) server."
- BlankLine
- $OutObj = @()
-
- $FilteredPermissions = ''
- $FilteredPermissions = $Permissions | Where-Object { $null -ne $_.base.GlobalAccessGroup }
-
- foreach ($Permission in $FilteredPermissions) {
-
- $AdministratorIDNameResults = ''
- # Find Administrator ID Name
- $AdministratorIDName = ''
- $PermissionGroups = $Permission.base.UserOrGroup.id
- foreach ($PermissionGroup in $PermissionGroups) {
- foreach ($Administrator in $Administrators) {
- if ($Administrator.Id.id -eq $PermissionGroup) {
- $AdministratorIDName = $Administrator.base.name
- break
- }
- }
- if ($PermissionGroups.count -gt 1) {
- $AdministratorIDNameResults += "$AdministratorIDName, "
- $AdministratorIDName = $AdministratorIDNameResults.TrimEnd(', ')
- }
- }
- Switch ($AdministratorIDName) {
- '' { $AdministratorIDName = 'N/A' }
- ' ' { $AdministratorIDName = 'N/A' }
- }
-
- # Mach Permission Role ID with Role ID
- # Find Role ID Name
- $RoleIDName = ''
- $PermissionGroups = $Permission.base.Role.id
- foreach ($PermissionGroup in $PermissionGroups) {
-
- foreach ($Role in $Roles) {
- if ($Role.Id.id -eq $PermissionGroup) {
- $RoleIDName = $Role.base.name
- break
- }
-
- }
- if ($PermissionGroups.count -gt 1) {
- $RoleIDNameResults += "$RoleIDName, "
- $RoleIDName = $RoleIDNameResults.TrimEnd(', ')
- $RoleIDName = [string](($RoleIDName.split(', ') | Select-Object -Unique) -join ', ')
- }
- }
-
- # Find AccessGroup ID Name
- $GlobalAccessGroupIDName = ''
- $PermissionGroups = $Permission.base.GlobalAccessGroup.id
- if ($PermissionGroups) {
- foreach ($PermissionGroup in $PermissionGroups) {
- if ($PermissionGroup) {
- if ($GlobalAccessGroups) {
- foreach ($GlobalAccessGroup in $GlobalAccessGroups) {
- if ($GlobalAccessGroup) {
- if ($GlobalAccessGroup.Id.id -eq $PermissionGroup) {
- $GlobalAccessGroupIDName = "/$($GlobalAccessGroup.base.name)"
- } elseif ($GlobalAccessGroup.Children.id.id -eq $PermissionGroup) {
- $GlobalAccessGroupIDName = "/Root/$(($AccessGroup.Children | Where-Object {$_.id.id -eq $PermissionGroup}).Base.Name)"
- }
- $GlobalAccessGroupIDName = $GlobalAccessGroupIDName.TrimStart('/')
- }
- }
- }
- }
- }
- }
- $inObj = [ordered] @{
- 'User or Group Name' = $AdministratorIDName
- 'Role' = $RoleIDName
- 'Global Access Group' = $GlobalAccessGroupIDName
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
- $TableParams = @{
- Name = "Role Permissions - $($HVEnvironment.toUpper())"
- List = $false
- ColumnWidths = 33, 33, 34
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Sort-Object -Property 'User or Group Name' | Table @TableParams
-
-
-
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZGatewayCert.ps1 b/1.1.5/Src/Private/Get-AbrHRZGatewayCert.ps1
deleted file mode 100644
index f8b1244..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZGatewayCert.ps1
+++ /dev/null
@@ -1,66 +0,0 @@
-function Get-AbrHRZGatewayCert {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "Gatway Certificate InfoLevel set at $($InfoLevel.Settings.Servers.ConnectionServers.ConnectionServers)."
- Write-PScriboMessage "Collecting Gatway Certificate information."
- }
-
- process {
- try {
- if ($GatewayCerts) {
- if ($InfoLevel.Settings.CloudPodArch.CloudPodArch -ge 1) {
- Section -Style Heading3 "Gateway Certificate" {
- Paragraph "The following section details on the gateway certificate information for $($HVEnvironment.toUpper())."
- BlankLine
- Write-PScriboMessage "Working on Gateway Certificate Information for $($HVEnvironment.toUpper())."
- $OutObj = @()
- foreach ($GatewayCert in $GatewayCerts) {
- $inObj = [ordered] @{
- 'Certificate Name' = $GatewayCert.CertificateName
- 'Common Name' = $GatewayCert.CommonName
- 'Issuer' = $GatewayCert.Issuer
- 'Expiry Date' = $GatewayCert.ExpiryDate
- 'Serial Number' = $GatewayCert.SerialNum
- }
- $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
- }
- $TableParams = @{
- Name = "Gateway Certificate - $($HVEnvironment.toUpper())"
- List = $true
- ColumnWidths = 30, 70
- }
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZGlobalEntitlement.ps1 b/1.1.5/Src/Private/Get-AbrHRZGlobalEntitlement.ps1
deleted file mode 100644
index f98e1bb..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZGlobalEntitlement.ps1
+++ /dev/null
@@ -1,283 +0,0 @@
-function Get-AbrHRZGlobalEntitlement {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "Global Entitlements InfoLevel set at $($InfoLevel.Inventory.GlobalEntitlements)."
- Write-PScriboMessage "Collecting Global Entitlements information."
- }
-
- process {
- try {
- if ($GlobalEntitlements) {
-
- if ($InfoLevel.Inventory.GlobalEntitlements -ge 1) {
- Section -Style Heading3 "Global Entitlements" {
- Paragraph "The following section details the Global Entitlements configuration for $($HVEnvironment.toUpper()) server."
- BlankLine
-
- $GlobalEntitlements | ForEach-Object { $_ | Add-Member -MemberType NoteProperty -Name "GE_Type" -Value "Desktop" }
- $GlobalApplicationEntitlementGroups | ForEach-Object { $_ | Add-Member -MemberType NoteProperty -Name "GE_Type" -Value "Application" }
- $GlobalEntitlementJoined = @()
- $GlobalEntitlementJoined += $GlobalEntitlements
- $GlobalEntitlementJoined += $GlobalApplicationEntitlementGroups
-
- $OutObj = @()
- foreach ($GlobalEntitlement in $GlobalEntitlementJoined) {
- Write-PScriboMessage "Discovered Global Entitlements Information."
- $GlobalEntitlementPodCount = ($GlobalEntitlement.data.memberpods.id).count
- if ($GlobalEntitlement.Data.LocalApplicationCount) {
- $Type = 'Application'
- } elseif ($GlobalEntitlement.Data.LocalDesktopCount) {
- $Type = 'Desktop'
- }
- $inObj = [ordered] @{
- 'Name' = $GlobalEntitlement.base.DisplayName
- 'Type' = $Type
- 'Number of Pods' = $GlobalEntitlementPodCount
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
-
- $TableParams = @{
- Name = "Global Entitlements - $($HVEnvironment.toUpper())"
- List = $false
- ColumnWidths = 34, 33, 33
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Sort-Object -Property 'Name' | Table @TableParams
-
-
- Section -Style Heading4 "Global Entitlement Summary Details" {
- foreach ($GlobalEntitlement in $GlobalEntitlementJoined) {
-
- Write-PScriboMessage "Discovered Global Entitlements Detailed Information for $($GlobalEntitlement.base.DisplayName)."
- try {
- if ($InfoLevel.Inventory.GlobalEntitlements -ge 2) {
- Section -Style NOTOCHeading5 "Summary - $($GlobalEntitlement.base.DisplayName)" {
-
- $SupportedDisplayProtocolsresult = ''
- $SupportedDisplayProtocols = $GlobalEntitlement.base | ForEach-Object { $_.SupportedDisplayProtocols }
- $SupportedDisplayProtocolsresult = $SupportedDisplayProtocols -join ', '
-
- if ($GlobalEntitlement.Data.LocalApplicationCount) {
- $Type = 'Application'
- } elseif ($GlobalEntitlement.Data.LocalDesktopCount) {
- $Type = 'Desktop'
- }
-
- $GlobalAccessGroupID = $($hzServices.GlobalAccessGroup.GlobalAccessGroup_Get($GlobalEntitlement.base.GlobalAccessGroupId).base.Name)
-
- $OutObj = @()
- Write-PScriboMessage "Discovered Global Entitlement Data for $HVEnvironment"
- $inObj = [ordered] @{
- 'Display Name' = $GlobalEntitlement.base.DisplayName
- 'Alias Name' = $GlobalEntitlement.base.AliasName
- 'Description' = $GlobalEntitlement.base.DisplayName.description
- 'Scope' = $GlobalEntitlement.base.Scope
- 'From Home Site' = $GlobalEntitlement.base.FromHome
- 'Require Home Site' = $GlobalEntitlement.base.RequireHomeSite
- 'Multiple Session Auto Clean' = $GlobalEntitlement.base.MultipleSessionAutoClean
- 'Enabled' = $GlobalEntitlement.base.Enabled
- 'Supported Display Protocols' = $SupportedDisplayProtocolsresult
- 'Default Display Protocol' = $GlobalEntitlement.base.DefaultDisplayProtocol
- 'Allow Users to Choose Display Protocol' = $GlobalEntitlement.base.AllowUsersToChooseProtocol
- 'Allow User to Reset Machines' = $GlobalEntitlement.base.AllowUsersToResetMachines
- 'Enable HTML Access' = $GlobalEntitlement.base.EnableHTMLAccess
- 'Allow Multiple Sessions Per User' = $GlobalEntitlement.base.AllowMultipleSessionsPerUser
- 'Enable Pre-Launch' = $GlobalEntitlement.base.EnablePreLaunch
- 'Connection Server Restrictions' = $GlobalEntitlement.base.ConnectionServerRestrictions
- 'Enable Prelaunch' = $GlobalEntitlement.base.EnablePreLaunch
- 'Category Folder Name' = $GlobalEntitlement.base.CategoryFolderName
- 'Client Restrictions' = $GlobalEntitlement.base.ClientRestrictions
- 'Enable Collaboration' = $GlobalEntitlement.base.EnableCollaboration
- 'Shortcut Locations' = $($GlobalEntitlement.base.ShortcutLocations -join ', ')
- 'Multisession Mode' = $GlobalEntitlement.base.MultiSessionMode
- 'Backup GAE' = $GlobalEntitlement.base.BackupGAE
- 'Display Assigned Machine Name' = $GlobalEntitlement.base.DisplayAssignedMachineName
- 'Display Machine Alias' = $GlobalEntitlement.base.DisplayMachineAlias
- 'Global Access Group ID' = $GlobalAccessGroupID
- }
-
- $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
-
- if ($Type -eq 'Desktop') {
- $inObj.Remove('Enable Pre-Launch')
- $inObj.Remove('Multi Session Mode')
- }
-
-
- if ($Type -eq 'Application') {
- $inObj.Remove('Allow User to Reset Machines')
- $inObj.Remove('Allow Multiple Sessions Per User')
- $inObj.Remove('Enable Collaboration')
- $inObj.Remove('Display Assigned Machine Name')
- $inObj.Remove('Display Machine Alias')
- }
-
-
- $TableParams = @{
- Name = "Detailed Information - $($GlobalEntitlement.base.DisplayName)"
- List = $true
- ColumnWidths = 50, 50
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
-
- try {
- $OutObj = @()
- Section -Style NOTOCHeading6 "Local Pools - $($GlobalEntitlement.base.DisplayName)" {
- try {
- Write-PScriboMessage "Discovered Local Pools Information for $($HVEnvironment.toUpper())."
-
- $GEPodMembers = $GlobalEntitlement.data.MemberPods.id
- $PodSiteID = ('')
-
- Foreach ($GEPodMember in $GEPodMembers) {
- Foreach ($CPSite in $CloudPodLists) {
- If ($CPSite.id.id -eq $GEPodMember) {
- $PodSiteID += $CPSite.DisplayName
- }
- }
- }
-
- $PodMembers = ''
- $PodMembers = ForEach-Object { $PodSiteID }
- $PodMemberList = $PodMembers -join ', '
-
- $inObj = [ordered] @{
- 'Local Desktop Count' = $GlobalEntitlement.data.LocalDesktopCount
- 'Local Application Count' = $GlobalEntitlement.data.LocalApplicationCount
- 'Remote Desktop Count' = $GlobalEntitlement.data.RemoteDesktopCount
- 'Remote Application Count' = $GlobalEntitlement.data.RemoteApplicationCount
- 'User Count' = $GlobalEntitlement.data.UserCount
- 'User or Group Count' = $GlobalEntitlement.data.UserGroupCount
- 'User or Group Site Override Count' = $GlobalEntitlement.data.UserGroupSiteOverrideCount
- 'Member Pods' = $PodMemberList
- }
- $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
-
- if ($Type -eq 'Application') {
- $inObj.Remove('Local Desktop Count')
- $inObj.Remove('Remote Desktop Count')
- }
-
- if ($Type -eq 'Desktop') {
- $inObj.Remove('Local Application Count')
- $inObj.Remove('Remote Application Count')
- }
-
- $TableParams = @{
- Name = "Local Pools - $($HVEnvironment.toUpper())"
- List = $true
- ColumnWidths = 30, 70
- }
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
-
- # Users and Groups
- try {
-
- Section -Style NOTOCHeading6 "Users and Groups - $($GlobalEntitlement.base.DisplayName)" {
- $OutObj = @()
- try {
- Write-PScriboMessage "Discovered Users and Groups - $($GlobalEntitlement.base.DisplayName)."
-
- foreach ($EntitledUserOrGroupGlobal in $EntitledUserOrGroupGlobals) {
- Switch ($EntitledUserOrGroupGlobal.base.Group) {
- 'True' { $GlobalEntitledGroup = 'Group' }
- 'False' { $GlobalEntitledGroup = 'User' }
- }
- $EntitledDefined = @()
-
-
- foreach ($GE in $($EntitledUserOrGroupGlobal.GlobalData.GlobalEntitlements.id -split [Environment]::NewLine)) {
- if ($GlobalEntitlement.Id.id -eq $GE) {
- $EntitledDefined += $EntitledUserOrGroupGlobal
- }
- }
- foreach ($GEA in $($EntitledUserOrGroupGlobal.GlobalData.GlobalApplicationEntitlements.id -split [Environment]::NewLine)) {
- if ($GlobalEntitlement.Id.id -eq $GEA) {
- $EntitledDefined += $EntitledUserOrGroupGlobal
- }
- }
-
- foreach ($ED in $EntitledDefined) {
- $inObj = [ordered] @{
- 'Name' = $ED.Base.Name
- 'User or Group' = $GlobalEntitledGroup
- 'Domain' = $ED.Base.Domain
- }
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
-
- } # End If Group or User
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
-
- $TableParams = @{
- Name = "Users and Groups - $($GlobalEntitlement.base.DisplayName)"
- List = $false
- ColumnWidths = 40, 30, 30
- }
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- }
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZGlobalPolicy.ps1 b/1.1.5/Src/Private/Get-AbrHRZGlobalPolicy.ps1
deleted file mode 100644
index 057c60d..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZGlobalPolicy.ps1
+++ /dev/null
@@ -1,68 +0,0 @@
-function Get-AbrHRZGlobalpolicy {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "Global Policies InfoLevel set at $($InfoLevel.Settings.GlobalPolicies.GlobalPolicies)."
- Write-PScriboMessage "Collecting Global Policies information."
- }
-
- process {
- try {
- if ($GlobalPolicies) {
- if ($InfoLevel.Settings.GlobalPolicies.GlobalPolicies -ge 1) {
- Section -Style Heading2 "Global Policies" {
- Paragraph "The following section details on the Global Policies information for $($HVEnvironment.toUpper())."
- BlankLine
- $OutObj = @()
-
- Write-PScriboMessage "Discovered Global Policies Information."
- $inObj = [ordered] @{
- 'Allow Multimedia Redirection' = $GlobalPolicies.GlobalPolicies.AllowMultimediaRedirection
- 'Allow USB Access' = $GlobalPolicies.GlobalPolicies.AllowUSBAccess
- 'Allow Remote Mode' = $GlobalPolicies.GlobalPolicies.AllowRemoteMode
- 'Allow PCoIP Hardware Acceleration' = $GlobalPolicies.GlobalPolicies.AllowPCoIPHardwareAcceleration
- 'PCoIP Hardware Acceleration Priority' = $GlobalPolicies.GlobalPolicies.PcoipHardwareAccelerationPriority
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
-
- $TableParams = @{
- Name = "Global Policies - $($HVEnvironment.toUpper())"
- List = $true
- ColumnWidths = 50, 50
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZGlobalSetting.ps1 b/1.1.5/Src/Private/Get-AbrHRZGlobalSetting.ps1
deleted file mode 100644
index 5721f62..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZGlobalSetting.ps1
+++ /dev/null
@@ -1,161 +0,0 @@
-function Get-AbrHRZGlobalSetting {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "GlobalSettings InfoLevel set at $($InfoLevel.Settings.GlobalSettings.GlobalSettings)."
- Write-PScriboMessage "Collecting Global Settings information."
- }
-
- process {
- try {
- if ($GlobalSettings.GeneralData) {
- if ($InfoLevel.Settings.GlobalSettings.GlobalSettings -ge 1) {
- Section -Style Heading2 "Global Settings" {
- Paragraph "The following section details the Global Settings configuration for $($HVEnvironment.toUpper()) server."
- BlankLine
- Section -Style Heading3 "General Settings" {
- $OutObj = @()
- Write-PScriboMessage "Discovered Global Settings Information."
- $inObj = [ordered] @{
- 'Client Session Time Out Policy' = $GlobalSettings.GeneralData.ClientIdleSessionTimeoutPolicy
- 'Client Max Session Time Minutes ' = $GlobalSettings.GeneralData.ClientMaxSessionTimeMinutes
- 'Client Idle Session Timeout Policy' = $GlobalSettings.GeneralData.ClientIdleSessionTimeoutPolicy
- 'Client Idle Session Timeout Minutes' = $GlobalSettings.GeneralData.ClientIdleSessionTimeoutMinutes
- 'Client Session Timeout Minutes ' = $GlobalSettings.GeneralData.ClientSessionTimeoutMinutes
- 'Desktop SSO Timeout Policy' = $GlobalSettings.GeneralData.DesktopSSOTimeoutPolicy
- 'Desktop SSO Timeout Minutes' = $GlobalSettings.GeneralData.DesktopSSOTimeoutMinutes
- 'Application SSO Timeout Policy' = $GlobalSettings.GeneralData.ApplicationSSOTimeoutPolicy
- 'Application SSO Timeout Minutes' = $GlobalSettings.GeneralData.ApplicationSSOTimeoutMinutes
- 'View API Session Timeout Minutes' = $GlobalSettings.GeneralData.ViewAPISessionTimeoutMinutes
- 'Pre-Login Message' = $GlobalSettings.GeneralData.PreLoginMessage
- 'Display Warning Before Forced Logoff' = $GlobalSettings.GeneralData.DisplayWarningBeforeForcedLogoff
- 'Forced Logoff Timeout Minutes' = $GlobalSettings.GeneralData.ForcedLogoffTimeoutMinutes
- 'Forced Logoff Message' = $GlobalSettings.GeneralData.ForcedLogoffMessage
- 'Enable Server in Single User Mode' = $GlobalSettings.GeneralData.EnableServerInSingleUserMode
- 'Store CAL on Broker' = $GlobalSettings.GeneralData.StoreCALOnBroker
- 'Store CAL on Client' = $GlobalSettings.GeneralData.StoreCALOnClient
- 'Enable UI User Name Caching' = $GlobalSettings.GeneralData.EnableUIUserNameCaching
- 'Console Session Timeout in Minutes' = $GlobalSettings.GeneralData.ConsoleSessionTimeoutMinutes
- 'Enable Automatic Status Updates' = $GlobalSettings.GeneralData.EnableAutomaticStatusUpdates
- 'Send Domain List' = $GlobalSettings.GeneralData.SendDomainList
- 'Enable Credential Cleanup for HTML Access' = $GlobalSettings.GeneralData.EnableCredentialCleanupForHTMLAccess
- 'Hide Server Information In Client' = $GlobalSettings.GeneralData.HideServerInformationInClient
- 'Hide Domain List In Client' = $GlobalSettings.GeneralData.HideDomainListInClient
- 'Enable Multi Factor Reauthentication' = $GlobalSettings.GeneralData.EnableMultiFactorReAuth
- 'Disconnect Warning Time' = $GlobalSettings.GeneralData.DisconnectWarningTime
- 'Disconnect Warning Message' = $GlobalSettings.GeneralData.DisconnectWarningMessage
- 'Disconnect Message' = $GlobalSettings.GeneralData.DisconnectMessage
- 'Display Pre-login Admin Banner' = $GlobalSettings.GeneralData.DisplayPreLoginAdminBanner
- 'Pre-Login Admin Banner Header' = $GlobalSettings.GeneralData.PreLoginAdminBannerHeader
- 'Pre-Login Admin Banner Message' = $GlobalSettings.GeneralData.PreLoginAdminBannerMessage
- 'Enforce CSRF Protection' = $GlobalSettings.GeneralData.EnorceCSRFProtection
- 'Enforce E2E Encryption' = $GlobalSettings.GeneralData.EnforceE2EEncryption
-
-
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
-
- $TableParams = @{
- Name = "Global Settings - $($HVEnvironment.toUpper())"
- List = $true
- ColumnWidths = 50, 50
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
-
- try {
- if ($InfoLevel.Settings.GlobalSettings.GlobalSettings -ge 2) {
- Section -Style Heading3 "Security Settings" {
- $OutObj = @()
- Write-PScriboMessage "Discovered Security Settings Information."
- $inObj = [ordered] @{
- 'Reauthenticate Secure Tunnel After Interruption' = $GlobalSettings.SecurityData.ReauthSecureTunnelAfterInterruption
- 'Disallow Enhanced Security Mode' = $GlobalSettings.SecurityData.DisallowEnhancedSecurityMode
- 'No Managed Certs' = $GlobalSettings.SecurityData.NoManagedCerts
- 'Message Security Mode' = $GlobalSettings.SecurityData.MessageSecurityMode
- 'Message Security Status' = $GlobalSettings.SecurityData.MessageSecurityStatus
- 'Enable IP Sec for Security Server Pairing' = $GlobalSettings.SecurityData.EnableIPSecForSecurityServerPairing
- }
- $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
-
- $TableParams = @{
- Name = "Security Settings - $($HVEnvironment.toUpper())"
- List = $true
- ColumnWidths = 50, 50
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
-
- try {
- if ($InfoLevel.Settings.GlobalSettings.GlobalSettings -ge 2) {
- Section -Style Heading3 "Client Restriction Settings" {
- $OutObj = @()
- Write-PScriboMessage "Discovered Client Restriction Settings Information."
- foreach ($CLientData in $GlobalSettings.ClientRestrictionConfiguration.ClientData) {
- $inObj = [ordered] @{
- 'Type' = $CLientData.Type
- 'Version' = $CLientData.Version
- 'Warn Specific Versions' = $CLientData.WarnSpecificVersions
- 'Block Specific Versions' = $CLientData.BlockSpecificVersions
- }
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
-
- $TableParams = @{
- Name = "Client Restriction Settings - $($HVEnvironment.toUpper())"
- List = $false
- ColumnWidths = 25, 25, 25, 25
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZHCConnection.ps1 b/1.1.5/Src/Private/Get-AbrHRZHCConnection.ps1
deleted file mode 100644
index 1df6026..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZHCConnection.ps1
+++ /dev/null
@@ -1,81 +0,0 @@
-function Get-AbrHRZHCConnection {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module, Wouter Kursten - Health Check
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "Connection Server Health Check InfoLevel set at $($HealthCheck.Components.ConnectionServers)."
- Write-PScriboMessage "Connection Server Health information."
- }
-
- process {
- try {
- if ($ConnectionServersHealth) {
- if ($HealthCheck.Components.ConnectionServers) {
- Section -Style Heading3 "Connection Server Health Information" {
- Paragraph "The following section details on the connection server health information for $($HVEnvironment.toUpper())."
- BlankLine
- $OutObj = @()
- foreach ($CSHealth in $ConnectionServersHealth) {
- if($CSHealth.CertificateHealth.ExpirationTime -lt ((Get-Date).AddDays(30))) {
- $ConServCertExpiry = "Certificate Expiring Soon"
- } elseif ($CSHealth.CertificateHealth.ExpirationTime -lt (Get-Date)) {
- $ConServCertExpiry = "Certificate Expired"
- } else {
- $ConServCertExpiry = "False"
- }
- if ($CSHealth) {
- Write-PScriboMessage "Connection Server Status Information."
- $inObj = [ordered] @{
- 'Name' = $CSHealth.Name
- 'Status' = $CSHealth.Status
- 'Version' = $CSHealth.Version
- 'Build' = $CSHealth.Build
- 'Cert Valid' = $CSHealth.CertificateHealth.valid
- 'Cert Expiring' = $ConServCertExpiry
- 'Cert Expiry Date' = $CSHealth.CertificateHealth.ExpirationTime
- 'Cert Invalidation Reason' = $CSHealth.CertificateHealth.InvalidationReason
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
- }
-
- $TableParams = @{
- Name = "Connection Server Health Information - $($HVEnvironment.toUpper())"
- List = $false
- ColumnWidths = 16, 8, 10, 16, 6, 10, 20, 14
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZHCDataStore.ps1 b/1.1.5/Src/Private/Get-AbrHRZHCDataStore.ps1
deleted file mode 100644
index 2537f0f..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZHCDataStore.ps1
+++ /dev/null
@@ -1,72 +0,0 @@
-function Get-AbrHRZHCDataStore {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module, Wouter Kursten - Health Check
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "Data Store Health Check InfoLevel set at $($HealthCheck.vSphere.DataStores)."
- Write-PScriboMessage "Data Store Health information."
- }
-
- process {
- try {
- if ($vCenterHealth) {
- if ($HealthCheck.vSphere.DataStores) {
- Section -Style Heading3 "Data Store Health Information" {
- Paragraph "The following section details on the data store health information for $($HVEnvironment.toUpper())."
- BlankLine
- $OutObj = @()
- foreach ($VCHealth in $vCenterHealth){
- foreach ($DSHealth in $VCHealth.DatastoreData){
- Write-PScriboMessage "DataStore Health Status Information."
- $inObj = [ordered] @{
- "Datastore" = $DSHealth.name;
- "Accessible" = $DSHealth.accessible;
- "Path" = $DSHealth.path;
- "Datastore Type" = $DSHealth.datastoreType;
- "Capacity MB" = $DSHealth.capacityMB;
- "Free Space MB" = $DSHealth.freeSpaceMB;
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
- }
-
- $TableParams = @{
- Name = "DataStore Health Information - $($HVEnvironment.toUpper())"
- List = $false
- ColumnWidths = 20, 12, 28, 10, 15, 15
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZHCDomain.ps1 b/1.1.5/Src/Private/Get-AbrHRZHCDomain.ps1
deleted file mode 100644
index 4ad55fb..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZHCDomain.ps1
+++ /dev/null
@@ -1,95 +0,0 @@
-function Get-AbrHRZHCDomain {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module, Wouter Kursten - Health Check
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "Domain Health Check InfoLevel set at $($HealthCheck.OtherComponents.Domains)."
- Write-PScriboMessage "Domain Health information."
- }
-
- process {
- try {
- if ($Domains) {
- if ($HealthCheck.OtherComponents.Domains) {
- Section -Style Heading3 "Domain Health Information" {
- Paragraph "The following section details on the Domain health information for $($HVEnvironment.toUpper())."
- BlankLine
- $OutObj = @()
- foreach ($Domain in $Domains){
- $TrustRel = $Domain.ConnectionServerState[0].TrustRelationship
- $DomainSat = $Domain.ConnectionServerState[0].Status
- $AllTrustRelSame = $true
- $AllDomainStatSame = $true
-
- foreach($CSDomainStatus in $Domain.ConnectionServerState){
- if ($CSDomainStatus.TrustRelationship -ne $TrustRel) {
- $AllTrustRelSame = $false
- break
- }
- if ($CSDomainStatus.Status -ne $DomainSat) {
- $AllDomainStatSame = $false
- break
- }
- }
-
- if ($AllTrustRelSame) {
- $TrustOut = $TrustRel
- } else {
- $TrustOut = "Trust relationships are not identical."
- }
- if ($AllDomainStatSame) {
- $DomainOut = $DomainSat
- } else {
- $DomainOut = "Status is not consistent"
- }
-
- Write-PScriboMessage "Domain Health Status Information."
- $inObj = [ordered] @{
- "Domain Name" = $domain.NetBiosName;
- "Status" = $DomainOut;
- "Trust Relationship" = $TrustOut;
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
-
- }
-
- $TableParams = @{
- Name = "Domain Health Information - $($HVEnvironment.toUpper())"
- List = $false
- ColumnWidths = 30, 35, 35
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZHCESXiHost.ps1 b/1.1.5/Src/Private/Get-AbrHRZHCESXiHost.ps1
deleted file mode 100644
index 6abbc10..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZHCESXiHost.ps1
+++ /dev/null
@@ -1,78 +0,0 @@
-function Get-AbrHRZHCESXiHost {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module, Wouter Kursten - Health Check
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "ESXi Health Check InfoLevel set at $($HealthCheck.vSphere.ESXiHosts)."
- Write-PScriboMessage "ESXi Health information."
- }
-
- process {
- try {
- if ($vCenterHealth) {
- if ($HealthCheck.vSphere.ESXiHosts) {
- Section -Style Heading3 "ESXi Health Information" {
- Paragraph "The following section details on the ESXi health information for $($HVEnvironment.toUpper())."
- BlankLine
- $OutObj = @()
- foreach ($VCHealth in $vCenterHealth){
- foreach ($ESXiHost in $VCHealth.hostData){
- if ($esxihost.vGPUTypes){
- $vGPUTypes= [system.String]::Join(",", $ESXiHost.vGPUTypes)
- }
- else{
- $vGPUTypes="n/a"
- }
- Write-PScriboMessage "ESXi Health Status Information."
- $inObj = [ordered] @{
- "ESXi Host" = $ESXiHost.name;
- "Version" = $ESXiHost.version;
- "API Version" = $ESXiHost.apiVersion;
- "Status" = $ESXiHost.status;
- "cluster Name" = $ESXiHost.clusterName;
- "vGPU Types" = $vGPUTypes;
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
- }
-
- $TableParams = @{
- Name = "ESXi Health Information - $($HVEnvironment.toUpper())"
- List = $false
- ColumnWidths = 30, 10, 10, 20, 15, 15
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZHCEventDataBase.ps1 b/1.1.5/Src/Private/Get-AbrHRZHCEventDataBase.ps1
deleted file mode 100644
index 3eb5e38..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZHCEventDataBase.ps1
+++ /dev/null
@@ -1,75 +0,0 @@
-function Get-AbrHRZHCEventDataBase {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module, Wouter Kursten - Health Check
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "Event Database Health Check InfoLevel set at $($HealthCheck.Components.EventDataBase)."
- Write-PScriboMessage "Event Database Health information."
- }
-
- process {
- try {
- if ($EventDataBaseHealth) {
- if ($HealthCheck.Components.EventDataBase) {
- Section -Style Heading3 "Event Database Health Information" {
- Paragraph "The following section details on the event database health information for $($HVEnvironment.toUpper())."
- BlankLine
- $OutObj = @()
-
- if ($EventDataBaseHealth.configured -eq $true) {
- Write-PScriboMessage "Event Database Status Information."
- $inObj = [ordered] @{
- "Server name" = $EventDataBaseHealth.data.Servername;
- "Port" = $EventDataBaseHealth.data.Port;
- "Status" = $EventDataBaseHealth.data.State;
- "Username" = $EventDataBaseHealth.data.Username;
- "Database Name" = $EventDataBaseHealth.data.DatabaseName
- "Table Prefix" = $EventDataBaseHealth.data.TablePrefix;
- "State" = $EventDataBaseHealth.data.State;
- "Error" = $EventDataBaseHealth.data.Error;
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
-
-
- $TableParams = @{
- Name = "Event Database Health Information - $($HVEnvironment.toUpper())"
- List = $false
- ColumnWidths = 18, 8, 12, 16, 18, 8, 10, 10
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
-
- $OutObj | Table @TableParams
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZHCGatewayServer.ps1 b/1.1.5/Src/Private/Get-AbrHRZHCGatewayServer.ps1
deleted file mode 100644
index 793cd83..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZHCGatewayServer.ps1
+++ /dev/null
@@ -1,119 +0,0 @@
-function Get-AbrHRZHCGatewayServer {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module, Wouter Kursten - Health Check
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "Gateway Server Health Check InfoLevel set at $($HealthCheck.Components.GatewayServer)."
- Write-PScriboMessage "Gateway Server Health information."
- }
-
- process {
- try {
- if ($GatewayServers) {
- if ($HealthCheck.Components.GatewayServer) {
- Section -Style Heading3 "Gateway Server Health Information" {
- Paragraph "The following section details on the gateway server health information for $($HVEnvironment.toUpper())."
- BlankLine
- $OutObj = @()
- foreach ($GWServer in $GatewayServers) {
- if ($GWServer) {
- $Gatewayhealth = $hzServices.GatewayHealth.GatewayHealth_Get($GWServer.id)
- $lastcontact = (([System.DateTimeOffset]::FromUnixTimeMilliSeconds(($Gatewayhealth.LastUpdatedTimestamp)).DateTime).ToString("s"))
- Switch ($Gatewayhealth.GatewayZoneInternal) {
- "False" {$GateayZoneType = "External"}
- "True" {$GateayZoneType = "Internal"}
- Default{$GateayZoneType = "Lost"}
- }
- Switch ($Gatewayhealth.type) {
- "AP" {$GWType = "UAG"}
- "F5" {$GWType = "F5 Load Balanced"}
- Default {$GWType = "Unknown"}
- }
-
- Write-PScriboMessage "Gateway Server Status Information."
- $inObj = [ordered] @{
- "UAG Name" = $Gatewayhealth.name;
- "UAG Address" = $Gatewayhealth.Address;
- "UAG Zone" = $GateayZoneType;
- "UAG Version" = $Gatewayhealth.Version;
- "UAG Type" = $GWType;
- "UAG Active" = $Gatewayhealth.GatewayStatusActive;
- "UAG Stale" = $Gatewayhealth.GatewayStatusStale;
- "UAG Contacted" = $Gatewayhealth.GatewayContacted;
- "UAG Last Contact" = $lastcontact;
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
- }
-
- $TableParams = @{
- Name = "Gateway Server Health Information - $($HVEnvironment.toUpper())"
- List = $false
- ColumnWidths = 16, 10, 10, 10, 12, 8, 8, 12, 14
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
-
- $OutObj | Table @TableParams
-
- #<#
- $OutObj = @()
- foreach ($GWServer in $GatewayServers) {
- if ($GWServer) {
- $Gatewayhealth = $hzServices.GatewayHealth.GatewayHealth_Get($GWServer.id)
- Write-PScriboMessage "Gateway Server Connection Stats Information."
- $inObj = [ordered] @{
- "UAG Name" = $Gatewayhealth.name;
- "UAG Active Connections" = $Gatewayhealth.ConnectionData.NumActiveConnections;
- "UAG Blast Connections" = $Gatewayhealth.ConnectionData.NumBlastConnections;
- "UAG PCOIP Connections" = $Gatewayhealth.ConnectionData.NumPcoipConnections;
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
- }
-
- $TableParams = @{
- Name = "Gateway Server Health Connection Stats Information - $($HVEnvironment.toUpper())"
- List = $false
- ColumnWidths = 25, 25, 25, 25
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
-
- $OutObj | Table @TableParams
- #>
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZHCLicenseService.ps1 b/1.1.5/Src/Private/Get-AbrHRZHCLicenseService.ps1
deleted file mode 100644
index 0cee378..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZHCLicenseService.ps1
+++ /dev/null
@@ -1,79 +0,0 @@
-function Get-AbrHRZHCLicenseService {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module, Wouter Kursten - Health Check
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "License Health Check InfoLevel set at $($HealthCheck.OtherComponents.LicenseService)."
- Write-PScriboMessage "License Health information."
- }
-
- process {
- try {
- if ($ProductLicenseingInfo) {
- if ($HealthCheck.OtherComponents.LicenseService) {
- Section -Style Heading3 "License Health Information" {
- Paragraph "The following section details on the License health information for $($HVEnvironment.toUpper())."
- BlankLine
- $OutObj = @()
-
- $LicensedEditionEdited = $ProductLicenseingInfo.LicenseEdition -replace "_", " "
- $culture = [System.Globalization.CultureInfo]::CurrentCulture
- $textInfo = $culture.TextInfo
- $properCaseLicensedEditionEdited = $textInfo.ToTitleCase($LicensedEditionEdited.ToLower())
-
- # $ProductLicenseingInfo.Licensed
- if ($ProductLicenseingInfo.Licensed -eq $true) {
- $LicStatus = "Okay"
- } else {
- $LicStatus = "Unlicensed"
- }
-
- Write-PScriboMessage "License Health Status Information."
- $inObj = [ordered] @{
- "Status" = $LicStatus;
- "License Key" = $ProductLicenseingInfo.LicenseKey;
- "License Edition" = $properCaseLicensedEditionEdited;
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
-
-
- $TableParams = @{
- Name = "License Health Information - $($HVEnvironment.toUpper())"
- List = $false
- ColumnWidths = 30, 40, 30
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZHCRDSFarm.ps1 b/1.1.5/Src/Private/Get-AbrHRZHCRDSFarm.ps1
deleted file mode 100644
index 95dca31..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZHCRDSFarm.ps1
+++ /dev/null
@@ -1,78 +0,0 @@
-function Get-AbrHRZHCRDSFarm {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module, Wouter Kursten - Health Check
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "RDS Farms Health Check InfoLevel set at $($HealthCheck.RDSFarms.RDSFarms)."
- Write-PScriboMessage "RDS Farms Health information."
- }
-
- process {
- try {
- if ($farms) {
- if ($HealthCheck.RDSFarms.RDSFarms) {
- Section -Style Heading3 "RDS Farms Health Information" {
- Paragraph "The following section details on the RDS farms health information for $($HVEnvironment.toUpper())."
- BlankLine
- $OutObj = @()
- foreach ($Farm in $Farms) {
- if ($Farm) {
- $health=$hzServices.Farmhealth.farmhealth_get($farm.id)
- $farmhealthstatus = $health.health
- $farmname = $farm.data.name
- Write-PScriboMessage "RDS Farms Status Information."
- $inObj = [ordered] @{
- "Farm Name" = $farmname;
- "Farm Health" = $farmhealthstatus;
- "RDS Hostname" = $rdsserver.name;
- "RDS Status" = $rdsserver.status;
- "RDS health" = $rdsserver.health;
- "RDS Available" = $rdsserver.available;
- "RDS Missing Apps" = $missingapps;
- "RDS Load Preference" = $rdsserver.LoadPreference;
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
- }
-
- $TableParams = @{
- Name = "RDS Farms Health Information - $($HVEnvironment.toUpper())"
- List = $false
- ColumnWidths = 14, 8, 16, 8, 12, 10, 10, 12, 12
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
-
- $OutObj | Table @TableParams
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZHCRemotePod.ps1 b/1.1.5/Src/Private/Get-AbrHRZHCRemotePod.ps1
deleted file mode 100644
index b304456..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZHCRemotePod.ps1
+++ /dev/null
@@ -1,80 +0,0 @@
-function Get-AbrHRZHCRemotePod {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module, Wouter Kursten - Health Check
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "Remote Pod Health Check InfoLevel set at $($HealthCheck.RemotePod.RemotePod)."
- Write-PScriboMessage "Remote Pod Health information."
- }
-
- process {
- try {
- if ($CloudPodListsLocal) {
- if ($HealthCheck.RemotePod.RemotePod) {
- Section -Style Heading3 "Remote Pod Health Information" {
- Paragraph "The following section details on the Remote Pod health information for $($HVEnvironment.toUpper())."
- BlankLine
- $OutObj = @()
- foreach ($pod in $CloudPodListsLocal){
- if($pod){
- $endpoints = $hzServices.podhealth.podhealth_get($pod.id).data.endpointhealth
- $PodDetail = $hzServices.pod.pod_get($pod.id)
- $PodName = $PodDetail.DisplayName
- #$PodName = "Pod Name"
- if($endpoints){
- foreach ($endpoint in $endpoints){
-
- Write-PScriboMessage "Remote Pod Health Status Information."
- $inObj = [ordered] @{
- "Status" = $endpoint.EndpointInfo | Select-Object -expandproperty Enabled;
- "Name" = $PodName;
- "Connection Servers" = $endpoint.EndpointInfo | Select-Object -expandproperty Name;
- "Description" = $endpoint | Select-Object -expandproperty State;
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
- }
- }
- $pod = $null
- }
-
- $TableParams = @{
- Name = "Remote Pod Health Information - $($HVEnvironment.toUpper())"
- List = $false
- ColumnWidths = 10, 25, 25, 30
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZHCSAML2.ps1 b/1.1.5/Src/Private/Get-AbrHRZHCSAML2.ps1
deleted file mode 100644
index b85c0b0..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZHCSAML2.ps1
+++ /dev/null
@@ -1,72 +0,0 @@
-function Get-AbrHRZHCSAML2 {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module, Wouter Kursten - Health Check
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "SAML Health Check InfoLevel set at $($HealthCheck.OtherComponents.SAML2)."
- Write-PScriboMessage "SAML Health information."
- }
-
- process {
- try {
- if ($SAMLAuthenticatorhealthlist) {
- if ($HealthCheck.OtherComponents.SAML2) {
- Section -Style Heading3 "SAML Health Information" {
- Paragraph "The following section details on the SAML health information for $($HVEnvironment.toUpper())."
- BlankLine
- $OutObj = @()
- foreach ($SAMLAuthenticatorhealth in $SAMLAuthenticatorhealthlist){
-
- Write-PScriboMessage "SAML Health Status Information."
- $inObj = [ordered] @{
- "Status" = $SAMLAuthenticatorHealthList.ConnectionServerData.Status[0];
- "Authenticator Name" = $SAMLAuthenticatorhealth.data.label;
- "Metadata URL" = $SAMLAuthenticatorhealth.data.MetadataURL;
- "Details" = $SAMLAuthenticatorhealth.data.Description;
- "Admin URL" = $SAMLAuthenticatorhealth.data.AdministratorURL;
- "TrueSSO Trigger Mode" = $SAMLAuthenticatorhealth.data.CertificateSsoTriggerMode;
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
-
- }
-
- $TableParams = @{
- Name = "SAML Health Information - $($HVEnvironment.toUpper())"
- List = $false
- ColumnWidths = 10, 10, 25, 10, 25, 10
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZHCTrueSSO.ps1 b/1.1.5/Src/Private/Get-AbrHRZHCTrueSSO.ps1
deleted file mode 100644
index 71e8b1d..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZHCTrueSSO.ps1
+++ /dev/null
@@ -1,75 +0,0 @@
-function Get-AbrHRZHCTrueSSO {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module, Wouter Kursten - Health Check
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "TrueSSO Health Check InfoLevel set at $($HealthCheck.Components.TrueSSO)."
- Write-PScriboMessage "TrueSSO Health information."
- }
-
- process {
- try {
- if ($CertificateSSOconnectorHealthlist) {
- if ($InfoLevel.settings.servers.ConnectionServers.TrueSSO -ge 1) {
- Section -Style Heading3 "TrueSSO Health Information" {
- Paragraph "The following section details on the TrueSSO information for $($HVEnvironment.toUpper())."
- BlankLine
- $OutObj = @()
- foreach ($CertificateSSOconnectorHealth in $CertificateSSOconnectorHealthlist) {
- if ($CertificateSSOconnectorHealth) {
-
- Write-PScriboMessage "Discovered TrueSSO Information."
- $inObj = [ordered] @{
- 'TrueSSO Name' = $CertificateSSOconnectorHealth.DisplayName
- 'TrueSSO Enabled' = $CertificateSSOconnectorHealth.Enabled
- 'TrueSSO State' = $CertificateSSOconnectorHealth.Data.OverallState
- 'Primary ES' = $CertificateSSOconnectorHealth.Data.PrimaryEnrollmentServerHealth.DnsName
- 'Primary ES State' = $CertificateSSOconnectorHealth.Data.PrimaryEnrollmentServerHealth.State
- 'Primary ES State Reason' = $CertificateSSOconnectorHealth.Data.PrimaryEnrollmentServerHealth.StateReasons
- 'Secondary Enrollment Server' = $CertificateSSOconnectorHealth.Data.SecondaryEnrollmentServerHealth.DnsName
- 'Secondary Enrollment Server State' = $CertificateSSOconnectorHealth.Data.SecondaryEnrollmentServerHealth.State
- 'Secondary Enrollment Server State Reason' = $CertificateSSOconnectorHealth.Data.SecondaryEnrollmentServerHealth.StateReasons
- }
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
- }
-
- $TableParams = @{
- Name = "TrueSSO Health Information - $($HVEnvironment.toUpper())"
- List = $false
- ColumnWidths = 15, 10, 10, 15, 10, 20, 10, 10, 10
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZHCvCenter.ps1 b/1.1.5/Src/Private/Get-AbrHRZHCvCenter.ps1
deleted file mode 100644
index 650f725..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZHCvCenter.ps1
+++ /dev/null
@@ -1,86 +0,0 @@
-function Get-AbrHRZHCvCenter {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module, Wouter Kursten - Health Check
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "vCenter Health Check InfoLevel set at $($HealthCheck.vSphere.vCenter)."
- Write-PScriboMessage "vCenter Health information."
- }
-
- process {
- try {
- if ($vCenterHealth) {
- if ($HealthCheck.vSphere.vcenter) {
- Section -Style Heading3 "vCenter Health Information" {
- Paragraph "The following section details on the vCenter health information for $($HVEnvironment.toUpper())."
- BlankLine
- $OutObj = @()
- foreach ($VCHealth in $vCenterHealth){
- $Name=$VCHealth.data.name
- $TrimmedName = ($Name -replace "https://", "").Split(":")[0].ToLower()
- $version=$VCHealth.data.version
- $build=$VCHealth.data.build
- $apiVersion=$VCHealth.data.apiVersion
-
- foreach ($Connectionserver in $VCHealth.connectionServerData){
- $CertHealth = $Connectionserver.certificateHealth.valid
- if ($CertHealth -eq "True") {
- $CertHealthOUt = "Okay"
- } else {
- $CertHealthOUt = "Invalid"
- }
- Write-PScriboMessage "vCenter Health Status Information."
- $inObj = [ordered] @{
- "Name" = $TrimmedName;
- "Version"=$version;
- "Build"=$build;
- "API Version"=$apiVersion;
- "Connection Server" = $Connectionserver.name;
- "Status" = $Connectionserver.Status;
- "Thumbprint Accepted" = $Connectionserver.thumbprintAccepted;
- "Certificate Health" = $CertHealth;
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
- }
-
- $TableParams = @{
- Name = "vCenter Health Information - $($HVEnvironment.toUpper())"
- List = $false
- ColumnWidths = 20, 7, 15, 10, 12, 10, 13, 13
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZHomeSite.ps1 b/1.1.5/Src/Private/Get-AbrHRZHomeSite.ps1
deleted file mode 100644
index b690aaf..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZHomeSite.ps1
+++ /dev/null
@@ -1,108 +0,0 @@
-function Get-AbrHRZHomeSite {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "Home Site Assignments InfoLevel set at $($InfoLevel.UsersAndGroups.HomeSiteAssignments)."
- Write-PScriboMessage "Collecting Home Site General Information."
- }
-
- process {
- if ($InfoLevel.UsersAndGroups.HomeSiteAssignments -ge 1) {
- try {
- if ($Homesites) {
- Section -Style Heading3 'Home Site' {
- Paragraph "The following section provide a summary of user and group home site configuration."
- BlankLine
- $OutObj = @()
- foreach ($HomeSite in $HomeSites) {
- try {
- # Clear Var
- $HomeSiteUserIDName = ''
- $HomeSiteUserIDDomain = ''
- $HomeSiteUserIDEmail = ''
- $HomeSiteUserIDGroup = ''
- $HomeSiteSiteIDName = ''
- $HomeSiteGlobalEntitlementIDName = ''
- $HomeSiteGlobalApplicationEntitlementIDName = ''
-
- # HomeSite User or Group ID
- if ($HomeSite.Base.UserOrGroup) {
- $HomeSiteUserID = $hzServices.ADUserOrGroup.ADUserOrGroup_Get($homesite.Base.UserOrGroup)
- $HomeSiteUserIDName = $HomeSiteUserID.Base.Name
- $HomeSiteUserIDDomain = $HomeSiteUserID.Base.Domain
- $HomeSiteUserIDEmail = $HomeSiteUserID.Base.Email
- $HomeSiteUserIDGroup = $HomeSiteUserID.Base.Group
- }
-
- # Home Site Site ID
- if ($HomeSite.Base.Site) {
- $HomeSiteSiteID = $hzServices.Site.Site_Get($HomeSite.Base.Site)
- $HomeSiteSiteIDName = $HomeSiteSiteID.base.DisplayName
- }
-
- # Home Site Global Entilement ID
- if ($HomeSite.Base.GlobalEntitlement) {
- $HomeSiteGlobalEntitlementID = $hzServices.GlobalEntitlement.GlobalEntitlement_Get($homesite.Base.GlobalEntitlement)
- $HomeSiteGlobalEntitlementIDName = $HomeSiteGlobalEntitlementID.base.DisplayName
- }
-
- # Home Site Global Application Entilement ID
- if ($HomeSite.Base.GlobalApplicationEntitlement) {
- $HomeSiteGlobalApplicationEntitlementID = $hzServices.GlobalApplicationEntitlement.GlobalApplicationEntitlement_Get($homesite.Base.GlobalApplicationEntitlement)
- $HomeSiteGlobalApplicationEntitlementIDName = $HomeSiteGlobalApplicationEntitlementID.base.DisplayName
- }
- $inObj = [ordered] @{
- 'User or Group Name' = $HomeSiteUserIDName
- 'Domain' = $HomeSiteUserIDDomain
- 'Group' = $HomeSiteUserIDGroup
- 'Email' = $HomeSiteUserIDEmail
- 'Home Site' = $HomeSiteSiteIDName
- 'Global Entitlement' = $HomeSiteGlobalEntitlementIDName
- 'Global Application Entitlement' = $HomeSiteGlobalApplicationEntitlementIDName
- }
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
-
- $TableParams = @{
- Name = "Home Site General - $($HVEnvironment.toUpper())"
- List = $false
- ColumnWidths = 17, 10, 10, 18, 15, 15, 15
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Sort-Object -Property 'User or Group Name' | Table @TableParams
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZInfrastructure.ps1 b/1.1.5/Src/Private/Get-AbrHRZInfrastructure.ps1
deleted file mode 100644
index b78749b..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZInfrastructure.ps1
+++ /dev/null
@@ -1,69 +0,0 @@
-function Get-AbrHRZInfrastructure {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr, Chris Hildebrandt
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "Collecting Infrastructure Summary information."
- }
-
- process {
- try {
- Section -Style NOTOCHeading4 "Executive Summary for $($HVEnvironment.toUpper())" {
- $OutObj = @()
- Write-PScriboMessage "Discovered Infrastructure Summary Information."
- $inObj = [ordered] @{
- 'Number of Local Entitlements' = $EntitledUserOrGroupLocalMachines.Count
- 'Number of Global Entitlements' = $GlobalEntitlements.Count
- 'Number of Desktop Pools' = $Pools.Count
- 'Number of Application Pool' = $Apps.Count
- 'Number of Farms Pools' = $Farms.Count
- 'Number of vCenter Servers' = $vCenterServers.Count
- 'Number of ESXi Hosts' = $Esxhosts.HostData.Count
- 'Number of Datastores' = $Datastores.DatastoreData.Count
- 'Number of Active Directory Domains' = $ADDomains.Count
- 'Number of UAG Servers' = $GatewayServers.Count
- 'Number of Connection Servers' = $connectionservers.Count
- 'Number of Instant Clone Accounts' = $InstantCloneDomainAdmins.Count
- 'Number of RDS Hosts' = $RDSServers.Count
- 'Number of Administrators and Groups' = $Administrators.Count
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
-
- $TableParams = @{
- Name = "Executive Summary - $($HVEnvironment.toUpper())"
- List = $true
- ColumnWidths = 50, 50
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZInstantClone.ps1 b/1.1.5/Src/Private/Get-AbrHRZInstantClone.ps1
deleted file mode 100644
index 4dc4093..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZInstantClone.ps1
+++ /dev/null
@@ -1,70 +0,0 @@
-function Get-AbrHRZInstantClone {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "InstantCloneDomainAccounts InfoLevel set at $($InfoLevel.Settings.InstantClone.InstantCloneDomainAccounts)."
- Write-PScriboMessage "Collecting Instant Clone Domain Accounts information."
- }
-
- process {
- try {
- if ($InstantCloneDomainAdmins) {
- if ($InfoLevel.Settings.InstantClone.InstantCloneDomainAccounts -ge 1) {
- Section -Style Heading3 "Instant Clone Accounts" {
- Paragraph "The following section details the Instant Clone Accounts configuration for $($HVEnvironment.split('.')[0]) server."
- BlankLine
- $OutObj = @()
- foreach ($InstantCloneDomainAdmin in $InstantCloneDomainAdmins) {
- try {
- Write-PScriboMessage "Discovered Instant Clone Accounts Information."
- $inObj = [ordered] @{
- 'User Name' = $InstantCloneDomainAdmin.Base.UserName
- 'Domain Name' = $InstantCloneDomainAdmin.NamesData.DnsName
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
-
- $TableParams = @{
- Name = "Instant Clone Domain Accounts - $($HVEnvironment.split(".").toUpper()[0])"
- List = $false
- ColumnWidths = 50, 50
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Sort-Object -Property 'User Name' | Table @TableParams
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZLicense.ps1 b/1.1.5/Src/Private/Get-AbrHRZLicense.ps1
deleted file mode 100644
index 1ef2514..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZLicense.ps1
+++ /dev/null
@@ -1,167 +0,0 @@
-function Get-AbrHRZLicense {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "ProductLicensingandUsage InfoLevel set at $($InfoLevel.Settings.ProductLicensing.ProductLicensingandUsage)."
- Write-PScriboMessage "Collecting Product Licensing information."
- }
-
- process {
- try {
- if ($ProductLicenseingInfo) {
- if ($InfoLevel.Settings.ProductLicensing.ProductLicensingandUsage -ge 1) {
- Section -Style Heading2 "Product Licensing and Usage" {
- Paragraph "The following section details the product license and usage information for $($HVEnvironment.toUpper()) server."
- BlankLine
-
- Section -Style Heading3 "Licensing" {
- $OutObj = @()
- foreach ($ProductLic in $ProductLicenseingInfo) {
- try {
- Write-PScriboMessage "Discovered Product Licensing Information."
-
- # If $ProductLic.ExpirationTime is null, then the license is perpetual
- $ProductLicExpirationTime = ""
- if ($null -eq $ProductLic.ExpirationTime) {
- $ProductLicExpirationTime = "Perpetual"
- } else {
- $ProductLicExpirationTime = $ProductLic.ExpirationTime.ToShortDateString()
- }
-
- $inObj = [ordered] @{
- 'Is Licensed' = $ProductLic.Licensed
- 'License Key' = $ProductLic.LicenseKey
- 'License Expiration' = $ProductLicExpirationTime
- 'Composer enabled' = $ProductLic.ViewComposerEnabled
- 'Desktop Launching enabled' = $ProductLic.DesktopLaunchingEnabled
- 'Application Launching enabled' = $ProductLic.ApplicationLaunchingEnabled
- 'Instant Clone enabled' = $ProductLic.InstantCloneEnabled
- 'Helpdesk enabled' = $ProductLic.HelpDeskEnabled
- 'Collaboration enabled' = $ProductLic.CollaborationEnabled
- 'License Edition' = $ProductLic.LicenseEdition
- 'License Usage Model' = $ProductLic.UsageModel
- 'License Mode' = $ProductLic.LicenseMode
- 'Grace Period Days' = $ProductLic.GracePeriodDays
- 'Subscription Slice Expiry' = $ProductLic.SubscriptionSliceExpiry
- 'License Health' = $ProductLic.LicenseHealth
- }
-
- $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
- } Catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- $TableParams = @{
- Name = "Licensing - $($HVEnvironment.toUpper())"
- List = $true
- ColumnWidths = 50, 50
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- try {
- $UsageStatisticsInfo = try { $hzServices.UsageStatistics.UsageStatistics_GetLicensingCounters() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
- if ($UsageStatisticsInfo) {
- if ($InfoLevel.Settings.ProductLicensing.ProductLicensingandUsage -ge 2) {
- Section -Style Heading3 "Usage" {
- $OutObj = @()
- foreach ($ProductUsage in $UsageStatisticsInfo.HighestUsage.PSObject.Properties.Name) {
- try {
- Write-PScriboMessage "Discovered Product Licensing Usage Information."
- $inObj = [ordered] @{
- 'Name' = ($ProductUsage -creplace '([A-Z\W_]|\d+)(?
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "Users And Groups InfoLevel set at $($InfoLevel.UsersAndGroups.Entitlements)."
- Write-PScriboMessage "Collecting Users And Groups information."
- }
-
- process {
- if ($InfoLevel.UsersAndGroups.Entitlements -ge 1 -and $EntitledUserOrGroupLocalMachines) {
- try {
- Section -Style Heading3 'Local Entitlements' {
- Paragraph "The following section provide a summary of local user & groups entitlements."
- BlankLine
- $OutObj = @()
- if ($EntitledUserOrGroupLocalMachines) {
- foreach ($EntitledUserOrGroupLocalMachine in $EntitledUserOrGroupLocalMachines) {
- try {
- Switch ($EntitledUserOrGroupLocalMachine.base.Group) {
- 'True' { $EntitledUserOrGroupLocalMachinegroup = 'Group' }
- 'False' { $EntitledUserOrGroupLocalMachinegroup = 'User' }
- }
- Switch ($EntitledUserOrGroupLocalMachinegroup) {
- 'Group' { $UserPrincipalName = $EntitledUserOrGroupLocalMachine.base.Name }
- 'User' { $UserPrincipalName = $EntitledUserOrGroupLocalMachine.base.UserPrincipalName }
- }
- Write-PScriboMessage "Discovered Local Entitlements $($EntitledUserOrGroupLocalMachine.base.UserPrincipalName)."
- $inObj = [ordered] @{
- 'User Principal Name' = $UserPrincipalName
- 'Group or User' = $EntitledUserOrGroupLocalMachinegroup
- 'Desktop Entitlements' = ($EntitledUserOrGrouplocalMachine.localData.Desktops.id).count
- 'Application Entitlements' = ($EntitledUserOrGroupLocalMachine.LocalData.Applications.id).count
- }
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
-
- $TableParams = @{
- Name = "Local Entitlements - $($HVEnvironment.toUpper())"
- List = $false
- ColumnWidths = 55, 15, 15, 15
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Sort-Object -Property 'User Principal Name' | Table @TableParams
-
- if ($InfoLevel.UsersAndGroups.Entitlements -ge 2) {
- Section -Style Heading4 "Local Entitlements Details" {
- Paragraph "The following section detail per user or group local entitlements."
- BlankLine
- try {
- $PoolIDNameResults = ''
- $AppIDNameResults = ''
- foreach ($EntitledUserOrGroupLocalMachine in $EntitledUserOrGroupLocalMachines) {
- try {
- # Find Machine ID Name
- $MachineIDName = ''
- $Entitledlocalmachines = $EntitledUserOrGroupLocalMachine.LocalData.Machines.id
- foreach ($Entitledlocalmachine in $Entitledlocalmachines) {
- foreach ($Machine in $Machines) {
- if ($Machine.Id.id -eq $Entitledlocalmachine) {
- $MachineIDName = $Machine.base.Name
- break
- }
- }
- if ($Entitledlocalmachines.count -gt 1) {
- $MachineIDNameResults += "$MachineIDName, "
- $MachineIDName = $MachineIDNameResults.TrimEnd(', ')
- }
- }
- Switch ($MachineIDName) {
- '' { $MachineIDName = 'N/A' }
- ' ' { $MachineIDName = 'N/A' }
- }
-
- # Find Desktop ID Name
- $PoolIDName = ''
- $Entitledlocalmachines = $EntitledUserOrGrouplocalMachine.localData.Desktops.id
- foreach ($Entitledlocalmachine in $Entitledlocalmachines) {
- foreach ($Pool in $Pools) {
- if ($Pool.Id.id -eq $Entitledlocalmachine) {
- $PoolIDName = $pool.base.Name
- break
- }
- }
- if ($Entitledlocalmachines.count -gt 1) {
- $PoolIDNameResults += "$PoolIDName, "
- $PoolIDName = $PoolIDNameResults.TrimEnd(', ')
- }
- }
-
- # Find App ID Name
- $AppIDName = ''
- $Entitledlocalmachines = $EntitledUserOrGroupLocalMachine.LocalData.Applications.id
- foreach ( $Entitledlocalmachine in $Entitledlocalmachines) {
- foreach ($App in $Apps) {
- if ($App.Id.id -eq $Entitledlocalmachine) {
- $AppIDName = $app.data.DisplayName
- break
- }
-
- }
- if ($Entitledlocalmachines.count -gt 1) {
- $AppIDNameResults += "$AppIDName, "
- $AppIDName = $AppIDNameResults.TrimEnd(', ')
- }
- }
- Switch ($AppIDName) {
- '' { $AppIDName = 'N/A' }
- ' ' { $AppIDName = 'N/A' }
- }
-
- Switch ($EntitledUserOrGroupLocalMachine.base.Group) {
- 'True' { $EntitledUserOrGroupLocalMachinegroup = 'Group' }
- 'False' { $EntitledUserOrGroupLocalMachinegroup = 'User' }
- }
- Section -ExcludeFromTOC -Style NOTOCHeading5 "Local Entitlement Details - $($EntitledUserOrGroupLocalMachine.base.Name)" {
- $OutObj = @()
- try {
- Write-PScriboMessage "Local Entitlements Details for $($EntitledUserOrGroupLocalMachine.base.Name)."
- $inObj = [ordered] @{
- 'Name' = $EntitledUserOrGroupLocalMachine.base.Name
- 'Group or User' = $EntitledUserOrGroupLocalMachinegroup
- 'Domain' = $EntitledUserOrGroupLocalMachine.base.Domain
- 'Ad Distinguished Name' = $EntitledUserOrGroupLocalMachine.base.AdDistinguishedName
- 'First Name' = $EntitledUserOrGroupLocalMachine.base.FirstName
- 'Last Name' = $EntitledUserOrGroupLocalMachine.base.LastName
- 'Login Name' = $EntitledUserOrGroupLocalMachine.base.LoginName
- 'Display Name' = $EntitledUserOrGroupLocalMachine.base.DisplayName
- 'Long Display Name' = $EntitledUserOrGroupLocalMachine.base.LongDisplayName
- 'Email' = $EntitledUserOrGroupLocalMachine.base.Email
- 'Kiosk User' = $EntitledUserOrGroupLocalMachine.base.KioskUser
- 'Phone' = $EntitledUserOrGroupLocalMachine.base.Phone
- 'Description' = $EntitledUserOrGroupLocalMachine.base.Description
- 'In Folder' = $EntitledUserOrGroupLocalMachine.base.InFolder
- 'User Principal Name' = $EntitledUserOrGroupLocalMachine.base.UserPrincipalName
- 'Local Machines' = $MachineIDName
- 'Local User Persistent Disks' = $EntitledUserOrGroupLocalMachine.LocalData.PersistentDisks
- 'Local Desktops' = $PoolIDName
- 'User Applications' = $AppIDName
- }
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
-
- $TableParams = @{
- Name = "Local Entitlements Details - $($EntitledUserOrGroupLocalMachine.base.Name)"
- List = $True
- ColumnWidths = 50, 50
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
-
- $OutObj | Table @TableParams
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZMachine.ps1 b/1.1.5/Src/Private/Get-AbrHRZMachine.ps1
deleted file mode 100644
index 3432de3..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZMachine.ps1
+++ /dev/null
@@ -1,69 +0,0 @@
-function Get-AbrHRZMachine {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "Machine InfoLevel set at $($InfoLevel.Inventory.Machines)."
- Write-PScriboMessage "Collecting Machine information."
- }
-
- process {
- try {
- if ($Machines) {
- if ($InfoLevel.Inventory.Machines -ge 1) {
- Section -Style Heading3 "Machines" {
- Paragraph "The following section details on all of the machine information for $($HVEnvironment.toUpper())."
- BlankLine
- Write-PScriboMessage "Working on Machines Information for $($HVEnvironment.toUpper())."
- Section -Style Heading4 "vCenter Machine Summary" {
- $OutObj = @()
- foreach ($Machine in $Machines) {
- $inObj = [ordered] @{
- 'Machine Name' = $Machine.Base.Name
- 'Agent Version' = $Machine.Base.AgentVersion
- 'User' = $Machine.Base.User
- 'Host' = $Machine.ManagedMachineData.VirtualCenterData.Hostname
- 'Data Store' = $Machine.ManagedMachineData.VirtualCenterData.VirtualDisks.DatastorePath
- 'Basic State' = $Machine.Base.BasicState
- }
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
- $TableParams = @{
- Name = "vCenter Machine Summary - $($HVEnvironment.toUpper())"
- List = $false
- ColumnWidths = 15, 10, 20, 25, 15, 15
- }
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZRegisteredMachine.ps1 b/1.1.5/Src/Private/Get-AbrHRZRegisteredMachine.ps1
deleted file mode 100644
index f733458..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZRegisteredMachine.ps1
+++ /dev/null
@@ -1,151 +0,0 @@
-function Get-AbrHRZRegisteredMachine {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "RegisteredMachines InfoLevel set at $($InfoLevel.Settings.RegisteredMachines.RDSHosts)."
- Write-PScriboMessage "Collecting Registered Machines information."
- }
-
- process {
- try {
- if ($RDSServers) {
- if ($InfoLevel.Settings.RegisteredMachines.RDSHosts -ge 1) {
- Section -Style Heading2 "Registered Machines" {
- Paragraph "The following section provides information of Registered Machines for $($HVEnvironment.toUpper()) server."
- BlankLine
- Section -Style Heading3 'RDS Hosts' {
- Paragraph "The following section details the RDS Hosts configuration for $($HVEnvironment.toUpper()) server."
- BlankLine
- $OutObj = @()
- foreach ($RDSServer in $RDSServers) {
- Write-PScriboMessage "Discovered RDS Hosts Information."
- $inObj = [ordered] @{
- 'Name' = $RDSServer.base.name
- 'Farm Name' = $RDSServer.SummaryData.FarmName
- 'Status' = $RDSServer.runtimedata.Status
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
-
- if ($HealthCheck.RegisteredMachines.Status) {
- $OutObj | Where-Object { $_.'Status' -ne 'AVAILABLE' } | Set-Style -Style Warning
- }
-
- $TableParams = @{
- Name = "RDS Hosts - $($HVEnvironment.toUpper())"
- List = $false
- ColumnWidths = 34, 33, 33
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- try {
- if ($InfoLevel.Settings.RegisteredMachines.RDSHosts -ge 2) {
- Section -Style Heading4 'RDS Hosts Details' {
- foreach ($RDSServer in $RDSServers) {
- Write-PScriboMessage "Discovered RDS Host $($RDSServer.base.name) Information."
- $OutObj = @()
- Section -ExcludeFromTOC -Style NOTOCHeading6 $RDSServer.Base.Name {
- $inObj = [ordered] @{
- 'Name' = $RDSServer.base.name
- 'Description' = $RDSServer.base.Description
- 'Farm Name' = $RDSServer.SummaryData.FarmName
- 'Desktop Pool Name' = $RDSServer.SummaryData.DesktopName
- 'Farm Type' = $RDSServer.SummaryData.FarmType
- 'Access Group' = $RDSServerAccessgroup
- 'Message Security Mode' = $RDSServer.MessageSecurityData.MessageSecurityMode
- 'Message Security Enhanced Mode Supported' = $RDSServer.MessageSecurityData.MessageSecurityEnhancedModeSupported
- 'Operating System' = $RDSServer.agentdata.OperatingSystem
- 'Agent Version' = $RDSServer.agentdata.AgentVersion
- 'Agent Build Number' = $RDSServer.agentdata.AgentBuildNumber
- 'Remote Experience Agent Version' = $RDSServer.agentdata.RemoteExperienceAgentVersion
- 'Remote Experience Agent Build Number' = $RDSServer.agentdata.RemoteExperienceAgentBuildNumber
- 'Max Sessions Type' = $RDSServer.settings.SessionSettings.MaxSessionsType
- 'Max Sessions Set By Admin' = $RDSServer.settings.SessionSettings.MaxSessionsSetByAdmin
- 'Agent Max Sessions Type' = $RDSServer.settings.AgentMaxSessionsData.MaxSessionsType
- 'Agent Max Sessions Set By Admin' = $RDSServer.settings.AgentMaxSessionsData.MaxSessionsSeenByAgent
- 'Enabled' = $RDSServer.settings.enabled
- 'Status' = $RDSServer.runtimedata.Status
- }
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
-
- $TableParams = @{
- Name = "RDS Host - $($RDSServer.base.name)"
- List = $true
- ColumnWidths = 50, 50
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
-
- if ($RegisteredPhysicalMachines) {
- Section -Style Heading3 'Others' {
- Paragraph "The following section details the RDS Hosts configuration for $($HVEnvironment.toUpper()) server."
- BlankLine
- $OutObj = @()
- foreach ($RegisteredPhysicalMachine in $RegisteredPhysicalMachines) {
- Write-PScriboMessage "Other Registerd Machines"
- $inObj = [ordered] @{
- 'Name' = $RegisteredPhysicalMachines.MachineBase.name
- 'DNS Name' = $RegisteredPhysicalMachines.MachineBase.DnsName
- 'Description' = $RegisteredPhysicalMachines.MachineBase.Description
- 'OperatingSystem' = $RegisteredPhysicalMachines.MachineBase.Description
- }
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
- if ($HealthCheck.RegisteredMachines.Status) {
- $OutObj | Where-Object { $_.'Status' -ne 'AVAILABLE' } | Set-Style -Style Warning
- }
- $TableParams = @{
- Name = "Other Registered Machines - $($HVEnvironment.toUpper())"
- List = $false
- ColumnWidths = 20, 20, 30, 30
- }
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- }
- }
- }
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZRolePermission.ps1 b/1.1.5/Src/Private/Get-AbrHRZRolePermission.ps1
deleted file mode 100644
index 75e80dd..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZRolePermission.ps1
+++ /dev/null
@@ -1,132 +0,0 @@
-function Get-AbrHRZRolePermission {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "Role Permissions InfoLevel set at $($InfoLevel.Settings.Administrators.RolePermissions)."
- Write-PScriboMessage "Collecting Role Permissions information."
- }
-
- process {
- try {
- if ($Permissions) {
- if ($InfoLevel.Settings.Administrators.RolePermissions -ge 1) {
- Section -Style Heading3 "Role Permissions" {
- Paragraph "The following section details the Role Permissions information for $($HVEnvironment.toUpper()) server."
- BlankLine
- $OutObj = @()
-
- $FilteredPermissions = ''
- $FilteredPermissions = $Permissions | Where-Object { $null -eq $_.base.GlobalAccessGroup }
-
- foreach ($Permission in $FilteredPermissions) {
- Write-PScriboMessage "Discovered Role Permissions Information."
- $AdministratorIDNameResults = ''
- # Find Administrator ID Name
- $AdministratorIDName = ''
- $PermissionGroups = $Permission.base.UserOrGroup.id
- foreach ($PermissionGroup in $PermissionGroups) {
- foreach ($Administrator in $Administrators) {
- if ($Administrator.Id.id -eq $PermissionGroup) {
- $AdministratorIDName = $Administrator.base.name
- break
- }
- }
- if ($PermissionGroups.count -gt 1) {
- $AdministratorIDNameResults += "$AdministratorIDName, "
- $AdministratorIDName = $AdministratorIDNameResults.TrimEnd(', ')
- }
- }
- Switch ($AdministratorIDName) {
- '' { $AdministratorIDName = 'N/A' }
- ' ' { $AdministratorIDName = 'N/A' }
- }
-
- # Mach Permission Role ID with Role ID
- # Find Role ID Name
- $RoleIDName = ''
- $PermissionGroups = $Permission.base.Role.id
- foreach ($PermissionGroup in $PermissionGroups) {
-
- foreach ($Role in $Roles) {
- if ($Role.Id.id -eq $PermissionGroup) {
- $RoleIDName = $Role.base.name
- break
- }
-
- }
- if ($PermissionGroups.count -gt 1) {
- $RoleIDNameResults += "$RoleIDName, "
- $RoleIDName = $RoleIDNameResults.TrimEnd(', ')
- $RoleIDName = [string](($RoleIDName.split(', ') | Select-Object -Unique) -join ', ')
- }
- }
-
- # Find AccessGroup ID Name
- $AccessGroupIDNameResults = ''
- $AccessGroupIDName = ''
- $PermissionGroups = $Permission.base.AccessGroup.id
- foreach ($PermissionGroup in $PermissionGroups) {
- foreach ($AccessGroup in $AccessGroups) {
- if ($AccessGroup.Id.id -eq $PermissionGroup) {
- $AccessGroupIDName = "/$($AccessGroup.base.name)"
- } elseif ($AccessGroup.Children.id.id -eq $PermissionGroup) {
- $AccessGroupIDName = "/Root/$(($AccessGroup.Children | Where-Object {$_.id.id -eq $PermissionGroup}).Base.Name)"
- } else {
- $AccessGroupIDName = "Federation Access Group"
- }
- }
- if ($PermissionGroups.count -gt 1) {
- $AccessGroupIDNameResults += "$AccessGroupIDName, "
- $AccessGroupIDName = $AccessGroupIDNameResults.TrimEnd(', ')
- }
- }
-
- $inObj = [ordered] @{
- 'User or Group Name' = $AdministratorIDName
- 'Role' = $RoleIDName
- 'Access Group' = $AccessGroupIDName
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
-
- $TableParams = @{
- Name = "Role Permissions - $($HVEnvironment.toUpper())"
- List = $false
- ColumnWidths = 33, 33, 34
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Sort-Object -Property 'User or Group Name' | Table @TableParams
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZRolePrivilege.ps1 b/1.1.5/Src/Private/Get-AbrHRZRolePrivilege.ps1
deleted file mode 100644
index a101103..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZRolePrivilege.ps1
+++ /dev/null
@@ -1,95 +0,0 @@
-function Get-AbrHRZRolePrivilege {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "Role Provilege InfoLevel set at $($InfoLevel.Settings.Administrators.RolePrivileges)."
- Write-PScriboMessage "Collecting Role Provilege information."
- }
-
- process {
- try {
- if ($Roles) {
- if ($InfoLevel.Settings.Administrators.RolePrivileges -ge 1) {
- Section -Style Heading3 "Role Privileges" {
- Paragraph "The following section details the Role Privileges information for $($HVEnvironment.toUpper()) server."
- BlankLine
- $OutObj = @()
- foreach ($Role in $Roles) {
- Write-PScriboMessage "Discovered Role Provilege Information."
- $inObj = [ordered] @{
- 'Name' = $Role.base.Name
- 'Description' = $Role.base.Description
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
-
- $TableParams = @{
- Name = "Role Privileges - $($HVEnvironment.toUpper())"
- List = $false
- ColumnWidths = 50, 50
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Sort-Object -Property 'Name' | Table @TableParams
- }
- if ($InfoLevel.Settings.Administrators.RolePrivileges -ge 2) {
- Section -Style Heading4 "Role Privileges Details" {
- Paragraph "The following section details the Role Privilege details for information for $($HVEnvironment.toUpper()) server."
- BlankLine
- $OutObj = @()
- foreach ($Role in $Roles) {
- Write-PScriboMessage "Discovered Role Provilege Detailed Information for $($HVEnvironment.toUpper()) server."
- $inObj = [ordered] @{
- 'Name' = $Role.base.Name
- 'Description' = [string]::join("`n", $($Role.base.Privileges))
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
-
- $TableParams = @{
- Name = "Role Privileges Details - $($Role.base.Name)"
- List = $false
- ColumnWidths = 50, 50
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Sort-Object -Property 'Name' | Table @TableParams
- }
- }
-
-
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZSite.ps1 b/1.1.5/Src/Private/Get-AbrHRZSite.ps1
deleted file mode 100644
index ec36be0..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZSite.ps1
+++ /dev/null
@@ -1,79 +0,0 @@
-function Get-AbrHRZSite {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "Site InfoLevel set at $($InfoLevel.Settings.Sites.Sites)."
- Write-PScriboMessage "Collecting Cloud Pod Site information."
- }
-
- process {
- try {
- if ($CloudPodSites) {
- if ($InfoLevel.Settings.Sites.Sites -ge 1) {
- Section -Style Heading2 "Site" {
- Paragraph "The following section details on the Cloud Pod Site information for $($HVEnvironment.toUpper())."
- BlankLine
- $OutObj = @()
- foreach ($CloudPodSite in $CloudPodSites) {
-
- # Find CloudPod Info
- foreach ($CloudPodList in $CloudPodLists) {
- if ($CloudPodList.Id.id -eq $CloudPodSite.pods.id) {
- $CloudPodDisplayName = $CloudPodList.DisplayName
- break
- } # if($AccessGroup.Id.id -eq $RDSServers.base.accessgroup.id)
- } # Close out foreach($AccessGroup in $AccessGroups)
-
-
- Write-PScriboMessage "Discovered Site Information."
- $inObj = [ordered] @{
- 'Cloud Pod Sites Name' = $CloudPodSite.base.DisplayName
- 'Cloud Pod Sites Description' = $CloudPodSite.base.Description
- 'Cloud Pod Site Pod Name' = $CloudPodDisplayName
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
-
- $TableParams = @{
- Name = "Site - $($HVEnvironment.toUpper())"
- List = $true
- ColumnWidths = 50, 50
- }
-
- if ($Report.ShowTableCaptions) {
- #$TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
-
-
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZTSSO.ps1 b/1.1.5/Src/Private/Get-AbrHRZTSSO.ps1
deleted file mode 100644
index f89129c..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZTSSO.ps1
+++ /dev/null
@@ -1,91 +0,0 @@
-function Get-AbrHRZTSSO {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "TrueSSO InfoLevel set at $($InfoLevel.Settings.Servers.ConnectionServers.TrueSSO)."
- Write-PScriboMessage "TrueSSO information."
- }
-
- process {
- try {
- if ($CertificateSSOconnectorHealthlist) {
- if ($InfoLevel.settings.servers.ConnectionServers.TrueSSO -ge 1) {
- Section -Style Heading3 "TrueSSO Information" {
- Paragraph "The following section details on the TrueSSO information for $($HVEnvironment.toUpper())."
- BlankLine
- $OutObj = @()
- foreach ($CertificateSSOconnectorHealth in $CertificateSSOconnectorHealthlist) {
- if ($CertificateSSOconnectorHealth) {
-
- Write-PScriboMessage "Discovered TrueSSO Information."
- $inObj = [ordered] @{
- 'TrueSSO Name' = $CertificateSSOconnectorHealth.DisplayName
- 'TrueSSO Enabled' = $CertificateSSOconnectorHealth.Enabled
- 'TrueSSO State' = $CertificateSSOconnectorHealth.Data.OverallState
- 'Primary Enrollment Server' = $CertificateSSOconnectorHealth.Data.PrimaryEnrollmentServerHealth.DnsName
- 'Primary Enrollment Server State' = $CertificateSSOconnectorHealth.Data.PrimaryEnrollmentServerHealth.State
- 'Primary Enrollment Server State Reason' = $CertificateSSOconnectorHealth.Data.PrimaryEnrollmentServerHealth.StateReasons
- 'Secondary Enrollment Server' = $CertificateSSOconnectorHealth.Data.SecondaryEnrollmentServerHealth.DnsName
- 'Secondary Enrollment Server State' = $CertificateSSOconnectorHealth.Data.SecondaryEnrollmentServerHealth.State
- 'Secondary Enrollment Server State Reason' = $CertificateSSOconnectorHealth.Data.SecondaryEnrollmentServerHealth.StateReasons
- 'Template Name' = $CertificateSSOconnectorHealth.Data.TemplateHealth.name
- 'Template State' = $CertificateSSOconnectorHealth.Data.TemplateHealth.State
- 'Template Primary Enrollment Server State Reason' = $CertificateSSOconnectorHealth.Data.TemplateHealth.PrimaryEnrollmentServerStateReasons
- 'Template Secondary Enrollment Server State Reason' = $CertificateSSOconnectorHealth.Data.TemplateHealth.SecondaryEnrollmentServerStateReasons
- 'Certificate Server Name' = $CertificateSSOconnectorHealth.Data.CertificateServerHealths.Name
- 'Certificate Server State' = $CertificateSSOconnectorHealth.Data.CertificateServerHealths.State
- 'Certificate Server Primary Enrollment Server State Reason' = $CertificateSSOconnectorHealth.Data.CertificateServerHealths.PrimaryEnrollmentServerStateReasons
- 'Certificate Server Secondary Enrollment Server State Reason' = $CertificateSSOconnectorHealth.Data.CertificateServerHealths.SecondaryEnrollmentServerStateReasons
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- }
- if (-not $CertificateSSOconnectorHealth.Data.SecondaryEnrollmentServerHealth.DnsName) {
- $inObj.Remove('Secondary Enrollment Server')
- $inObj.Remove('Secondary Enrollment Server State')
- $inObj.Remove('Secondary Enrollment Server State Reason')
- $inObj.Remove('Template Secondary Enrollment Server State Reason')
- $inObj.Remove('Certificate Server Secondary Enrollment Server State Reason')
- }
- }
-
- $TableParams = @{
- Name = "TrueSSO Information - $($HVEnvironment.toUpper())"
- List = $true
- ColumnWidths = 50, 50
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZUAG.ps1 b/1.1.5/Src/Private/Get-AbrHRZUAG.ps1
deleted file mode 100644
index 5b82b9f..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZUAG.ps1
+++ /dev/null
@@ -1,76 +0,0 @@
-function Get-AbrHRZUAG {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "SecurityServers InfoLevel set at $($InfoLevel.Settings.Servers.vCenterServers.ADDomains)."
- Write-PScriboMessage "Collecting Gateway Servers information."
- }
-
- process {
- try {
- if ($GatewayServers) {
- if ($InfoLevel.Settings.Servers.UAG.UAGServers -ge 1) {
- Section -Style Heading3 "Gateway Servers" {
- Paragraph "The following section details the Gateway Servers information for $($HVEnvironment.toUpper())."
- BlankLine
- $OutObj = @()
- foreach ($GatewayServer in $GatewayServers.GeneralData) {
- try {
- Write-PScriboMessage "Discovered UAG Information $($GatewayServer.Name)."
- Switch ($GatewayServer.Type) {
- 'AP' { $GatewayType = 'UAG' }
- }
- $inObj = [ordered] @{
- 'Name' = $GatewayServer.Name
- 'IP' = $GatewayServer.Address
- 'Version' = $GatewayServer.Version
- 'Type' = $GatewayType
- 'Zone Internal' = $GatewayServer.GatewayZoneInternal
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
-
- $TableParams = @{
- Name = "Gateway Servers - $($HVEnvironment.toUpper())"
- List = $false
- ColumnWidths = 35, 20, 15, 15, 15
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Sort-Object -Property 'Name' | Table @TableParams
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZUnauthenticatedACL.ps1 b/1.1.5/Src/Private/Get-AbrHRZUnauthenticatedACL.ps1
deleted file mode 100644
index 7ccaaeb..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZUnauthenticatedACL.ps1
+++ /dev/null
@@ -1,92 +0,0 @@
-function Get-AbrHRZUnauthenticatedACL {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "UnauthenticatedAccess InfoLevel set at $($InfoLevel.UsersAndGroups.UnauthenticatedAccess)."
- Write-PScriboMessage "Collecting Unauthenticated Access Information."
- }
-
- process {
- if ($InfoLevel.UsersAndGroups.UnauthenticatedAccess -ge 1) {
- try {
- if ($unauthenticatedAccessList) {
- Section -Style Heading3 "Unauthenticated Access" {
- Paragraph "The following section provide a summary of user and group unauthenticated access configuration."
- BlankLine
- $OutObj = @()
- foreach ($unauthenticatedAccess in $unauthenticatedAccessList) {
- try {
- # User Info
- try {
- $unauthenticatedAccessUserIDName = ''
- if ($unauthenticatedAccess.userdata.UserId) {
- $unauthenticatedAccessUserID = $hzServices.ADUserOrGroup.ADUserOrGroup_Get($unauthenticatedAccess.userdata.UserId)
- $unauthenticatedAccessUserIDName = $unauthenticatedAccessUserID.Base.DisplayName
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- # Pod Info
- try {
- $unauthenticatedAccessPodListName = ''
- if ($unauthenticatedAccess.SourcePods) {
- $unauthenticatedAccessPodList = $CloudPodLists | Where-Object { $_.id.id -eq $unauthenticatedAccess.SourcePods.Id }
- $unauthenticatedAccessPodListName = $unauthenticatedAccessPodList.DisplayName
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
-
- $inObj = [ordered] @{
- 'Login Name' = $unauthenticatedAccess.userdata.LoginName
- 'User ID' = $unauthenticatedAccessUserIDName
- 'Description' = $unauthenticatedAccess.userdata.Description
- 'Hybrid Logon' = $unauthenticatedAccess.userdata.HybridLogonConfig
- 'Pod Name' = $unauthenticatedAccessPodListName
- }
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
-
- $TableParams = @{
- Name = "Unauthenticated Access - $($HVEnvironment.toUpper())"
- List = $false
- ColumnWidths = 20, 20, 20, 20, 20
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Sort-Object -Property 'Login Name' | Table @TableParams
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-AbrHRZVcenter.ps1 b/1.1.5/Src/Private/Get-AbrHRZVcenter.ps1
deleted file mode 100644
index 7c50f6f..0000000
--- a/1.1.5/Src/Private/Get-AbrHRZVcenter.ps1
+++ /dev/null
@@ -1,161 +0,0 @@
-function Get-AbrHRZVcenter {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- [CmdletBinding()]
- param (
- )
-
- begin {
- Write-PScriboMessage "vCenterServers InfoLevel set at $($InfoLevel.Settings.Servers.vCenterServers.vCenter)."
- Write-PScriboMessage "Collecting vCenterServers information."
- }
-
- process {
- try {
- if ($vCenterServers) {
- if ($InfoLevel.Settings.Servers.vCenterServers.vCenter -ge 1) {
- Section -Style Heading3 "vCenter Servers" {
- Paragraph "The following section details the vCenter Servers configuration for $($HVEnvironment.toUpper()) server."
- BlankLine
- $vCenterHealthData = $vCenterHealth.data
- $OutObj = @()
- foreach ($vCenterServer in $vCenterServers) {
- try {
- Write-PScriboMessage "Discovered Virtual Centers Information $($vCenterServer.serverspec.ServerName)."
- $inObj = [ordered] @{
- 'Name' = $vCenterServer.serverspec.ServerName
- 'Version' = ($vCenterHealthData | Where-Object { $_.InstanceUuid -eq $vCenterServer.InstanceUuid }).Version
- 'Build Number' = ($vCenterHealthData | Where-Object { $_.InstanceUuid -eq $vCenterServer.InstanceUuid }).Build
- 'API Version' = ($vCenterHealthData | Where-Object { $_.InstanceUuid -eq $vCenterServer.InstanceUuid }).ApiVersion
- 'Provisioning Enabled' = ConvertTo-TextYN $vCenterServer.Enabled
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
-
- $TableParams = @{
- Name = "vCenter - $($HVEnvironment.split(".").toUpper()[0])"
- List = $false
- ColumnWidths = 40, 15, 15, 15, 15
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Sort-Object -Property 'Name' | Table @TableParams
- try {
- if ($InfoLevel.Settings.Servers.vCenterServers.vCenter -ge 2) {
- foreach ($vCenterServer in $vCenterServers) {
- try {
- Section -Style Heading4 "$($vCenterServer.serverspec.ServerName)" {
- $OutObj = @()
- Write-PScriboMessage "Discovered Virtual Centers Information $($vCenterServer.serverspec.ServerName)."
- $inObj = [ordered] @{
- 'Name' = $vCenterServer.serverspec.ServerName
- 'Description' = $vCenterServer.Description
- 'Certificate Override' = $vCenterServer.CertificateOverride
- 'Provisioning Enabled' = $vCenterServer.Enabled
- 'Reclaim Disk Space' = $vCenterServer.SeSparseReclamationEnabled
- 'Port' = $vCenterServer.serverspec.Port
- 'User SSL' = $vCenterServer.serverspec.UseSSL
- 'User Name' = $vCenterServer.serverspec.UserName
- 'Type' = $vCenterServer.serverspec.ServerType
- 'TCP Port Number' = $vCenterServer.serverspec.Port
- 'Max Concurrent Provisioning Operations' = $vCenterServer.Limits.VcProvisioningLimit
- 'Max Concurrent Power Operations' = $vCenterServer.Limits.VcPowerOperationsLimit
- 'Max Concurrent View Composer Maintenance Operations' = $vCenterServer.Limits.ViewComposerProvisioningLimit
- 'Max Concurrent View Composer Provisioning Operations' = $vCenterServer.Limits.ViewComposerMaintenanceLimit
- 'Max Concurrent Instant Clone Engine Provisioning Operations' = $vCenterServer.Limits.InstantCloneEngineProvisioningLimit
- 'Storage Acceleration Enabled' = $vCenterServer.StorageAcceleratorData.Enabled
- 'Storage Accelerator Default Cache Size' = "$($vCenterServer.StorageAcceleratorData.DefaultCacheSizeMB)MB"
- }
-
- $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj)
-
- $TableParams = @{
- Name = "vCenter Server Details - $($vCenterServer.serverspec.ServerName)"
- List = $true
- ColumnWidths = 50, 50
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Table @TableParams
- try {
- $HorizonVirtualCenterStorageAcceleratorHostOverrides = $vCenterServer.StorageAcceleratorData.HostOverrides
- if ($HorizonVirtualCenterStorageAcceleratorHostOverrides) {
- Section -ExcludeFromTOC -Style NOTOCHeading6 "Storage Accelerator Overrides" {
- $OutObj = @()
- foreach ($HorizonVirtualCenterStorageAcceleratorHostOverride in $HorizonVirtualCenterStorageAcceleratorHostOverrides) {
- try {
- Write-PScriboMessage "Discovered Storage Accelerator Overrides Information $($vCenterServer.serverspec.ServerName)."
- $DATACENTER = $HorizonVirtualCenterStorageAcceleratorHostOverride.Path.Split('/')[1]
- $Cluster = $HorizonVirtualCenterStorageAcceleratorHostOverride.Path.Split('/')[3]
- $VMHost = $HorizonVirtualCenterStorageAcceleratorHostOverride.Path.Split('/')[4]
- $inObj = [ordered] @{
- 'Datacenter' = $DATACENTER
- 'Cluster' = $Cluster
- 'Host' = $VMHost
- 'Cache Size' = "$($HorizonVirtualCenterStorageAcceleratorHostOverride.CacheSizeMB)MB"
- }
-
- $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj)
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
-
- $TableParams = @{
- Name = "Storage Accelerator Overrides - $($vCenterServer.serverspec.ServerName)"
- List = $false
- ColumnWidths = 25, 25, 25, 25
- }
-
- if ($Report.ShowTableCaptions) {
- $TableParams['Caption'] = "- $($TableParams.Name)"
- }
- $OutObj | Sort-Object -Property 'Cluster' | Table @TableParams
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- }
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- }
- end {}
-}
\ No newline at end of file
diff --git a/1.1.5/Src/Private/Get-RequiredModule.ps1 b/1.1.5/Src/Private/Get-RequiredModule.ps1
deleted file mode 100644
index aead3d2..0000000
--- a/1.1.5/Src/Private/Get-RequiredModule.ps1
+++ /dev/null
@@ -1,36 +0,0 @@
-function Get-RequiredModule {
- <#
- .SYNOPSIS
- Function to check if the required version of VMware PowerCLI is installed
- .DESCRIPTION
- Function to check if the required version of VMware PowerCLI is installed
- .PARAMETER Name
- The name of the required PowerShell module
- .PARAMETER Version
- The version of the required PowerShell module
- #>
- [CmdletBinding()]
-
- Param
- (
- [Parameter(Mandatory = $true, ValueFromPipeline = $false)]
- [ValidateNotNullOrEmpty()]
- [String] $Name,
-
- [Parameter(Mandatory = $true, ValueFromPipeline = $false)]
- [ValidateNotNullOrEmpty()]
- [String] $Version
- )
- process {
- # Check if the required version of VMware PowerCLI is installed
- $RequiredModule = Get-Module -ListAvailable -Name $Name | Sort-Object -Property Version -Descending | Select-Object -First 1
- $ModuleVersion = "$($RequiredModule.Version.Major)" + "." + "$($RequiredModule.Version.Minor)"
- if ($ModuleVersion -eq ".") {
- throw "VMware PowerCLI $Version or higher is required to run the VMware Horizon As Built Report. Run 'Install-Module -Name $Name -MinimumVersion $Version' to install the required modules."
- }
- if ($ModuleVersion -lt $Version) {
- throw "VMware PowerCLI $Version or higher is required to run the VMware Horizon As Built Report. Run 'Update-Module -Name $Name -MinimumVersion $Version' to update the required modules."
- }
- }
- end {}
-}
diff --git a/1.1.5/Src/Private/SharedUtilsFunctions.ps1 b/1.1.5/Src/Private/SharedUtilsFunctions.ps1
deleted file mode 100644
index 552f6cb..0000000
--- a/1.1.5/Src/Private/SharedUtilsFunctions.ps1
+++ /dev/null
@@ -1,153 +0,0 @@
-function ConvertTo-TextYN {
- <#
- .SYNOPSIS
- Used by As Built Report to convert true or false automatically to Yes or No.
- .DESCRIPTION
-
- .NOTES
- Version: 0.3.0
- Author: LEE DAILEY
-
- .EXAMPLE
-
- .LINK
-
- #>
- [CmdletBinding()]
- [OutputType([String])]
- Param (
- [Parameter (
- Position = 0,
- Mandatory)]
- [AllowEmptyString()]
- [string] $TEXT
- )
-
- switch ($TEXT) {
- "" { "--"; break }
- " " { "--"; break }
- $Null { "--"; break }
- "True" { "Yes"; break }
- "False" { "No"; break }
- default { $TEXT }
- }
-} # end
-function Get-UnixDate ($UnixDate) {
- <#
- .SYNOPSIS
- Used by As Built Report to convert Date to a more nice format.
- .DESCRIPTION
-
- .NOTES
- Version: 0.2.0
- Author: LEE DAILEY
-
- .EXAMPLE
-
- .LINK
-
- #>
- [timezone]::CurrentTimeZone.ToLocalTime(([datetime]'1/1/1970').AddSeconds($UnixDate))
-} # end
-function ConvertTo-EmptyToFiller {
- <#
- .SYNOPSIS
- Used by As Built Report to convert empty columns to "-".
- .DESCRIPTION
-
- .NOTES
- Version: 0.5.0
- Author: Jonathan Colon
-
- .EXAMPLE
-
- .LINK
-
- #>
- [CmdletBinding()]
- [OutputType([String])]
- Param (
- [Parameter (
- Position = 0,
- Mandatory)]
- [AllowEmptyString()]
- [string]
- $TEXT
- )
-
- switch ($TEXT) {
- "" { "-"; break }
- $Null { "-"; break }
- "True" { "Yes"; break }
- "False" { "No"; break }
- default { $TEXT }
- }
-} # end
-
-function ConvertTo-VIobject {
- <#
- .SYNOPSIS
- Used by As Built Report to convert object to VIObject.
- .DESCRIPTION
-
- .NOTES
- Version: 0.1.0
- Author: Jon Colon
-
- .EXAMPLE
-
- .LINK
-
- #>
- [CmdletBinding()]
- [OutputType([String])]
- Param (
- [Parameter (
- Position = 0,
- Mandatory)]
- [AllowEmptyString()]
- $OBJECT
- )
-
- if (Get-View $OBJECT -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Name -Unique) {
- return Get-View $OBJECT -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Name -Unique
- } else {
- return $OBJECT
- }
-} # end
-
-function ConvertTo-HashToYN {
- <#
- .SYNOPSIS
- Used by As Built Report to convert array content true or false automatically to Yes or No.
- .DESCRIPTION
-
- .NOTES
- Version: 0.2.0
- Author: Jonathan Colon
-
- .EXAMPLE
-
- .LINK
-
- #>
- [CmdletBinding()]
- [OutputType([System.Collections.Specialized.OrderedDictionary])]
- Param (
- [Parameter (Position = 0, Mandatory)]
- [AllowEmptyString()]
- [System.Collections.Specialized.OrderedDictionary] $TEXT
- )
-
- $result = [ordered] @{}
- foreach ($i in $TEXT.GetEnumerator()) {
- try {
- $result.add($i.Key, (ConvertTo-TextYN $i.Value))
- } catch {
- $result.add($i.Key, ($i.Value))
- }
- }
- if ($result) {
- return $result
- } else { return $TEXT }
-} # end
\ No newline at end of file
diff --git a/1.1.5/Src/Public/Invoke-ASBuiltReport.VMware.Horizon.ps1 b/1.1.5/Src/Public/Invoke-ASBuiltReport.VMware.Horizon.ps1
deleted file mode 100644
index 10affe7..0000000
--- a/1.1.5/Src/Public/Invoke-ASBuiltReport.VMware.Horizon.ps1
+++ /dev/null
@@ -1,483 +0,0 @@
-function Invoke-AsBuiltReport.VMware.Horizon {
- <#
- .SYNOPSIS
- PowerShell script which documents the configuration of VMware Horizon in Word/HTML/XML/Text formats
- .DESCRIPTION
- Documents the configuration of VMware Horizon in Word/HTML/XML/Text formats using PScribo.
- .NOTES
- Version: 1.1.5
- Author: Chris Hildebrandt, Karl Newick
- Twitter: @childebrandt42, @karlnewick
- Editor: Jonathan Colon, @jcolonfzenpr
- Twitter: @asbuiltreport
- Github: AsBuiltReport
- Credits: Iain Brighton (@iainbrighton) - PScribo module
-
-
- .LINK
- https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon
- #>
-
- param (
- [String[]] $Target,
- [PSCredential] $Credential
- )
-
- if ($psISE) {
- Write-Error -Message "You cannot run this script inside the PowerShell ISE. Please execute it from the PowerShell Command Window."
- break
- }
-
- Write-PScriboMessage -Plugin "Module" -IsWarning "Please refer to the AsBuiltReport.VMware.Horizon github website for more detailed information about this project."
- Write-PScriboMessage -Plugin "Module" -IsWarning "Do not forget to update your report configuration file after each new version release."
- Write-PScriboMessage -Plugin "Module" -IsWarning "Documentation: https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon"
- Write-PScriboMessage -Plugin "Module" -IsWarning "Issues or bug reporting: https://github.com/AsBuiltReport/AsBuiltReport.VMware.Horizon/issues"
- Write-PScriboMessage -Plugin "Module" -IsWarning "This project is community maintained and has no sponsorship from VMware/Omnissa, its employees or any of its affiliates."
-
- Try {
- $InstalledVersion = Get-Module -ListAvailable -Name AsBuiltReport.VMware.Horizon -ErrorAction SilentlyContinue | Sort-Object -Property Version -Descending | Select-Object -First 1 -ExpandProperty Version
-
- if ($InstalledVersion) {
- Write-PScriboMessage -IsWarning "AsBuiltReport.VMware.Horizon $($InstalledVersion.ToString()) is currently installed."
- $LatestVersion = Find-Module -Name AsBuiltReport.VMware.Horizon -Repository PSGallery -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Version
- if ($LatestVersion -gt $InstalledVersion) {
- Write-PScriboMessage -IsWarning "AsBuiltReport.VMware.Horizon $($LatestVersion.ToString()) is available."
- Write-PScriboMessage -IsWarning "Run 'Update-Module -Name AsBuiltReport.VMware.Horizon -Force' to install the latest version."
- }
- }
- } Catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
-
- # Check if the required version of VMware PowerCLI is installed
- Get-RequiredModule -Name 'VMware.PowerCLI' -Version '13.2'
-
- # Import Report Configuration
- $Report = $ReportConfig.Report
- $InfoLevel = $ReportConfig.InfoLevel
- $HealthCheck = $ReportConfig.HealthCheck
- $Options = $ReportConfig.Options
-
-
- foreach ($HVEnvironment in $Target) {
-
- Try {
- $HvServer = Connect-HVServer -Server $HVEnvironment -Credential $Credential -ErrorAction Stop
- } Catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
-
-
- # Generate report if connection to Horizon Environment Server Connection is successful
- if ($HvServer) {
-
- #Environment Varibles
-
- # Assign a variable to obtain the API Extension Data
- $hzServices = $hvServer.ExtensionData
-
- # Define HV Query Services
- $Queryservice = New-Object vmware.hv.queryserviceservice
-
- # Virtual Centers
- $vCenterServers = try { $hzServices.VirtualCenter.VirtualCenter_List() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
-
- # vCenter Health, ESX Hosts, and DataStores
- $vCenterHealth = try { $hzServices.VirtualCenterHealth.VirtualCenterHealth_List() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
-
- # ESXHosts
- #$esxhosts = $vCenterHealth
-
- # DataStores
- #$datastores = $vCenterHealth
-
- # Domains
- $Domains = try { $hzServices.ADDomainHealth.ADDomainHealth_List() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
-
- # Connection Server Info
- $connectionservers = try { $hzServices.ConnectionServer.ConnectionServer_List() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
-
- # Connection Server Health
- $ConnectionServersHealth = try { $hzServices.ConnectionServerHealth.ConnectionServerHealth_List() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
-
- # TrueSSO
- $CertificateSSOconnectorHealthlist = try { $hzServices.CertificateSSOConnectorHealth.CertificateSSOConnectorHealth_list()} catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
-
- # SAML SSO
- $SAMLAuthenticatorhealthlist=$hzServices.SAMLAuthenticatorHealth.SAMLAuthenticatorHealth_list()
-
- # Pod Health
-
-
- # GateWay Server Info
- $GatewayServers = try { $hzServices.Gateway.Gateway_List() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
-
- # Instant Clone Domain Admins
- $InstantCloneDomainAdmins = try { $hzServices.InstantCloneEngineDomainAdministrator.InstantCloneEngineDomainAdministrator_List() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
-
- # AD Domains
- $ADDomains = try { $hzServices.ADDomain.ADDomain_List() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
-
- # Product Licensing Info
- $ProductLicenseingInfo = try { $hzServices.License.License_Get() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
-
- # Product Usage Info
- $UsageStatisticsInfo = try { $hzServices.UsageStatistics.UsageStatistics_GetLicensingCounters() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
-
- # Global Settings
- $GlobalSettings = try { $hzServices.GlobalSettings.GlobalSettings_Get() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
-
- # Administrators
- $Administrators = try { $hzServices.AdminUserOrGroup.AdminUserOrGroup_List() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
-
- # Cloud Pod Architecture
- $CloudPodFederation = try { $hzServices.PodFederation.PodFederation_Get() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
-
- # Sites
- $CloudPodSites = try { $hzServices.Site.Site_List() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
- $CloudPodLists = try { $hzServices.Pod.Pod_List() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
- $CloudPodListsLocal = try { $hzServices.Pod.Pod_List() | Where-Object {$_.localpod -eq $false} } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
-
- # Event Database Info
- $EventDataBases = try { $hzServices.EventDatabase.EventDatabase_Get() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
-
- # Event Database Health Info
- $EventDataBaseHealth = try { $hzServices.EventDatabaseHealth.EventDatabaseHealth_get() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
-
- # Syslog Info
- $Syslog = try { $hzServices.Syslog.Syslog_Get() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
-
- # Virtual Centers
- $vCenterServers = try { $hzServices.VirtualCenter.VirtualCenter_List() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
-
- # Global Policies
- try {
- $GlobalPoliciesService = New-Object VMware.Hv.PoliciesService
- $GlobalPolicies = $GlobalPoliciesService.Policies_Get($hvServer.ExtensionData, $null, $null)
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
-
- # Unauthenticated Access
- $unauthenticatedAccessList = try { $hzServices.UnauthenticatedAccessUser.UnauthenticatedAccessUser_List() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
-
- try {
- $EntitledUserOrGroupLocalMachineQueryDefn = New-Object VMware.Hv.QueryDefinition
- $EntitledUserOrGroupLocalMachineQueryDefn.queryentitytype = 'EntitledUserOrGroupLocalSummaryView'
- $EntitledUserOrGroupLocalMachinequeryResults = $Queryservice.QueryService_Create($hzServices, $EntitledUserOrGroupLocalMachineQueryDefn)
- $EntitledUserOrGroupLocalMachines = foreach ($EntitledUserOrGroupLocalMachineresult in $EntitledUserOrGroupLocalMachinequeryResults.results) { $hzServices.EntitledUserOrGroup.EntitledUserOrGroup_GetLocalSummaryView($EntitledUserOrGroupLocalMachineresult.id) }
- $queryservice.QueryService_DeleteAll($hzServices)
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
-
- try {
- # Home Site Info
- $HomesiteQueryDefn = New-Object VMware.Hv.QueryDefinition
- $HomesiteQueryDefn.queryentitytype = 'UserHomeSiteInfo'
- $HomesitequeryResults = $Queryservice.QueryService_Create($hzServices, $HomesiteQueryDefn)
- $Homesites = foreach ($Homesiteresult in $HomesitequeryResults.results) {
- $hzServices.UserHomeSite.UserHomeSite_GetInfos($Homesiteresult.id)
- }
- $queryservice.QueryService_DeleteAll($hzServices)
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
-
- try {
- # Pool Info
- $PoolQueryDefn = New-Object VMware.Hv.QueryDefinition
- $PoolQueryDefn.queryentitytype = 'DesktopSummaryView'
- $poolqueryResults = $Queryservice.QueryService_Create($hzServices, $PoolQueryDefn)
- $Pools = foreach ($poolresult in $poolqueryResults.results) {
- $hzServices.desktop.desktop_get($poolresult.id)
- }
- $queryservice.QueryService_DeleteAll($hzServices)
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
-
- try {
- # Desktop Assignment Info
- $DesktopAssignmentViewQueryDefn = New-Object VMware.Hv.QueryDefinition
- $DesktopAssignmentViewQueryDefn.queryentitytype = 'DesktopAssignmentView'
- $DesktopAssignmentViewResults = $Queryservice.QueryService_Create($hzServices, $DesktopAssignmentViewQueryDefn)
- $DesktopAssignmentViewResultsData = $DesktopAssignmentViewResults.results
- $queryservice.QueryService_DeleteAll($hzServices)
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
-
- try {
- # Application Pools
- $AppQueryDefn = New-Object VMware.Hv.QueryDefinition
- $AppQueryDefn.queryentitytype = 'ApplicationInfo'
- $AppqueryResults = $Queryservice.QueryService_Create($hzServices, $AppQueryDefn)
- $Apps = foreach ($Appresult in $AppqueryResults.results) {
- $hzServices.Application.Application_Get($Appresult.id)
- }
- $queryservice.QueryService_DeleteAll($hzServices)
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
-
- try {
- # Global Entitlements
- $GlobalEntitlementGroupsQueryDefn = New-Object VMware.Hv.QueryDefinition
- $GlobalEntitlementGroupsQueryDefn.queryentitytype = 'GlobalEntitlementSummaryView'
- $GlobalEntitlementGroupsqueryResults = $Queryservice.QueryService_Create($hzServices, $GlobalEntitlementGroupsQueryDefn)
- $GlobalEntitlements = foreach ($GlobalEntitlementGroupsResult in $GlobalEntitlementGroupsqueryResults.results) {
- $hzServices.GlobalEntitlement.GlobalEntitlement_Get($GlobalEntitlementGroupsResult.id)
- }
- $queryservice.QueryService_DeleteAll($hzServices)
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
-
- try {
- # Entitled User Or Group Global
- $GlobalApplicationEntitlementGroupsQueryDefn = New-Object VMware.Hv.QueryDefinition
- $GlobalApplicationEntitlementGroupsQueryDefn.queryentitytype = 'GlobalApplicationEntitlementInfo'
- $GlobalApplicationEntitlementGroupsqueryResults = $Queryservice.QueryService_Create($hzServices, $GlobalApplicationEntitlementGroupsQueryDefn)
- $GlobalApplicationEntitlementGroups = foreach ($GlobalApplicationEntitlementGroupsResult in $GlobalApplicationEntitlementGroupsqueryResults.results) {
- $hzServices.GlobalApplicationEntitlement.GlobalApplicationEntitlement_Get($GlobalApplicationEntitlementGroupsResult.id)
- }
- $queryservice.QueryService_DeleteAll($hzServices)
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
-
- try {
- # EntitledUserOrGroupGlobalMachine Info
- $EntitledUserOrGroupGlobalMachineQueryDefn = New-Object VMware.Hv.QueryDefinition
- $EntitledUserOrGroupGlobalMachineQueryDefn.queryentitytype = 'EntitledUserOrGroupGlobalSummaryView'
- $EntitledUserOrGroupGlobalMachinequeryResults = $Queryservice.QueryService_Create($hzServices, $EntitledUserOrGroupGlobalMachineQueryDefn)
- $EntitledUserOrGroupGlobalMachines = foreach ($EntitledUserOrGroupGlobalMachineresult in $EntitledUserOrGroupGlobalMachinequeryResults.results) {
- $hzServices.EntitledUserOrGroup.EntitledUserOrGroup_GetGlobalSummaryView($EntitledUserOrGroupGlobalMachineresult.id)
- }
- $queryservice.QueryService_DeleteAll($hzServices)
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
-
- # Entitled Global Users and Groups
- try {
- # EntitledUserOrGroupGlobal Info
- $EntitledUserOrGroupGlobalQueryDefn = New-Object VMware.Hv.QueryDefinition
- $EntitledUserOrGroupGlobalQueryDefn.queryentitytype = 'EntitledUserOrGroupGlobalSummaryView'
- $EntitledUserOrGroupGlobalqueryResults = $Queryservice.QueryService_Create($hzServices, $EntitledUserOrGroupGlobalQueryDefn)
- $EntitledUserOrGroupGlobals = foreach ($EntitledUserOrGroupGlobalresult in $EntitledUserOrGroupGlobalqueryResults.results) {
- $hzServices.EntitledUserOrGroup.EntitledUserOrGroup_GetGlobalSummaryView($EntitledUserOrGroupGlobalresult.id)
- }
- $queryservice.QueryService_DeleteAll($hzServices)
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
-
-
- # Permissions
- $Permissions = try { $hzServices.Permission.Permission_List() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
-
- # Roles
- $Roles = try { $hzServices.Role.Role_List() } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
-
- # Access Groups
- $AccessGroups = $hzServices.AccessGroup.AccessGroup_List()
-
- try {
- # Farm Info
- $FarmdQueryDefn = New-Object VMware.Hv.QueryDefinition
- $FarmdQueryDefn.queryentitytype = 'FarmSummaryView'
- $FarmqueryResults = $Queryservice.QueryService_Create($hzServices, $FarmdQueryDefn)
- $Farms = foreach ($farmresult in $farmqueryResults.results) {
- $hzServices.farm.farm_get($farmresult.id)
- }
- $queryservice.QueryService_DeleteAll($hzServices)
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
-
- try {
- # Machines
- $MachinesQueryDefn = New-Object VMware.Hv.QueryDefinition
- $MachinesQueryDefn.queryentitytype = 'MachineSummaryView'
- $MachinesqueryResults = $Queryservice.QueryService_Create($hzServices, $MachinesQueryDefn)
- $Machines = foreach ($Machinesresult in $MachinesqueryResults.results) {
- $hzServices.machine.machine_get($Machinesresult.id)
- }
- $queryservice.QueryService_DeleteAll($hzServices)
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
-
-
- try {
- # RDS Servers
- $RDSServerQueryDefn = New-Object VMware.Hv.QueryDefinition
- $RDSServerQueryDefn.queryentitytype = 'RDSServerSummaryView'
- $RDSServerqueryResults = $Queryservice.QueryService_Create($hzServices, $RDSServerQueryDefn)
- $RDSServers = foreach ($RDSServerresult in $RDSServerqueryResults.results) {
- $hzServices.RDSServer.RDSServer_GetSummaryView($RDSServerresult.id)
- }
- $queryservice.QueryService_DeleteAll($hzServices)
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
-
- # Base Images
- try {
- $BaseImageVMList = $vCenterServers | ForEach-Object { $hzServices.BaseImageVM.BaseImageVM_List($_.id, $null) }
- $CompatibleBaseImageVMs = $BaseImageVMList | Where-Object {
- ($_.IncompatibleReasons.InUseByDesktop -eq $false) -and
- ($_.IncompatibleReasons.InUseByLinkedCloneDesktop -eq $false) -and
- ($_.IncompatibleReasons.ViewComposerReplica -eq $false) -and
- ($_.IncompatibleReasons.UnsupportedOS -eq $false) -and
- ($_.IncompatibleReasons.NoSnapshots -eq $false) -and
- (($null -eq $_.IncompatibleReasons.InstantInternal) -or ($_.IncompatibleReasons.InstantInternal -eq $false))
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
-
- # Registerd Physical Machines
- Try {
- $RegisteredPhysicalMachineInfoQueryDefn = New-Object VMware.Hv.QueryDefinition
- $RegisteredPhysicalMachineInfoQueryDefn.queryentitytype = 'RegisteredPhysicalMachineInfo'
- $RegisteredPhysicalMachineResults = $Queryservice.QueryService_Create($hzServices, $RegisteredPhysicalMachineInfoQueryDefn)
- $RegisteredPhysicalMachines = foreach ($RegisteredPhysicalMachineresult in $RegisteredPhysicalMachineResults.results) { $hzServices.RegisteredPhysicalMachine.RegisteredPhysicalMachine_Get($RegisteredPhysicalMachineResult.id) }
- $queryservice.QueryService_DeleteAll($hzServices)
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
-
- try {
- # Template Images
- $TemplateVMList = $vCenterServers | ForEach-Object { $hzServices.VmTemplate.VmTemplate_List($_.id) }
- $CompatibleTemplateVMs = $TemplateVMList | Where-Object {
- ($_.IncompatibleReasons.UnsupportedOS -eq $false)
- }
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
-
- try {
- # CEIP Info
- $CEIP = $hzServices.CEIP.CEIP_Get()
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
-
- try {
- # Global Access Group Info
- $GlobalAccessGroups = $hzServices.GlobalAccessGroup.GlobalAccessGroup_List()
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
-
- try {
- # Gateway Certificates
- $script:GatewayCerts = $hzServices.GlobalSettings.GlobalSettings_ListGatewayCertificates()
- } catch {
- Write-PScriboMessage -IsWarning $_.Exception.Message
- }
- Section -Style Heading1 "$($HVEnvironment.toUpper())" {
- Get-AbrHRZInfrastructure
- }
-
- if ($InfoLevel.UsersAndGroups.PSObject.Properties.Value -ne 0) {
- Section -Style Heading1 'Users and Groups' {
- Paragraph 'The following section provides information about the permissions that control which remote desktops and applications your users can access.'
- Get-AbrHRZLocalEntitlement
- Get-AbrHRZHomeSite
- Get-AbrHRZUnauthenticatedACL
- }
- }
-
- if ($InfoLevel.Inventory.PSObject.Properties.Value -ne 0) {
- Section -Style Heading1 'Inventory' {
- Paragraph 'The following section provides detailed information about desktop, application, farm pools and global entitlement permissions that control which remote desktops and applications your users can access.'
- Get-AbrHRZDesktopPool
- Get-AbrHRZApplicationPool
- Get-AbrHRZFarm
- Get-AbrHRZMachine
- Get-AbrHRZGlobalEntitlement
- }
- }
-
- Section -Style Heading1 'Settings' {
- Paragraph 'The following section provides detailed information about the configuration of the components that comprise the Horizon Server infrastructure.'
- if ($InfoLevel.Settings.Servers.PSObject.Properties.Value -ne 0) {
- Section -Style Heading2 'Servers' {
- Get-AbrHRZVcenter
- Get-AbrHRZDatastore
- Get-AbrHRZESXi
- Get-AbrHRZUAG
- Get-AbrHRZConnectionServer
- Get-AbrHRZGatewayCert
- Get-AbrHRZTSSO
- }
- }
-
- #Get-AbrHRZADDomain
- Get-AbrHRZDomain
- Get-AbrHRZCertMgmt
- Get-AbrHRZLicense
- Get-AbrHRZGlobalSetting
- Get-AbrHRZRegisteredMachine
-
- if ($InfoLevel.Settings.Administrators.PSObject.Properties.Value -ne 0) {
- Section -Style Heading2 'Administrators' {
- Get-AbrHRZAdminGroup
- Get-AbrHRZRolePrivilege
- Get-AbrHRZRolePermission
- Get-AbrHRZAccessGroup
- Get-AbrHRZFederationAccessGroup
- }
- }
-
- Get-AbrHRZCloudPod
- Get-AbrHRZSite
- Get-AbrHRZEventConf
- Get-AbrHRZGlobalpolicy
- }
- Write-PScriboMessage "Health Check InfoLevel set at $($HealthCheck.HealthCheck.Overview)."
- if ($HealthCheck.HealthCheck) {
- Section -Style Heading1 'Health Check' {
- Paragraph 'The following section provides overall heath check of the environment.'
- if ($HealthCheck.Components.ConnectionServers -or $HealthCheck.Components.GatewayServer -or $HealthCheck.Components.EventDataBases -or $HealthCheck.Components.TrueSSO -or $HealthCheck.Components.MessagingClient) {
- Section -Style Heading2 'Components' {
- Get-AbrHRZHCConnection
- Get-AbrHRZHCGatewayServer
- Get-AbrHRZHCEventDataBase
- Get-AbrHRZHCTrueSSO
- }
- }
- if ($HealthCheck.RDSFarms -and $farms) {
- Section -Style Heading2 'RDS Farms' {
- Get-AbrHRZHCRDSFarm
- }
- }
- if ($healthcheck.vSphere.datastores -or $healthcheck.vSphere.vCenter -or $healthcheck.vSphere.esxiHosts) {
- Section -Style Heading2 'vSphere' {
- Get-AbrHRZHCDataStore
- Get-AbrHRZHCvCenter
- Get-AbrHRZHCESXiHost
- }
- }
- if ($HealthCheck.OtherComponents.domains -or $HealthCheck.OtherComponents.SAML2 -or $HealthCheck.OtherComponents.LicenseService) {
- Section -Style Heading2 'Other Components' {
- Get-AbrHRZHCDomain
- Get-AbrHRZHCSAML2
- Get-AbrHRZHCLicenseService
- }
- }
- if ($healthcheck.RemotePod.RemotePod -and $CloudPodListsLocal){
- Section -Style Heading2 'Remote Pod' {
- Get-AbrHRZHCRemotePod
- }
- }
- }
- }
- }
- }
-}
From e4ba22f91305ad6d9ff75413482ac39e7568171c Mon Sep 17 00:00:00 2001
From: Jonathan Colon
Date: Sat, 13 Sep 2025 12:25:16 -0400
Subject: [PATCH 5/6] fix: Correct module version in manifest and update
changelog for version 1.1.6 style: Improve output formatting in
Get-RequiredModule function
---
AsBuiltReport.VMware.Horizon.psd1 | 2 +-
CHANGELOG.md | 19 ++++++++++---------
Src/Private/Get-RequiredModule.ps1 | 2 +-
3 files changed, 12 insertions(+), 11 deletions(-)
diff --git a/AsBuiltReport.VMware.Horizon.psd1 b/AsBuiltReport.VMware.Horizon.psd1
index a27d5f7..2e269c5 100644
--- a/AsBuiltReport.VMware.Horizon.psd1
+++ b/AsBuiltReport.VMware.Horizon.psd1
@@ -12,7 +12,7 @@
RootModule = 'AsBuiltReport.VMware.Horizon.psm1'
# Version number of this module.
- ModuleVersion = '1.2'
+ ModuleVersion = '1.1.6'
# Supported PSEditions
# CompatiblePSEditions = @()
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2ff9b0a..b5b03bc 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,21 +5,22 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-## [1.2] - 2025-09-13
+## [1.1.6] - 2025-09-13
### Added
-- Add Diagrammer.Core module requirements
-- Add the required files structure to support the building of diagrams
+- Include Diagrammer.Core module as a requirement.
+- Introduce the necessary file structure to enable diagram generation.
### Changed
-- Bump AsBuiltReport.Core module to v1.4.3
-- Bump actions/checkout to v5 in Codeql.yml and PSScriptAnalyzer.yml
-- Change Release.yml to use windows-latest
-- Enhance Invoke-ASBuiltReport function with version checks for dependencies
-- Update CHANGELOG.md with recent changes
-- This mark the last edition that support VMware Horizon (Next version Omnissa only)
+- Update AsBuiltReport.Core module requirement to v1.4.3.
+- Upgrade actions/checkout to v5 in Codeql.yml and PSScriptAnalyzer.yml.
+- Upgrade actions/bluesky-post-action to v0.3.0
+- Modifie Release.yml to use windows-latest.
+- Enhance Invoke-ASBuiltReport function with improved dependency version checks.
+- Update CHANGELOG.md to reflect recent changes.
+- This is the final release supporting VMware Horizon; future versions will support Omnissa only.
## [1.1.5.1] - 2025-03-13
diff --git a/Src/Private/Get-RequiredModule.ps1 b/Src/Private/Get-RequiredModule.ps1
index cf5f712..c1e464e 100644
--- a/Src/Private/Get-RequiredModule.ps1
+++ b/Src/Private/Get-RequiredModule.ps1
@@ -45,7 +45,7 @@ function Get-RequiredModule {
# Convert installed version to a [Version] object
$InstalledVersion = [Version]$InstalledModule.Version
- Write-Host " - $($InstalledModule.Name) $InstalledVersion is currently installed."
+ Write-Host "- $($InstalledModule.Name) $InstalledVersion is currently installed."
if ($InstalledVersion -lt $RequiredVersion) {
throw "VMware PowerCLI $Version or higher is required. Run 'Update-Module -Name $Name -MinimumVersion $Version -Force' to update the required modules."
From 8001277e5737bf2c8b5afba610ceb36396d6e0e9 Mon Sep 17 00:00:00 2001
From: Jonathan Colon
Date: Sat, 13 Sep 2025 12:28:14 -0400
Subject: [PATCH 6/6] fix: Disable diagram generation in options
---
AsBuiltReport.VMware.Horizon.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/AsBuiltReport.VMware.Horizon.json b/AsBuiltReport.VMware.Horizon.json
index 245419b..0c5c1a3 100644
--- a/AsBuiltReport.VMware.Horizon.json
+++ b/AsBuiltReport.VMware.Horizon.json
@@ -9,7 +9,7 @@
"ShowTableCaptions": true
},
"Options": {
- "EnableDiagrams": true,
+ "EnableDiagrams": false,
"EnableDiagramDebug": false,
"DiagramColumnSize": 3,
"DiagramTheme": "White",