Src/Private/Get-AbrVSphereVMHostSystem.ps1
|
function Get-AbrVSphereVMHostSystem { <# .SYNOPSIS Used by As Built Report to retrieve VMware vSphere ESXi VMHost System information. .NOTES Version: 2.0.0 Author: Tim Carman Twitter: @tpcarman Github: tpcarman #> [CmdletBinding()] param () begin { $LocalizedData = $reportTranslate.GetAbrVSphereVMHostSystem } process { try { Write-PScriboMessage -Message $LocalizedData.Collecting #region ESXi Host System Section Section -Style Heading4 $LocalizedData.SectionHeading { Paragraph ($LocalizedData.ParagraphSummary -f $VMHost) #region ESXi Host Profile Information if ($VMHost | Get-VMHostProfile) { try { Section -Style NOTOCHeading5 -ExcludeFromTOC $LocalizedData.HostProfile { $VMHostProfile = $VMHost | Get-VMHostProfile | Select-Object @{L = $LocalizedData.ProfileName; E = { $_.Name } }, @{L = $LocalizedData.ProfileDescription; E = { $_.Description } } $TableParams = @{ Name = ($LocalizedData.TableHostProfile -f $VMHost) ColumnWidths = 50, 50 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $VMHostProfile | Sort-Object $LocalizedData.ProfileName | Table @TableParams } } catch { Write-PScriboMessage -Message ($LocalizedData.HostProfileError -f $VMHost.Name, $_.Exception.Message) } } #endregion ESXi Host Profile Information #region ESXi Host Image Profile Information if ($UserPrivileges -contains 'Host.Config.Settings') { try { Section -Style NOTOCHeading5 -ExcludeFromTOC $LocalizedData.ImageProfile { $installdate = Get-InstallDate $esxcli = Get-EsxCli -VMHost $VMHost -V2 -Server $vCenter $ImageProfile = $esxcli.software.profile.get.Invoke() $SecurityProfile = [PSCustomObject]@{ $LocalizedData.ImageName = $ImageProfile.Name $LocalizedData.ImageVendor = $ImageProfile.Vendor $LocalizedData.InstallDate = $InstallDate.InstallDate } $TableParams = @{ Name = ($LocalizedData.TableImageProfile -f $VMHost) ColumnWidths = 50, 25, 25 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $SecurityProfile | Table @TableParams } } catch { Write-PScriboMessage -Message ($LocalizedData.ImageProfileError -f $VMHost.Name, $_.Exception.Message) } } else { Write-PScriboMessage -Message $LocalizedData.InsufficientPrivImageProfile } #endregion ESXi Host Image Profile Information #region ESXi Host Time Configuration try { Section -Style NOTOCHeading5 -ExcludeFromTOC $LocalizedData.TimeConfiguration { $VMHostTimeSettings = [PSCustomObject]@{ $LocalizedData.TimeZone = $VMHost.timezone $LocalizedData.NTPService = if ((Get-VMHostService -VMHost $VMHost | Where-Object { $_.key -eq 'ntpd' }).Running) { $LocalizedData.Running } else { $LocalizedData.Stopped } $LocalizedData.NTPServers = (Get-VMHostNtpServer -VMHost $VMHost | Sort-Object) -join ', ' } if ($Healthcheck.VMHost.NTP) { $VMHostTimeSettings | Where-Object { $_.$($LocalizedData.NTPService) -eq $LocalizedData.Stopped } | Set-Style -Style Critical -Property $LocalizedData.NTPService } $TableParams = @{ Name = ($LocalizedData.TableTimeConfig -f $VMHost) ColumnWidths = 30, 30, 40 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $VMHostTimeSettings | Table @TableParams } } catch { Write-PScriboMessage -Message ($LocalizedData.TimeConfigError -f $VMHost.Name, $_.Exception.Message) } #endregion ESXi Host Time Configuration #region ESXi Host VM Swap File Location try { $VMHostSwapView = Get-View $VMHost -Property 'config.vmSwapPlacement', 'config.localSwapDatastore' -ErrorAction SilentlyContinue $SwapPlacement = $VMHostSwapView.Config.VmSwapPlacement if ($SwapPlacement) { Section -Style NOTOCHeading5 -ExcludeFromTOC $LocalizedData.SwapFileLocation { $SwapDatastoreRef = $VMHostSwapView.Config.LocalSwapDatastore $SwapDatastoreName = if ($SwapDatastoreRef -and $SwapPlacement -eq 'hostLocal') { ($Datastores | Where-Object { $_.ExtensionData.MoRef.Value -eq $SwapDatastoreRef.Value }).Name } else { '--' } $SwapFileDetail = [PSCustomObject]@{ $LocalizedData.SwapFilePlacement = switch ($SwapPlacement) { 'vmDirectory' { $LocalizedData.WithVM } 'hostLocal' { $LocalizedData.HostLocal } default { $SwapPlacement } } $LocalizedData.SwapDatastore = $SwapDatastoreName } $TableParams = @{ Name = ($LocalizedData.TableSwapFileLocation -f $VMHost) ColumnWidths = 50, 50 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $SwapFileDetail | Table @TableParams } } } catch { Write-PScriboMessage -Message ($LocalizedData.SwapFileLocationError -f $VMHost.Name, $_.Exception.Message) } #endregion ESXi Host VM Swap File Location #region ESXi Host Certificate Information try { $CertBytes = $VMHost.ExtensionData.Config.Certificate if ($CertBytes) { Section -Style NOTOCHeading5 -ExcludeFromTOC $LocalizedData.HostCertificate { $Cert = [System.Security.Cryptography.X509Certificates.X509Certificate2]::new([byte[]]$CertBytes) $ThumbprintBytes = $Cert.GetCertHash([System.Security.Cryptography.HashAlgorithmName]::SHA256) $HostCertDetail = [PSCustomObject]@{ $LocalizedData.CertSubject = $Cert.Subject $LocalizedData.CertIssuer = $Cert.Issuer $LocalizedData.CertValidFrom = $Cert.NotBefore.ToLocalTime().ToString() $LocalizedData.CertValidTo = $Cert.NotAfter.ToLocalTime().ToString() $LocalizedData.CertThumbprint = [System.BitConverter]::ToString($ThumbprintBytes) -replace '-', ':' } $TableParams = @{ Name = ($LocalizedData.TableHostCertificate -f $VMHost) List = $true ColumnWidths = 40, 60 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $HostCertDetail | Table @TableParams } } } catch { Write-PScriboMessage -Message ($LocalizedData.HostCertificateError -f $VMHost.Name, $_.Exception.Message) } #endregion ESXi Host Certificate Information #region ESXi Host Syslog Configuration try { Section -Style NOTOCHeading5 -ExcludeFromTOC $LocalizedData.Syslog { $SyslogConfig = $VMHost | Get-VMHostSysLogServer $esxcli = Get-EsxCli -VMHost $VMHost -V2 -Server $vCenter $SyslogGlobalConfig = $esxcli.system.syslog.config.get.Invoke() $SyslogDetail = [PSCustomObject]@{ $LocalizedData.SyslogHost = if ($SyslogConfig) { ($SyslogConfig.Host | Sort-Object) -join ', ' } else { '--' } $LocalizedData.SyslogPort = if ($SyslogConfig) { ($SyslogConfig.Port | Select-Object -Unique) -join ', ' } else { '--' } $LocalizedData.LogDir = $SyslogGlobalConfig.LogDir $LocalizedData.LogRotations = $SyslogGlobalConfig.DefaultRotation $LocalizedData.LogSize = $SyslogGlobalConfig.DefaultSize } $TableParams = @{ Name = ($LocalizedData.TableSyslog -f $VMHost) List = $true ColumnWidths = 40, 60 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $SyslogDetail | Table @TableParams } } catch { Write-PScriboMessage -Message ($LocalizedData.SyslogError -f $VMHost.Name, $_.Exception.Message) } #endregion ESXi Host Syslog Configuration #region ESXi Update Manager Baseline Information if ($UserPrivileges -contains 'VcIntegrity.Updates.com.vmware.vcIntegrity.ViewStatus') { if ($VumServer.Name) { try { $VMHostPatchBaselines = $VMHost | Get-PatchBaseline } catch { Write-PScriboMessage -Message $LocalizedData.VUMBaselineNotAvailable } if ($VMHostPatchBaselines) { try { Section -Style NOTOCHeading5 -ExcludeFromTOC $LocalizedData.VUMBaseline { $VMHostBaselines = foreach ($VMHostBaseline in $VMHostPatchBaselines) { [PSCustomObject]@{ $LocalizedData.VUMBaselineName = $VMHostBaseline.Name $LocalizedData.VUMDescription = $VMHostBaseline.Description $LocalizedData.VUMBaselineType = $VMHostBaseline.BaselineType $LocalizedData.VUMTargetType = $VMHostBaseline.TargetType $LocalizedData.VUMLastUpdate = ($VMHostBaseline.LastUpdateTime).ToLocalTime().ToString() $LocalizedData.VUMBaselinePatches = $VMHostBaseline.CurrentPatches.Count } } $TableParams = @{ Name = ($LocalizedData.TableVUMBaselines -f $VMHost) ColumnWidths = 25, 25, 10, 10, 20, 10 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $VMHostBaselines | Sort-Object $LocalizedData.VUMBaselineName | Table @TableParams } } catch { Write-PScriboMessage -Message ($LocalizedData.VUMBaselineError -f $VMHost.Name, $_.Exception.Message) } } } } else { Write-PScriboMessage -Message $LocalizedData.InsufficientPrivVUMBaseline } #endregion ESXi Update Manager Baseline Information #region ESXi Update Manager Compliance Information if ($UserPrivileges -contains 'VcIntegrity.Updates.com.vmware.vcIntegrity.ViewStatus') { if ($VumServer.Name) { try { $VMHostCompliances = $VMHost | Get-Compliance -ErrorAction SilentlyContinue } catch { Write-PScriboMessage -Message $LocalizedData.VUMComplianceNotAvailable } if ($VMHostCompliances) { try { Section -Style NOTOCHeading5 -ExcludeFromTOC $LocalizedData.VUMCompliance { $VMHostComplianceInfo = foreach ($VMHostCompliance in $VMHostCompliances) { [PSCustomObject]@{ $LocalizedData.VUMBaselineName = $VMHostCompliance.Baseline.Name $LocalizedData.VUMStatus = switch ($VMHostCompliance.Status) { 'NotCompliant' { $LocalizedData.NotCompliant } default { $VMHostCompliance.Status } } } } if ($Healthcheck.VMHost.VUMCompliance) { $VMHostComplianceInfo | Where-Object { $_.$($LocalizedData.VUMStatus) -eq $LocalizedData.Unknown } | Set-Style -Style Warning $VMHostComplianceInfo | Where-Object { $_.$($LocalizedData.VUMStatus) -eq $LocalizedData.NotCompliant -or $_.$($LocalizedData.VUMStatus) -eq $LocalizedData.Incompatible } | Set-Style -Style Critical } $TableParams = @{ Name = ($LocalizedData.TableVUMCompliance -f $VMHost) ColumnWidths = 75, 25 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $VMHostComplianceInfo | Sort-Object $LocalizedData.VUMBaselineName | Table @TableParams } } catch { Write-PScriboMessage -Message -Message ($LocalizedData.VUMComplianceError -f $VMHost.Name, $_.Exception.Message) } } } } else { Write-PScriboMessage -Message $LocalizedData.InsufficientPrivVUMCompliance } #endregion ESXi Update Manager Compliance Information #region ESXi Host Comprehensive Information Section if ($InfoLevel.VMHost -ge 5) { #region ESXi Host Advanced System Settings try { Section -Style NOTOCHeading5 -ExcludeFromTOC $LocalizedData.AdvancedSettings { $AdvSettings = $VMHost | Get-AdvancedSetting | Select-Object @{L = $LocalizedData.Key; E = { $_.Name } }, @{L = $LocalizedData.Value; E = { $_.Value } } $TableParams = @{ Name = ($LocalizedData.TableAdvancedSettings -f $VMHost) ColumnWidths = 50, 50 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $AdvSettings | Sort-Object $LocalizedData.Key | Table @TableParams } } catch { Write-PScriboMessage -Message ($LocalizedData.AdvancedSettingsError -f $VMHost.Name, $_.Exception.Message) } #endregion ESXi Host Advanced System Settings #region ESXi Host Software VIBs try { Section -Style NOTOCHeading5 -ExcludeFromTOC $LocalizedData.VIBs { $esxcli = Get-EsxCli -VMHost $VMHost -V2 -Server $vCenter $VMHostVibs = $esxcli.software.vib.list.Invoke() $VMHostVibs = foreach ($VMHostVib in $VMHostVibs) { [PSCustomObject]@{ $LocalizedData.VIBName = $VMHostVib.Name $LocalizedData.VIBID = $VMHostVib.Id $LocalizedData.VIBVersion = $VMHostVib.Version $LocalizedData.VIBAcceptanceLevel = $VMHostVib.AcceptanceLevel $LocalizedData.VIBCreationDate = $VMHostVib.CreationDate $LocalizedData.VIBInstallDate = $VMHostVib.InstallDate } } $TableParams = @{ Name = ($LocalizedData.TableVIBs -f $VMHost) ColumnWidths = 15, 25, 15, 15, 15, 15 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $VMHostVibs | Sort-Object $LocalizedData.VIBInstallDate -Descending | Table @TableParams } } catch { Write-PScriboMessage -Message ($LocalizedData.VIBsError -f $VMHost.Name, $_.Exception.Message) } #endregion ESXi Host Software VIBs } #endregion ESXi Host Comprehensive Information Section } } catch { Write-PScriboMessage -IsWarning $($_.Exception.Message) } #endregion ESXi Host System Section } end {} } |