Src/Private/Get-AbrVSphereVMHostNetwork.ps1

function Get-AbrVSphereVMHostNetwork {
    <#
    .SYNOPSIS
        Used by As Built Report to retrieve VMware vSphere ESXi VMHost Network information.
    .NOTES
        Version: 2.0.0
        Author: Tim Carman
        Twitter: @tpcarman
        Github: tpcarman
    #>

    [CmdletBinding()]
    param ()

    begin {
        $LocalizedData = $reportTranslate.GetAbrVSphereVMHostNetwork
    }

    process {
        try {
            Write-PScriboMessage -Message $LocalizedData.Collecting
            #region ESXi Host Network Section
            Section -Style Heading4 $LocalizedData.SectionHeading {
                Paragraph ($LocalizedData.ParagraphSummary -f $VMHost)
                BlankLine
                #region ESXi Host Network Configuration
                $VMHostNetwork = $VMHost.ExtensionData.Config.Network
                $VMHostVirtualSwitch = @()
                $VMHostVss = foreach ($vSwitch in $VMHost.ExtensionData.Config.Network.Vswitch) {
                    $VMHostVirtualSwitch += $vSwitch.Name
                }
                $VMHostDvs = foreach ($dvSwitch in $VMHost.ExtensionData.Config.Network.ProxySwitch) {
                    $VMHostVirtualSwitch += $dvSwitch.DvsName
                }
                $VMHostNetworkDetail = [PSCustomObject]@{
                    $LocalizedData.Host = $VMHost.Name
                    $LocalizedData.VirtualSwitches = ($VMHostVirtualSwitch | Sort-Object) -join ', '
                    $LocalizedData.VMKernelAdapters = ($VMHostNetwork.Vnic.Device | Sort-Object) -join ', '
                    $LocalizedData.PhysicalAdapters = ($VMHostNetwork.Pnic.Device | Sort-Object) -join ', '
                    $LocalizedData.VMkernelGateway = $VMHostNetwork.IpRouteConfig.DefaultGateway
                    $LocalizedData.IPv6 = if ($VMHostNetwork.IPv6Enabled) {
                        $LocalizedData.Enabled
                    } else {
                        $LocalizedData.Disabled
                    }
                    $LocalizedData.VMkernelIPv6Gateway = if ($VMHostNetwork.IpRouteConfig.IpV6DefaultGateway) {
                        $VMHostNetwork.IpRouteConfig.IpV6DefaultGateway
                    } else {
                        '--'
                    }
                    $LocalizedData.DNSServers = ($VMHostNetwork.DnsConfig.Address | Sort-Object) -join ', '
                    $LocalizedData.HostName = $VMHostNetwork.DnsConfig.HostName
                    $LocalizedData.DomainName = $VMHostNetwork.DnsConfig.DomainName
                    $LocalizedData.SearchDomain = ($VMHostNetwork.DnsConfig.SearchDomain | Sort-Object) -join ', '
                }
                if ($Healthcheck.VMHost.IPv6) {
                    $VMHostNetworkDetail | Where-Object { $_.$($LocalizedData.IPv6) -eq $LocalizedData.Disabled } | Set-Style -Style Warning -Property $LocalizedData.IPv6
                }
                $TableParams = @{
                    Name = ($LocalizedData.TableNetworkConfig -f $VMHost)
                    List = $true
                    ColumnWidths = 40, 60
                }
                if ($Report.ShowTableCaptions) {
                    $TableParams['Caption'] = "- $($TableParams.Name)"
                }
                $VMHostNetworkDetail | Table @TableParams
                #endregion ESXi Host Network Configuration

                #region ESXi Host Physical Adapters
                Section -Style NOTOCHeading5 -ExcludeFromTOC $LocalizedData.PhysicalAdapters {
                    Paragraph ($LocalizedData.ParagraphPhysicalAdapters -f $VMHost)
                    $PhysicalNetAdapters = $VMHost.ExtensionData.Config.Network.Pnic | Sort-Object Device
                    $VMHostPhysicalNetAdapters = foreach ($PhysicalNetAdapter in $PhysicalNetAdapters) {
                        [PSCustomObject]@{
                            $LocalizedData.AdapterName = $PhysicalNetAdapter.Device
                            $LocalizedData.Status = if ($PhysicalNetAdapter.Linkspeed) {
                                $LocalizedData.Connected
                            } else {
                                $LocalizedData.Disconnected
                            }
                            $LocalizedData.VirtualSwitch = $(
                                if ($VMHost.ExtensionData.Config.Network.Vswitch.Pnic -contains $PhysicalNetAdapter.Key) {
                                    ($VMHost.ExtensionData.Config.Network.Vswitch | Where-Object { $_.Pnic -eq $PhysicalNetAdapter.Key }).Name
                                } elseif ($VMHost.ExtensionData.Config.Network.ProxySwitch.Pnic -contains $PhysicalNetAdapter.Key) {
                                    ($VMHost.ExtensionData.Config.Network.ProxySwitch | Where-Object { $_.Pnic -eq $PhysicalNetAdapter.Key }).DvsName
                                } else {
                                    '--'
                                }
                            )
                            $LocalizedData.AdapterMAC = $PhysicalNetAdapter.Mac
                            $LocalizedData.ActualSpeedDuplex = if ($PhysicalNetAdapter.LinkSpeed.SpeedMb) {
                                if ($PhysicalNetAdapter.LinkSpeed.Duplex) {
                                    "$($PhysicalNetAdapter.LinkSpeed.SpeedMb) Mbps, $($LocalizedData.FullDuplex)"
                                } else {
                                    $LocalizedData.AutoNegotiate
                                }
                            } else {
                                $LocalizedData.Down
                            }
                            $LocalizedData.ConfiguredSpeedDuplex = if ($PhysicalNetAdapter.Spec.LinkSpeed) {
                                if ($PhysicalNetAdapter.Spec.LinkSpeed.Duplex) {
                                    "$($PhysicalNetAdapter.Spec.LinkSpeed.SpeedMb) Mbps, $($LocalizedData.FullDuplex)"
                                } else {
                                    "$($PhysicalNetAdapter.Spec.LinkSpeed.SpeedMb) Mbps"
                                }
                            } else {
                                $LocalizedData.AutoNegotiate
                            }
                            $LocalizedData.WakeOnLAN = if ($PhysicalNetAdapter.WakeOnLanSupported) {
                                $LocalizedData.Supported
                            } else {
                                $LocalizedData.NotSupported
                            }
                        }
                    }
                    if ($Healthcheck.VMHost.NetworkAdapter) {
                        $VMHostPhysicalNetAdapters | Where-Object { $_.$($LocalizedData.Status) -ne $LocalizedData.Connected } | Set-Style -Style Critical -Property $LocalizedData.Status
                        $VMHostPhysicalNetAdapters | Where-Object { $_.$($LocalizedData.ActualSpeedDuplex) -eq $LocalizedData.Down } | Set-Style -Style Critical -Property $LocalizedData.ActualSpeedDuplex
                    }
                    if ($InfoLevel.VMHost -ge 4) {
                        foreach ($VMHostPhysicalNetAdapter in $VMHostPhysicalNetAdapters) {
                            Section -Style NOTOCHeading5 -ExcludeFromTOC "$($VMHostPhysicalNetAdapter.$($LocalizedData.AdapterName))" {
                                $TableParams = @{
                                    Name = ($LocalizedData.TablePhysicalAdapter -f $VMHostPhysicalNetAdapter.$($LocalizedData.AdapterName), $VMHost)
                                    List = $true
                                    ColumnWidths = 40, 60
                                }
                                if ($Report.ShowTableCaptions) {
                                    $TableParams['Caption'] = "- $($TableParams.Name)"
                                }
                                $VMHostPhysicalNetAdapter | Table @TableParams
                            }
                        }
                    } else {
                        BlankLine
                        $TableParams = @{
                            Name = ($LocalizedData.TablePhysicalAdapters -f $VMHost)
                            ColumnWidths = 11, 13, 15, 19, 14, 14, 14
                        }
                        if ($Report.ShowTableCaptions) {
                            $TableParams['Caption'] = "- $($TableParams.Name)"
                        }
                        $VMHostPhysicalNetAdapters | Table @TableParams
                    }
                }
                #endregion ESXi Host Physical Adapters

                #region ESXi Host Cisco Discovery Protocol
                $VMHostNetworkAdapterCDP = $VMHost | Get-VMHostNetworkAdapterDP | Where-Object { $_.Status -eq 'Connected' } | Sort-Object Device
                if ($VMHostNetworkAdapterCDP) {
                    Section -Style NOTOCHeading5 -ExcludeFromTOC $LocalizedData.CDP {
                        Paragraph ($LocalizedData.ParagraphCDP -f $VMHost)
                        if ($InfoLevel.VMHost -ge 4) {
                            foreach ($VMHostNetworkAdapter in $VMHostNetworkAdapterCDP) {
                                Section -Style NOTOCHeading5 -ExcludeFromTOC "$($VMHostNetworkAdapter.Device)" {
                                    $VMHostCDP = [PSCustomObject]@{
                                        $LocalizedData.Status = $VMHostNetworkAdapter.Status
                                        $LocalizedData.SystemName = $VMHostNetworkAdapter.SystemName
                                        $LocalizedData.HardwarePlatform = $VMHostNetworkAdapter.HardwarePlatform
                                        $LocalizedData.SwitchID = $VMHostNetworkAdapter.SwitchId
                                        $LocalizedData.SoftwareVersion = $VMHostNetworkAdapter.SoftwareVersion
                                        $LocalizedData.ManagementAddress = $VMHostNetworkAdapter.ManagementAddress
                                        $LocalizedData.Address = $VMHostNetworkAdapter.Address
                                        $LocalizedData.PortID = $VMHostNetworkAdapter.PortId
                                        $LocalizedData.VLAN = $VMHostNetworkAdapter.Vlan
                                        $LocalizedData.MTU = $VMHostNetworkAdapter.Mtu
                                    }
                                    $TableParams = @{
                                        Name = ($LocalizedData.TableAdapterCDP -f $VMHostNetworkAdapter.Device, $VMHost)
                                        List = $true
                                        ColumnWidths = 40, 60
                                    }
                                    if ($Report.ShowTableCaptions) {
                                        $TableParams['Caption'] = "- $($TableParams.Name)"
                                    }
                                    $VMHostCDP | Table @TableParams
                                }
                            }
                        } else {
                            BlankLine
                            $VMHostCDP = foreach ($VMHostNetworkAdapter in $VMHostNetworkAdapterCDP) {
                                [PSCustomObject]@{
                                    $LocalizedData.AdapterName = $VMHostNetworkAdapter.Device
                                    $LocalizedData.Status = $VMHostNetworkAdapter.Status
                                    $LocalizedData.HardwarePlatform = $VMHostNetworkAdapter.HardwarePlatform
                                    $LocalizedData.SwitchID = $VMHostNetworkAdapter.SwitchId
                                    $LocalizedData.Address = $VMHostNetworkAdapter.Address
                                    $LocalizedData.PortID = $VMHostNetworkAdapter.PortId
                                }
                            }
                            $TableParams = @{
                                Name = ($LocalizedData.TableAdaptersCDP -f $VMHost)
                                ColumnWidths = 11, 13, 26, 22, 17, 11
                            }
                            if ($Report.ShowTableCaptions) {
                                $TableParams['Caption'] = "- $($TableParams.Name)"
                            }
                            $VMHostCDP | Table @TableParams
                        }
                    }
                }
                #endregion ESXi Host Cisco Discovery Protocol

                #region ESXi Host Link Layer Discovery Protocol
                $VMHostNetworkAdapterLLDP = $VMHost | Get-VMHostNetworkAdapterDP | Where-Object { $null -ne $_.ChassisId } | Sort-Object Device
                if ($VMHostNetworkAdapterLLDP) {
                    Section -Style NOTOCHeading5 -ExcludeFromTOC $LocalizedData.LLDP {
                        Paragraph ($LocalizedData.ParagraphLLDP -f $VMHost)
                        if ($InfoLevel.VMHost -ge 4) {
                            foreach ($VMHostNetworkAdapter in $VMHostNetworkAdapterLLDP) {
                                Section -Style NOTOCHeading5 -ExcludeFromTOC "$($VMHostNetworkAdapter.Device)" {
                                    $VMHostLLDP = [PSCustomObject]@{
                                        $LocalizedData.ChassisID = $VMHostNetworkAdapter.ChassisId
                                        $LocalizedData.PortID = $VMHostNetworkAdapter.PortId
                                        $LocalizedData.TimeToLive = $VMHostNetworkAdapter.TimeToLive
                                        $LocalizedData.TimeOut = $VMHostNetworkAdapter.TimeOut
                                        $LocalizedData.Samples = $VMHostNetworkAdapter.Samples
                                        $LocalizedData.ManagementAddress = $VMHostNetworkAdapter.ManagementAddress
                                        $LocalizedData.PortDescription = $VMHostNetworkAdapter.PortDescription
                                        $LocalizedData.SystemDescription = $VMHostNetworkAdapter.SystemDescription
                                        $LocalizedData.SystemName = $VMHostNetworkAdapter.SystemName
                                    }
                                    $TableParams = @{
                                        Name = ($LocalizedData.TableAdapterLLDP -f $VMHostNetworkAdapter.Device, $VMHost)
                                        List = $true
                                        ColumnWidths = 40, 60
                                    }
                                    if ($Report.ShowTableCaptions) {
                                        $TableParams['Caption'] = "- $($TableParams.Name)"
                                    }
                                    $VMHostLLDP | Table @TableParams
                                }
                            }
                        } else {
                            BlankLine
                            $VMHostLLDP = foreach ($VMHostNetworkAdapter in $VMHostNetworkAdapterLLDP) {
                                [PSCustomObject]@{
                                    $LocalizedData.AdapterName = $VMHostNetworkAdapter.Device
                                    $LocalizedData.ChassisID = $VMHostNetworkAdapter.ChassisId
                                    $LocalizedData.PortID = $VMHostNetworkAdapter.PortId
                                    $LocalizedData.ManagementAddress = $VMHostNetworkAdapter.ManagementAddress
                                    $LocalizedData.PortDescription = $VMHostNetworkAdapter.PortDescription
                                    $LocalizedData.SystemName = $VMHostNetworkAdapter.SystemName
                                }
                            }
                            $TableParams = @{
                                Name = ($LocalizedData.TableAdaptersLLDP -f $VMHost)
                                ColumnWidths = 11, 19, 16, 19, 18, 17
                            }
                            if ($Report.ShowTableCaptions) {
                                $TableParams['Caption'] = "- $($TableParams.Name)"
                            }
                            $VMHostLLDP | Table @TableParams
                        }
                    }
                }
                #endregion ESXi Host Link Layer Discovery Protocol

                #region ESXi Host VMkernel Adapaters
                Section -Style NOTOCHeading5 -ExcludeFromTOC $LocalizedData.VMKernelAdapters {
                    Paragraph ($LocalizedData.ParagraphVMKernelAdapters -f $VMHost)
                    $VMkernelAdapters = $VMHost | Get-View | ForEach-Object -Process {
                        #$esx = $_
                        $netSys = Get-View -Id $_.ConfigManager.NetworkSystem
                        $vnicMgr = Get-View -Id $_.ConfigManager.VirtualNicManager
                        $netSys.NetworkInfo.Vnic |
                        ForEach-Object -Process {
                            $device = $_.Device
                            [PSCustomObject]@{
                                $LocalizedData.AdapterName = $_.Device
                                $LocalizedData.NetworkLabel = & {
                                    if ($_.Spec.Portgroup) {
                                        $script:pg = $_.Spec.Portgroup
                                        $script:pg
                                    } elseif ($_.Spec.DistributedVirtualPort.Portgroupkey) {
                                        $script:pg = Get-View -ViewType DistributedVirtualPortgroup -Property Name, Key -Filter @{'Key' = "$($_.Spec.DistributedVirtualPort.PortgroupKey)" } | Select-Object -ExpandProperty Name
                                        $script:pg
                                    } else {
                                        '--'
                                    }
                                }
                                $LocalizedData.VirtualSwitch = & {
                                    if ($_.Spec.Portgroup) {
                                        (Get-VirtualPortGroup -Standard -Name $script:pg -VMHost $VMHost).VirtualSwitchName
                                    } elseif ($_.Spec.DistributedVirtualPort.Portgroupkey) {
                                        (Get-VDPortgroup -Name $script:pg).VDSwitch.Name | Select-Object -Unique
                                    } else {
                                        # Haven't figured out how to gather this yet!
                                        '--'
                                    }
                                }
                                $LocalizedData.TCPIPStack = switch ($_.Spec.NetstackInstanceKey) {
                                    'defaultTcpipStack' { $LocalizedData.TCPDefault }
                                    'vSphereProvisioning' { $LocalizedData.TCPProvisioning }
                                    'vmotion' { $LocalizedData.TCPvMotion }
                                    'vxlan' { $LocalizedData.TCPNsxOverlay }
                                    'hyperbus' { $LocalizedData.TCPNsxHyperbus }
                                    $null { $LocalizedData.TCPNotApplicable }
                                    default { $_.Spec.NetstackInstanceKey }
                                }
                                $LocalizedData.MTU = $_.Spec.Mtu
                                $LocalizedData.AdapterMAC = $_.Spec.Mac
                                $LocalizedData.DHCP = if ($_.Spec.Ip.Dhcp) {
                                    $LocalizedData.Enabled
                                } else {
                                    $LocalizedData.Disabled
                                }
                                $LocalizedData.IPAddress = & {
                                    if ($_.Spec.IP.IPAddress) {
                                        $script:ip = $_.Spec.IP.IPAddress
                                    } else {
                                        $script:ip = '--'
                                    }
                                    $script:ip
                                }
                                $LocalizedData.SubnetMask = & {
                                    if ($_.Spec.IP.SubnetMask) {
                                        $script:netmask = $_.Spec.IP.SubnetMask
                                    } else {
                                        $script:netmask = '--'
                                    }
                                    $script:netmask
                                }
                                $LocalizedData.DefaultGateway = if ($_.Spec.IpRouteSpec.IpRouteConfig.DefaultGateway) {
                                    $_.Spec.IpRouteSpec.IpRouteConfig.DefaultGateway
                                } else {
                                    '--'
                                }
                                $LocalizedData.vMotion = if ((($vnicMgr.Info.NetConfig | Where-Object { $_.NicType -eq 'vmotion' }).SelectedVnic | ForEach-Object { $_ -match $device } ) -contains $true) {
                                    $LocalizedData.Enabled
                                } else {
                                    $LocalizedData.Disabled
                                }
                                $LocalizedData.Provisioning = if ((($vnicMgr.Info.NetConfig | Where-Object { $_.NicType -eq 'vSphereProvisioning' }).SelectedVnic | ForEach-Object { $_ -match $device } ) -contains $true) {
                                    $LocalizedData.Enabled
                                } else {
                                    $LocalizedData.Disabled
                                }
                                $LocalizedData.FTLogging = if ((($vnicMgr.Info.NetConfig | Where-Object { $_.NicType -eq 'faultToleranceLogging' }).SelectedVnic | ForEach-Object { $_ -match $device } ) -contains $true) {
                                    $LocalizedData.Enabled
                                } else {
                                    $LocalizedData.Disabled
                                }
                                $LocalizedData.Management = if ((($vnicMgr.Info.NetConfig | Where-Object { $_.NicType -eq 'management' }).SelectedVnic | ForEach-Object { $_ -match $device } ) -contains $true) {
                                    $LocalizedData.Enabled
                                } else {
                                    $LocalizedData.Disabled
                                }
                                $LocalizedData.vSphereReplication = if ((($vnicMgr.Info.NetConfig | Where-Object { $_.NicType -eq 'vSphereReplication' }).SelectedVnic | ForEach-Object { $_ -match $device } ) -contains $true) {
                                    $LocalizedData.Enabled
                                } else {
                                    $LocalizedData.Disabled
                                }
                                $LocalizedData.vSphereReplicationNFC = if ((($vnicMgr.Info.NetConfig | Where-Object { $_.NicType -eq 'vSphereReplicationNFC' }).SelectedVnic | ForEach-Object { $_ -match $device } ) -contains $true) {
                                    $LocalizedData.Enabled
                                } else {
                                    $LocalizedData.Disabled
                                }
                                $LocalizedData.vSAN = if ((($vnicMgr.Info.NetConfig | Where-Object { $_.NicType -eq 'vsan' }).SelectedVnic | ForEach-Object { $_ -match $device } ) -contains $true) {
                                    $LocalizedData.Enabled
                                } else {
                                    $LocalizedData.Disabled
                                }
                                $LocalizedData.vSANWitness = if ((($vnicMgr.Info.NetConfig | Where-Object { $_.NicType -eq 'vsanWitness' }).SelectedVnic | ForEach-Object { $_ -match $device } ) -contains $true) {
                                    $LocalizedData.Enabled
                                } else {
                                    $LocalizedData.Disabled
                                }
                                $LocalizedData.vSphereBackupNFC = if ((($vnicMgr.Info.NetConfig | Where-Object { $_.NicType -eq 'vSphereBackupnNFC' }).SelectedVnic | ForEach-Object { $_ -match $device } ) -contains $true) {
                                    $LocalizedData.Enabled
                                } else {
                                    $LocalizedData.Disabled
                                }
                            }
                        }
                    }
                    foreach ($VMkernelAdapter in ($VMkernelAdapters | Sort-Object $LocalizedData.AdapterName)) {
                        Section -Style NOTOCHeading5 -ExcludeFromTOC "$($VMkernelAdapter.$($LocalizedData.AdapterName))" {
                            $TableParams = @{
                                Name = ($LocalizedData.TableVMKernelAdapter -f $VMkernelAdapter.$($LocalizedData.AdapterName), $VMHost)
                                List = $true
                                ColumnWidths = 40, 60
                            }
                            if ($Report.ShowTableCaptions) {
                                $TableParams['Caption'] = "- $($TableParams.Name)"
                            }
                            $VMkernelAdapter | Table @TableParams
                        }
                    }
                }
                #endregion ESXi Host VMkernel Adapaters

                #region ESXi Host Standard Virtual Switches
                $VSSwitches = $VMHost | Get-VirtualSwitch -Standard | Sort-Object Name
                if ($VSSwitches) {
                    #region Section Standard Virtual Switches
                    Section -Style NOTOCHeading5 -ExcludeFromTOC $LocalizedData.StandardvSwitches {
                        Paragraph ($LocalizedData.ParagraphStandardvSwitches -f $VMHost)
                        BlankLine
                        $VSSwitchNicTeaming = $VSSwitches | Get-NicTeamingPolicy
                        #region ESXi Host Standard Virtual Switch Properties
                        $VSSProperties = foreach ($VSSwitchNicTeam in $VSSwitchNicTeaming) {
                            [PSCustomObject]@{
                                $LocalizedData.VirtualSwitch = $VSSwitchNicTeam.VirtualSwitch.Name
                                $LocalizedData.MTU = $VSSwitchNicTeam.VirtualSwitch.Mtu
                                $LocalizedData.NumberOfPorts = $VSSwitchNicTeam.VirtualSwitch.NumPorts
                                $LocalizedData.NumberOfPortsAvailable = $VSSwitchNicTeam.VirtualSwitch.NumPortsAvailable
                            }
                        }
                        $TableParams = @{
                            Name = ($LocalizedData.TableStandardvSwitches -f $VMHost)
                            ColumnWidths = 25, 25, 25, 25
                        }
                        if ($Report.ShowTableCaptions) {
                            $TableParams['Caption'] = "- $($TableParams.Name)"
                        }
                        $VSSProperties | Table @TableParams
                        #endregion ESXi Host Standard Virtual Switch Properties

                        #region ESXi Host Virtual Switch Security Policy
                        $VssSecurity = $VSSwitches | Get-SecurityPolicy
                        if ($VssSecurity) {
                            #region Virtual Switch Security Policy
                            Section -Style NOTOCHeading5 -ExcludeFromTOC $LocalizedData.VSSecurity {
                                $VssSecurity = foreach ($VssSec in $VssSecurity) {
                                    [PSCustomObject]@{
                                        $LocalizedData.VirtualSwitch = $VssSec.VirtualSwitch.Name
                                        $LocalizedData.PromiscuousMode = if ($VssSec.AllowPromiscuous) {
                                            $LocalizedData.Accept
                                        } else {
                                            $LocalizedData.Reject
                                        }
                                        $LocalizedData.MACAddressChanges = if ($VssSec.MacChanges) {
                                            $LocalizedData.Accept
                                        } else {
                                            $LocalizedData.Reject
                                        }
                                        $LocalizedData.ForgedTransmits = if ($VssSec.ForgedTransmits) {
                                            $LocalizedData.Accept
                                        } else {
                                            $LocalizedData.Reject
                                        }
                                    }
                                }
                                $TableParams = @{
                                    Name = ($LocalizedData.TableVSSecurity -f $VMHost)
                                    ColumnWidths = 25, 25, 25, 25
                                }
                                if ($Report.ShowTableCaptions) {
                                    $TableParams['Caption'] = "- $($TableParams.Name)"
                                }
                                $VssSecurity | Sort-Object $LocalizedData.VirtualSwitch | Table @TableParams
                            }
                            #endregion Virtual Switch Security Policy
                        }
                        #endregion ESXi Host Virtual Switch Security Policy

                        #region ESXi Host Virtual Switch Traffic Shaping Policy
                        Section -Style NOTOCHeading5 -ExcludeFromTOC $LocalizedData.VSTrafficShaping {
                            $VssTrafficShapingPolicy = foreach ($VSSwitch in $VSSwitches) {
                                [PSCustomObject]@{
                                    $LocalizedData.VirtualSwitch = $VSSwitch.Name
                                    $LocalizedData.Status = if ($VSSwitch.ExtensionData.Spec.Policy.ShapingPolicy.Enabled) {
                                        $LocalizedData.Enabled
                                    } else {
                                        $LocalizedData.Disabled
                                    }
                                    $LocalizedData.AverageBandwidth = $VSSwitch.ExtensionData.Spec.Policy.ShapingPolicy.AverageBandwidth
                                    $LocalizedData.PeakBandwidth = $VSSwitch.ExtensionData.Spec.Policy.ShapingPolicy.PeakBandwidth
                                    $LocalizedData.BurstSize = $VSSwitch.ExtensionData.Spec.Policy.ShapingPolicy.BurstSize
                                }
                            }
                            $TableParams = @{
                                Name = ($LocalizedData.TableVSTrafficShaping -f $VMHost)
                                ColumnWidths = 25, 15, 20, 20, 20
                            }
                            if ($Report.ShowTableCaptions) {
                                $TableParams['Caption'] = "- $($TableParams.Name)"
                            }
                            $VssTrafficShapingPolicy | Sort-Object $LocalizedData.VirtualSwitch | Table @TableParams
                        }
                        #endregion ESXi Host Virtual Switch Traffic Shaping Policy

                        #region ESXi Host Virtual Switch Teaming & Failover
                        $VssNicTeamingPolicy = $VSSwitches | Get-NicTeamingPolicy
                        if ($VssNicTeamingPolicy) {
                            #region Virtual Switch Teaming & Failover Section
                            Section -Style NOTOCHeading5 -ExcludeFromTOC $LocalizedData.VSTeamingFailover {
                                $VssNicTeaming = foreach ($VssNicTeam in $VssNicTeamingPolicy) {
                                    [PSCustomObject]@{
                                        $LocalizedData.VirtualSwitch = $VssNicTeam.VirtualSwitch.Name
                                        $LocalizedData.LoadBalancing = switch ($VssNicTeam.LoadBalancingPolicy) {
                                            'LoadbalanceSrcId' { $LocalizedData.LBSrcId }
                                            'LoadbalanceSrcMac' { $LocalizedData.LBSrcMac }
                                            'LoadbalanceIP' { $LocalizedData.LBIP }
                                            'ExplicitFailover' { $LocalizedData.LBExplicitFailover }
                                            default { $VssNicTeam.LoadBalancingPolicy }
                                        }
                                        $LocalizedData.NetworkFailureDetection = switch ($VssNicTeam.NetworkFailoverDetectionPolicy) {
                                            'LinkStatus' { $LocalizedData.NFDLinkStatus }
                                            'BeaconProbing' { $LocalizedData.NFDBeaconProbing }
                                            default { $VssNicTeam.NetworkFailoverDetectionPolicy }
                                        }
                                        $LocalizedData.NotifySwitches = if ($VssNicTeam.NotifySwitches) {
                                            $LocalizedData.Yes
                                        } else {
                                            $LocalizedData.No
                                        }
                                        $LocalizedData.Failback = if ($VssNicTeam.FailbackEnabled) {
                                            $LocalizedData.Yes
                                        } else {
                                            $LocalizedData.No
                                        }
                                        $LocalizedData.ActiveNICs = ($VssNicTeam.ActiveNic | Sort-Object) -join [Environment]::NewLine
                                        $LocalizedData.StandbyNICs = ($VssNicTeam.StandbyNic | Sort-Object) -join [Environment]::NewLine
                                        $LocalizedData.UnusedNICs = ($VssNicTeam.UnusedNic | Sort-Object) -join [Environment]::NewLine
                                    }
                                }
                                $TableParams = @{
                                    Name = ($LocalizedData.TableVSTeamingFailover -f $VMHost)
                                    ColumnWidths = 20, 17, 12, 11, 10, 10, 10, 10
                                }
                                if ($Report.ShowTableCaptions) {
                                    $TableParams['Caption'] = "- $($TableParams.Name)"
                                }
                                $VssNicTeaming | Sort-Object $LocalizedData.VirtualSwitch | Table @TableParams
                            }
                            #endregion Virtual Switch Teaming & Failover Section
                        }
                        #endregion ESXi Host Virtual Switch Teaming & Failover

                        #region ESXi Host Virtual Switch Port Groups
                        $VssPortgroups = $VSSwitches | Get-VirtualPortGroup -Standard
                        if ($VssPortgroups) {
                            Section -Style NOTOCHeading5 -ExcludeFromTOC $LocalizedData.VSPortGroups {
                                $VssPortgroups = foreach ($VssPortgroup in $VssPortgroups) {
                                    [PSCustomObject]@{
                                        $LocalizedData.PortGroup = $VssPortgroup.Name
                                        $LocalizedData.VLAN = $VssPortgroup.VLanId
                                        $LocalizedData.VirtualSwitch = $VssPortgroup.VirtualSwitchName
                                        $LocalizedData.NumberOfVMs = ($VssPortgroup | Get-VM).Count
                                    }
                                }
                                $TableParams = @{
                                    Name = ($LocalizedData.TableVSPortGroups -f $VMHost)
                                    ColumnWidths = 40, 10, 40, 10
                                }
                                if ($Report.ShowTableCaptions) {
                                    $TableParams['Caption'] = "- $($TableParams.Name)"
                                }
                                $VssPortgroups | Sort-Object $LocalizedData.PortGroup, $LocalizedData.VLAN, $LocalizedData.VirtualSwitch | Table @TableParams
                            }
                            #endregion ESXi Host Virtual Switch Port Groups

                            #region ESXi Host Virtual Switch Port Group Security Policy
                            $VssPortgroupSecurity = $VSSwitches | Get-VirtualPortGroup | Get-SecurityPolicy
                            if ($VssPortgroupSecurity) {
                                #region Virtual Port Group Security Policy Section
                                Section -Style NOTOCHeading5 -ExcludeFromTOC $LocalizedData.VSPGSecurity {
                                    $VssPortgroupSecurity = foreach ($VssPortgroupSec in $VssPortgroupSecurity) {
                                        [PSCustomObject]@{
                                            $LocalizedData.PortGroup = $VssPortgroupSec.VirtualPortGroup.Name
                                            $LocalizedData.VirtualSwitch = $VssPortgroupSec.virtualportgroup.virtualswitchname
                                            $LocalizedData.PromiscuousMode = if ($VssPortgroupSec.AllowPromiscuous) {
                                                $LocalizedData.Accept
                                            } else {
                                                $LocalizedData.Reject
                                            }
                                            $LocalizedData.MACChanges = if ($VssPortgroupSec.MacChanges) {
                                                $LocalizedData.Accept
                                            } else {
                                                $LocalizedData.Reject
                                            }
                                            $LocalizedData.ForgedTransmits = if ($VssPortgroupSec.ForgedTransmits) {
                                                $LocalizedData.Accept
                                            } else {
                                                $LocalizedData.Reject
                                            }
                                        }
                                    }
                                    $TableParams = @{
                                        Name = ($LocalizedData.TableVSPGSecurity -f $VMHost)
                                        ColumnWidths = 27, 25, 16, 16, 16
                                    }
                                    if ($Report.ShowTableCaptions) {
                                        $TableParams['Caption'] = "- $($TableParams.Name)"
                                    }
                                    $VssPortgroupSecurity | Sort-Object $LocalizedData.PortGroup, $LocalizedData.VirtualSwitch | Table @TableParams
                                }
                                #endregion Virtual Port Group Security Policy Section
                            }
                            #endregion ESXi Host Virtual Switch Port Group Security Policy

                            #region ESXi Host Virtual Switch Port Group Traffic Shaping Policy
                            Section -Style NOTOCHeading5 -ExcludeFromTOC $LocalizedData.VSPGTrafficShaping {
                                $VssPortgroupTrafficShapingPolicy = foreach ($VssPortgroup in $VssPortgroups) {
                                    [PSCustomObject]@{
                                        $LocalizedData.PortGroup = $VssPortgroup.Name
                                        $LocalizedData.VirtualSwitch = $VssPortgroup.VirtualSwitchName
                                        $LocalizedData.Status = switch ($VssPortgroup.ExtensionData.Spec.Policy.ShapingPolicy.Enabled) {
                                            $True { $LocalizedData.Enabled }
                                            $False { $LocalizedData.Disabled }
                                            $null { $LocalizedData.Inherited }
                                        }
                                        $LocalizedData.AverageBandwidth = $VssPortgroup.ExtensionData.Spec.Policy.ShapingPolicy.AverageBandwidth
                                        $LocalizedData.PeakBandwidth = $VssPortgroup.ExtensionData.Spec.Policy.ShapingPolicy.PeakBandwidth
                                        $LocalizedData.BurstSize = $VssPortgroup.ExtensionData.Spec.Policy.ShapingPolicy.BurstSize
                                    }
                                }
                                $TableParams = @{
                                    Name = ($LocalizedData.TableVSPGTrafficShaping -f $VMHost)
                                    ColumnWidths = 19, 19, 11, 17, 17, 17
                                }
                                if ($Report.ShowTableCaptions) {
                                    $TableParams['Caption'] = "- $($TableParams.Name)"
                                }
                                $VssPortgroupTrafficShapingPolicy | Sort-Object $LocalizedData.PortGroup, $LocalizedData.VirtualSwitch | Table @TableParams
                            }
                            #endregion ESXi Host Virtual Switch Port Group Traffic Shaping Policy

                            #region ESXi Host Virtual Switch Port Group Teaming & Failover
                            $VssPortgroupNicTeaming = $VSSwitches | Get-VirtualPortGroup | Get-NicTeamingPolicy
                            if ($VssPortgroupNicTeaming) {
                                #region Virtual Switch Port Group Teaming & Failover Section
                                Section -Style NOTOCHeading5 -ExcludeFromTOC $LocalizedData.VSPGTeamingFailover {
                                    $VssPortgroupNicTeaming = foreach ($VssPortgroupNicTeam in $VssPortgroupNicTeaming) {
                                        [PSCustomObject]@{
                                            $LocalizedData.PortGroup = $VssPortgroupNicTeam.VirtualPortGroup.Name
                                            $LocalizedData.VirtualSwitch = $VssPortgroupNicTeam.virtualportgroup.virtualswitchname
                                            $LocalizedData.LoadBalancing = switch ($VssPortgroupNicTeam.LoadBalancingPolicy) {
                                                'LoadbalanceSrcId' { $LocalizedData.LBSrcId }
                                                'LoadbalanceSrcMac' { $LocalizedData.LBSrcMac }
                                                'LoadbalanceIP' { $LocalizedData.LBIP }
                                                'ExplicitFailover' { $LocalizedData.LBExplicitFailover }
                                                default { $VssPortgroupNicTeam.LoadBalancingPolicy }
                                            }
                                            $LocalizedData.NetworkFailureDetection = switch ($VssPortgroupNicTeam.NetworkFailoverDetectionPolicy) {
                                                'LinkStatus' { $LocalizedData.NFDLinkStatus }
                                                'BeaconProbing' { $LocalizedData.NFDBeaconProbing }
                                                default { $VssPortgroupNicTeam.NetworkFailoverDetectionPolicy }
                                            }
                                            $LocalizedData.NotifySwitches = if ($VssPortgroupNicTeam.NotifySwitches) {
                                                $LocalizedData.Yes
                                            } else {
                                                $LocalizedData.No
                                            }
                                            $LocalizedData.Failback = if ($VssPortgroupNicTeam.FailbackEnabled) {
                                                $LocalizedData.Yes
                                            } else {
                                                $LocalizedData.No
                                            }
                                            $LocalizedData.ActiveNICs = ($VssPortgroupNicTeam.ActiveNic | Sort-Object) -join [Environment]::NewLine
                                            $LocalizedData.StandbyNICs = ($VssPortgroupNicTeam.StandbyNic | Sort-Object) -join [Environment]::NewLine
                                            $LocalizedData.UnusedNICs = ($VssPortgroupNicTeam.UnusedNic | Sort-Object) -join [Environment]::NewLine
                                        }
                                    }
                                    $TableParams = @{
                                        Name = ($LocalizedData.TableVSPGTeamingFailover -f $VMHost)
                                        ColumnWidths = 12, 11, 11, 11, 11, 11, 11, 11, 11
                                    }
                                    if ($Report.ShowTableCaptions) {
                                        $TableParams['Caption'] = "- $($TableParams.Name)"
                                    }
                                    $VssPortgroupNicTeaming | Sort-Object $LocalizedData.PortGroup, $LocalizedData.VirtualSwitch | Table @TableParams
                                }
                                #endregion Virtual Switch Port Group Teaming & Failover Section
                            }
                            #endregion ESXi Host Virtual Switch Port Group Teaming & Failover
                        }
                    }
                    #endregion Section Standard Virtual Switches
                }
                #endregion ESXi Host Standard Virtual Switches
            }
        } catch {
            Write-PScriboMessage -IsWarning $($_.Exception.Message)
        }
        #endregion ESXi Host Network Section
    }

    end {}
}