Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
94734de
Rename Get-TimeZoneInformationRegistrySettings
dpaulson45 Jan 18, 2023
91cf46b
Removed OS Class from HC
dpaulson45 Jan 18, 2023
3518945
Removed Hardward Class from HC
dpaulson45 Jan 18, 2023
32f3d99
Stash current pester changes
dpaulson45 Jan 18, 2023
76b0658
Fix issue in frequent config issues
dpaulson45 Jan 18, 2023
e5c3439
fix issue in Cve check
dpaulson45 Jan 18, 2023
f34819a
Resolve pester testing changes
dpaulson45 Jan 18, 2023
b76b248
Remove Organization Information Class from HC
dpaulson45 Jan 19, 2023
4da9423
Removed ExchangeInformation class from HC
dpaulson45 Jan 20, 2023
180ceb7
Update to address pester results
dpaulson45 Jan 21, 2023
c9804db
Be able to reverse lookup build number by Exchange CU/SU level
dpaulson45 Jan 23, 2023
3dd6249
Be able to do -Verbose against Invoke-AnalyzerEngine
dpaulson45 Jan 23, 2023
2fa8af8
New comparison file
dpaulson45 Jan 23, 2023
7d85943
Add Find by SU Name option
dpaulson45 Jan 24, 2023
786e33f
Incude Feb19SU
dpaulson45 Jan 24, 2023
2eaecf5
Include Feb19SU in name of test
dpaulson45 Feb 3, 2023
153692a
Load Microsoft.PowerShell.Security module for certificate tests
dpaulson45 Feb 3, 2023
e5dd82d
Make Operating System Build Info use same property name as Exchange B…
dpaulson45 Feb 3, 2023
1db5bcf
Fixed bug in Get-ExchangeInformation
dpaulson45 Feb 3, 2023
c8ba351
Fixed issue within Invoke-AnalyzerFrequentConfigurationIssues.ps1
dpaulson45 Feb 3, 2023
1c27a56
Fixed issue within Invoke-AnalyzerExchangeInformation.ps1
dpaulson45 Feb 3, 2023
2d79272
Remove CULevel from HC class
dpaulson45 Jan 24, 2023
449637f
Adjust for previous missing CVE
dpaulson45 Feb 3, 2023
374c6ec
Removed ServerRole, MajorVersion, OSVersion enums
dpaulson45 Feb 8, 2023
8d712e1
Fix bug in if statement for Windows2012 logic
dpaulson45 Feb 9, 2023
b29e96a
Use array casting in what was defined as an array before in the class
dpaulson45 Feb 9, 2023
44cf527
Fix issue within Get-ExchangeInformation
dpaulson45 Feb 10, 2023
f6f07ba
Merge branch 'main' into dpaul-HcRemoveClass
dpaulson45 Feb 10, 2023
df776fb
Merge pull request #1480 from microsoft/dpaul-HcRemoveClass
dpaulson45 Feb 10, 2023
3e8f95a
New rule to prevent Clear-Host in scripts
dpaulson45 Feb 10, 2023
3b2eba3
Follow new rule for no Clear-Host
dpaulson45 Feb 10, 2023
8067ca6
Merge pull request #1482 from microsoft/dpaul-ClearHostRule
dpaulson45 Feb 10, 2023
56d8b94
Get-NETFrameworkVersion to find by short name
dpaulson45 Feb 10, 2023
a6373f1
Removed NetMajorVersion from HC class
dpaulson45 Feb 10, 2023
1cc7ab7
Removed ServerType from HC class
dpaulson45 Feb 10, 2023
ba9e4ff
Removed last of class from HC
dpaulson45 Feb 10, 2023
33dceeb
Merge pull request #1483 from microsoft/dpaul-HcRemoveClass
dpaulson45 Feb 13, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions .build/CodeFormatterChecks/CustomRules.psm1
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,37 @@ function AvoidUsingReadHost {
}
}
}

function AvoidUsingClearHost {

[CmdletBinding()]
[OutputType([PSCustomObject[]])]
param (
[Parameter(Mandatory)]
[ValidateNotNullOrEmpty()]
[System.Management.Automation.Language.ScriptBlockAst]$ScriptBlockAst
)

process {

try {
$functions = $ScriptBlockAst.FindAll(
{
$args[0] -is [System.Management.Automation.Language.CommandAst]
}, $true )
foreach ( $function in $functions ) {

if (($function.GetCommandName()) -eq "Clear-Host") {
[PSCustomObject]@{
Message = "Avoid using Clear-Host. The screen should not be cleared when running the script."
Extent = $function.Extent
RuleName = $PSCmdlet.MyInvocation.InvocationName
Severity = "Error"
}
}
}
} catch {
$PSCmdlet.ThrowTerminatingError( $_ )
}
}
}
6 changes: 0 additions & 6 deletions Admin/Get-EASMailboxLogs.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,6 @@ if ($null -ne $EnableVerboseLogging) {
}
}

Clear-Host
Write-Host "Do not close this window until you are ready to collect the logs." -ForegroundColor Black -BackgroundColor Yellow
Write-Host "Press any key to continue ..." -ForegroundColor Yellow
$host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") | Out-Null
Clear-Host

# Convert the interval into seconds
$Interval = $Interval * 60

Expand Down
1 change: 0 additions & 1 deletion Databases/VSSTester/VSSTester.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,5 @@ function Main {
}

try {
Clear-Host
Main
} catch { } finally { }
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ function Add-AnalyzedResultInformation {
param(
# Main object that we are manipulating and adding entries to
[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
[HealthChecker.AnalyzedInformation]$AnalyzedInformation,
[object]$AnalyzedInformation,

# The value of the display entry
[object]$Details,
Expand Down Expand Up @@ -92,11 +92,21 @@ function Add-AnalyzedResultInformation {
if ($AddDisplayResultsLineInfo) {
if (!($AnalyzedInformation.DisplayResults.ContainsKey($DisplayGroupingKey))) {
Write-Verbose "Adding Display Grouping Key: $($DisplayGroupingKey.Name)"
[System.Collections.Generic.List[HealthChecker.DisplayResultsLineInfo]]$list = New-Object System.Collections.Generic.List[HealthChecker.DisplayResultsLineInfo]
[System.Collections.Generic.List[object]]$list = New-Object System.Collections.Generic.List[object]
$AnalyzedInformation.DisplayResults.Add($DisplayGroupingKey, $list)
}

$lineInfo = New-Object HealthChecker.DisplayResultsLineInfo
$lineInfo = [PSCustomObject]@{
DisplayValue = [string]::Empty
Name = [string]::Empty
TestingName = [string]::Empty # Used for pestering testing
CustomName = [string]::Empty # Used for security vulnerability
TabNumber = 0
TestingValue = $null # Used for pester testing down the road
CustomValue = $null # Used for security vulnerability
OutColumns = $null # Used for colorized format table option
WriteType = [string]::Empty
}

if ($null -ne $OutColumns) {
$lineInfo.OutColumns = $OutColumns
Expand Down Expand Up @@ -148,13 +158,20 @@ function Add-AnalyzedResultInformation {
$AnalyzedInformation.DisplayResults[$DisplayGroupingKey].Add($lineInfo)
}

$htmlDetailRow = [PSCustomObject]@{
Name = [string]::Empty
DetailValue = [string]::Empty
TableValue = $null
Class = [string]::Empty
}

if ($AddHtmlDetailRow) {
if (!($analyzedResults.HtmlServerValues.ContainsKey("ServerDetails"))) {
[System.Collections.Generic.List[HealthChecker.HtmlServerInformationRow]]$list = New-Object System.Collections.Generic.List[HealthChecker.HtmlServerInformationRow]
[System.Collections.Generic.List[object]]$list = New-Object System.Collections.Generic.List[object]
$AnalyzedInformation.HtmlServerValues.Add("ServerDetails", $list)
}

$detailRow = New-Object HealthChecker.HtmlServerInformationRow
$detailRow = $htmlDetailRow

if ($displayWriteType -ne "Grey") {
$detailRow.Class = $displayWriteType
Expand All @@ -179,11 +196,11 @@ function Add-AnalyzedResultInformation {

if ($AddHtmlOverviewValues) {
if (!($analyzedResults.HtmlServerValues.ContainsKey("OverviewValues"))) {
[System.Collections.Generic.List[HealthChecker.HtmlServerInformationRow]]$list = New-Object System.Collections.Generic.List[HealthChecker.HtmlServerInformationRow]
[System.Collections.Generic.List[object]]$list = New-Object System.Collections.Generic.List[object]
$AnalyzedInformation.HtmlServerValues.Add("OverviewValues", $list)
}

$overviewValue = New-Object HealthChecker.HtmlServerInformationRow
$overviewValue = $htmlDetailRow

if ($displayWriteType -ne "Grey") {
$overviewValue.Class = $displayWriteType
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ function Get-DisplayResultsGroupingKey {
[int]$DisplayOrder,
[int]$DefaultTabNumber = 1
)
$obj = New-Object HealthChecker.DisplayResultsGroupingKey
$obj.Name = $Name
$obj.DisplayGroupName = $DisplayGroupName
$obj.DisplayOrder = $DisplayOrder
$obj.DefaultTabNumber = $DefaultTabNumber
return $obj
return [PSCustomObject]@{
Name = $Name
DisplayGroupName = $DisplayGroupName
DisplayOrder = $DisplayOrder
DefaultTabNumber = $DefaultTabNumber
}
}
14 changes: 9 additions & 5 deletions Diagnostics/HealthChecker/Analyzer/Invoke-AnalyzerEngine.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,17 @@
. $PSScriptRoot\Security\Invoke-AnalyzerSecuritySettings.ps1
. $PSScriptRoot\Security\Invoke-AnalyzerSecurityVulnerability.ps1
function Invoke-AnalyzerEngine {
[CmdletBinding()]
param(
[HealthChecker.HealthCheckerExchangeServer]$HealthServerObject
[object]$HealthServerObject
)
Write-Verbose "Calling: $($MyInvocation.MyCommand)"

$analyzedResults = New-Object HealthChecker.AnalyzedInformation
$analyzedResults.HealthCheckerExchangeServer = $HealthServerObject
$analyzedResults = [PSCustomObject]@{
HealthCheckerExchangeServer = $HealthServerObject
HtmlServerValues = @{}
DisplayResults = @{}
}

#Display Grouping Keys
$order = 1
Expand Down Expand Up @@ -55,8 +59,8 @@ For further details, please review the virtualization recommendations on Microso

"@

if ($HealthServerObject.HardwareInformation.ServerType -eq [HealthChecker.ServerType]::VMWare -or
$HealthServerObject.HardwareInformation.ServerType -eq [HealthChecker.ServerType]::HyperV) {
if ($HealthServerObject.HardwareInformation.ServerType -eq "VMWare" -or
$HealthServerObject.HardwareInformation.ServerType -eq "HyperV") {
$params = $baseParams + @{
Details = $VirtualizationWarning
DisplayWriteType = "Yellow"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ function Invoke-AnalyzerExchangeInformation {
}
Add-AnalyzedResultInformation @params

if ($exchangeInformation.BuildInformation.ServerRole -le [HealthChecker.ExchangeServerRole]::Mailbox) {
if ($exchangeInformation.GetExchangeServer.IsMailboxServer -eq $true) {
$dagName = [System.Convert]::ToString($exchangeInformation.GetMailboxServer.DatabaseAvailabilityGroup)
if ([System.String]::IsNullOrWhiteSpace($dagName)) {
$dagName = "Standalone Server"
Expand All @@ -166,9 +166,7 @@ function Invoke-AnalyzerExchangeInformation {
}
Add-AnalyzedResultInformation @params

if (($exchangeInformation.BuildInformation.ServerRole -ne [HealthChecker.ExchangeServerRole]::Edge) -and
($exchangeInformation.BuildInformation.ServerRole -ne [HealthChecker.ExchangeServerRole]::Hub) -and
($exchangeInformation.BuildInformation.ServerRole -ne [HealthChecker.ExchangeServerRole]::None)) {
if ($exchangeInformation.GetExchangeServer.IsEdgeServer -eq $false) {

Write-Verbose "Working on MRS Proxy Settings"
$mrsProxyDetails = $exchangeInformation.GetWebServicesVirtualDirectory.MRSProxyEnabled
Expand All @@ -187,9 +185,8 @@ function Invoke-AnalyzerExchangeInformation {
Add-AnalyzedResultInformation @params
}

if ($exchangeInformation.BuildInformation.MajorVersion -eq [HealthChecker.ExchangeMajorVersion]::Exchange2013 -and
$exchangeInformation.BuildInformation.ServerRole -ne [HealthChecker.ExchangeServerRole]::Edge -and
$exchangeInformation.BuildInformation.ServerRole -ne [HealthChecker.ExchangeServerRole]::Mailbox) {
if ($exchangeInformation.BuildInformation.MajorVersion -eq "Exchange2013" -and
$exchangeInformation.GetExchangeServer.IsClientAccessServer -eq $true) {

if ($null -ne $exchangeInformation.ApplicationPools -and
$exchangeInformation.ApplicationPools.Count -gt 0) {
Expand Down Expand Up @@ -256,7 +253,8 @@ function Invoke-AnalyzerExchangeInformation {
Write-Verbose "Working on results from Test-ServiceHealth"
$servicesNotRunning = $exchangeInformation.ExchangeServicesNotRunning

if ($null -ne $servicesNotRunning) {
if ($null -ne $servicesNotRunning -and
$servicesNotRunning.Count -gt 0 ) {
Add-AnalyzedResultInformation -Name "Services Not Running" @baseParams

foreach ($stoppedService in $servicesNotRunning) {
Expand Down Expand Up @@ -316,7 +314,7 @@ function Invoke-AnalyzerExchangeInformation {
}
}

if ($exchangeInformation.BuildInformation.ServerRole -ne [HealthChecker.ExchangeServerRole]::Edge -and
if ($exchangeInformation.GetExchangeServer.IsEdgeServer -eq $false -and
$null -ne $exchangeInformation.ExtendedProtectionConfig) {
$params = $baseParams + @{
Name = "Extended Protection Enabled (Any VDir)"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

. $PSScriptRoot\Add-AnalyzedResultInformation.ps1
. $PSScriptRoot\Get-DisplayResultsGroupingKey.ps1
. $PSScriptRoot\..\Helpers\CompareExchangeBuildLevel.ps1
function Invoke-AnalyzerFrequentConfigurationIssues {
[CmdletBinding()]
param(
Expand Down Expand Up @@ -106,18 +107,18 @@ function Invoke-AnalyzerFrequentConfigurationIssues {
}
Add-AnalyzedResultInformation @params

$displayValue = $osInformation.CredentialGuardEnabled
$credentialGuardValue = $osInformation.RegistryValues.CredentialGuard -ne 0
$displayWriteType = "Grey"

if ($osInformation.CredentialGuardEnabled) {
$displayValue = "{0} `r`n`t`tError: Credential Guard is not supported on an Exchange Server. This can cause a performance hit on the server." -f $osInformation.CredentialGuardEnabled
if ($credentialGuardValue) {
$displayValue = "{0} `r`n`t`tError: Credential Guard is not supported on an Exchange Server. This can cause a performance hit on the server." -f $credentialGuardValue
$displayWriteType = "Red"
}

$params = $baseParams + @{
Name = "Credential Guard Enabled"
Details = $displayValue
DisplayTestingValue = $osInformation.CredentialGuardEnabled
DisplayTestingValue = $credentialGuardValue
DisplayWriteType = $displayWriteType
}
Add-AnalyzedResultInformation @params
Expand All @@ -144,28 +145,27 @@ function Invoke-AnalyzerFrequentConfigurationIssues {
}
}

$displayWriteType = "Grey"
$displayValue = "Not Set"
$displayWriteType = "Yellow"
$displayValue = "Unknown - Unable to run Get-AcceptedDomain"
$additionalDisplayValue = [string]::Empty

if ($null -ne $organizationInformation.WildCardAcceptedDomain) {
if ($null -ne $organizationInformation.GetAcceptedDomain -and
$organizationInformation.GetAcceptedDomain -ne "Unknown") {

$wildCardAcceptedDomain = $organizationInformation.GetAcceptedDomain | Where-Object { $_.DomainName.ToString() -eq "*" }

if ($organizationInformation.WildCardAcceptedDomain -eq "Unknown") {
$displayValue = "Unknown - Unable to run Get-AcceptedDomain"
$displayWriteType = "Yellow"
if ($null -eq $wildCardAcceptedDomain) {
$displayValue = "Not Set"
$displayWriteType = "Grey"
} else {
$displayWriteType = "Red"
$domain = $organizationInformation.WildCardAcceptedDomain
$displayValue = "Error --- Accepted Domain `"$($domain.Id)`" is set to a Wild Card (*) Domain Name with a domain type of $($domain.DomainType.ToString()). This is not recommended as this is an open relay for the entire environment.`r`n`t`tMore Information: https://aka.ms/HC-OpenRelayDomain"

if ($domain.DomainType.ToString() -eq "InternalRelay" -and
(($exchangeInformation.BuildInformation.MajorVersion -eq [HealthChecker.ExchangeMajorVersion]::Exchange2016 -and
$exchangeInformation.BuildInformation.CU -ge [HealthChecker.ExchangeCULevel]::CU22) -or
($exchangeInformation.BuildInformation.MajorVersion -eq [HealthChecker.ExchangeMajorVersion]::Exchange2019 -and
$exchangeInformation.BuildInformation.CU -ge [HealthChecker.ExchangeCULevel]::CU11))) {
$displayValue = "Error --- Accepted Domain `"$($wildCardAcceptedDomain.Id)`" is set to a Wild Card (*) Domain Name with a domain type of $($wildCardAcceptedDomain.DomainType.ToString()). This is not recommended as this is an open relay for the entire environment.`r`n`t`tMore Information: https://aka.ms/HC-OpenRelayDomain"

if ($wildCardAcceptedDomain.DomainType.ToString() -eq "InternalRelay" -and
((Test-ExchangeBuildGreaterOrEqualThanBuild -CurrentExchangeBuild $exchangeInformation.BuildInformation.VersionInformation -Version "Exchange2016" -CU "CU22") -or
(Test-ExchangeBuildGreaterOrEqualThanBuild -CurrentExchangeBuild $exchangeInformation.BuildInformation.VersionInformation -Version "Exchange2019" -CU "CU11"))) {
$additionalDisplayValue = "`r`n`t`tERROR: You have an open relay set as Internal Replay Type and on a CU that is known to cause issues with transport services crashing. Follow the above article for more information."
} elseif ($domain.DomainType.ToString() -eq "InternalRelay") {
} elseif ($wildCardAcceptedDomain.DomainType.ToString() -eq "InternalRelay") {
$additionalDisplayValue = "`r`n`t`tWARNING: You have an open relay set as Internal Relay Type. You are not on a CU yet that is having issue, recommended to change this prior to upgrading. Follow the above article for more information."
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@ function Invoke-AnalyzerHardwareInformation {
}
Add-AnalyzedResultInformation @params

if ($hardwareInformation.ServerType -eq [HealthChecker.ServerType]::Physical -or
$hardwareInformation.ServerType -eq [HealthChecker.ServerType]::AmazonEC2) {
if ($hardwareInformation.ServerType -eq "Physical" -or
$hardwareInformation.ServerType -eq "AmazonEC2") {
$params = $baseParams + @{
Name = "Manufacturer"
Details = $hardwareInformation.Manufacturer
Expand All @@ -59,7 +59,7 @@ function Invoke-AnalyzerHardwareInformation {
$displayWriteType = "Green"
$displayValue = $numberOfProcessors

if ($hardwareInformation.ServerType -ne [HealthChecker.ServerType]::Physical) {
if ($hardwareInformation.ServerType -ne "Physical") {
$displayWriteType = "Grey"
} elseif ($numberOfProcessors -gt 2) {
$displayWriteType = "Red"
Expand All @@ -81,12 +81,12 @@ function Invoke-AnalyzerHardwareInformation {
$displayWriteTypeLogic = $displayWriteTypePhysical = "Green"

if (($logicalValue -gt 24 -and
$exchangeInformation.BuildInformation.MajorVersion -lt [HealthChecker.ExchangeMajorVersion]::Exchange2019) -or
$exchangeInformation.BuildInformation.VersionInformation.BuildVersion -lt "15.2.0.0") -or
$logicalValue -gt 48) {
$displayWriteTypeLogic = "Red"

if (($physicalValue -gt 24 -and
$exchangeInformation.BuildInformation.MajorVersion -lt [HealthChecker.ExchangeMajorVersion]::Exchange2019) -or
$exchangeInformation.BuildInformation.VersionInformation.BuildVersion -lt "15.2.0.0") -or
$physicalValue -gt 48) {
$physicalValueDisplay = "$physicalValue - Error"
$displayWriteTypePhysical = "Red"
Expand Down Expand Up @@ -118,7 +118,7 @@ function Invoke-AnalyzerHardwareInformation {

if ($logicalValue -gt $physicalValue) {

if ($hardwareInformation.ServerType -ne [HealthChecker.ServerType]::HyperV) {
if ($hardwareInformation.ServerType -ne "HyperV") {
$displayValue = "Enabled --- Error: Having Hyper-Threading enabled goes against best practices and can cause performance issues. Please disable as soon as possible."
$displayTestingValue = $true
$displayWriteType = "Red"
Expand All @@ -128,7 +128,7 @@ function Invoke-AnalyzerHardwareInformation {
$displayWriteType = "Grey"
}

if ($hardwareInformation.ServerType -eq [HealthChecker.ServerType]::AmazonEC2) {
if ($hardwareInformation.ServerType -eq "AmazonEC2") {
$additionalDisplayValue = "Error: For high-performance computing (HPC) application, like Exchange, Amazon recommends that you have Hyper-Threading Technology disabled in their service. More information: https://aka.ms/HC-EC2HyperThreading"
}

Expand Down Expand Up @@ -243,12 +243,12 @@ function Invoke-AnalyzerHardwareInformation {
$displayWriteType = "Yellow"
$displayDetails = [string]::Empty

if ($exchangeInformation.BuildInformation.MajorVersion -eq [HealthChecker.ExchangeMajorVersion]::Exchange2019) {
if ($exchangeInformation.BuildInformation.VersionInformation.BuildVersion -ge "15.2.0.0") {

if ($totalPhysicalMemory -gt 256) {
$displayDetails = "{0} GB `r`n`t`tWarning: We recommend for the best performance to be scaled at or below 256 GB of Memory" -f $totalPhysicalMemory
} elseif ($totalPhysicalMemory -lt 64 -and
$exchangeInformation.BuildInformation.ServerRole -eq [HealthChecker.ExchangeServerRole]::Edge) {
$exchangeInformation.GetExchangeServer.IsEdgeServer -eq $true) {
$displayDetails = "{0} GB `r`n`t`tWarning: We recommend for the best performance to have a minimum of 64GB of RAM installed on the machine." -f $totalPhysicalMemory
} elseif ($totalPhysicalMemory -lt 128) {
$displayDetails = "{0} GB `r`n`t`tWarning: We recommend for the best performance to have a minimum of 128GB of RAM installed on the machine." -f $totalPhysicalMemory
Expand All @@ -257,10 +257,10 @@ function Invoke-AnalyzerHardwareInformation {
$displayWriteType = "Grey"
}
} elseif ($totalPhysicalMemory -gt 192 -and
$exchangeInformation.BuildInformation.MajorVersion -eq [HealthChecker.ExchangeMajorVersion]::Exchange2016) {
$exchangeInformation.BuildInformation.MajorVersion -eq "Exchange2016") {
$displayDetails = "{0} GB `r`n`t`tWarning: We recommend for the best performance to be scaled at or below 192 GB of Memory." -f $totalPhysicalMemory
} elseif ($totalPhysicalMemory -gt 96 -and
$exchangeInformation.BuildInformation.MajorVersion -eq [HealthChecker.ExchangeMajorVersion]::Exchange2013) {
$exchangeInformation.BuildInformation.MajorVersion -eq "Exchange2013") {
$displayDetails = "{0} GB `r`n`t`tWarning: We recommend for the best performance to be scaled at or below 96GB of Memory." -f $totalPhysicalMemory
} else {
$displayDetails = "{0} GB" -f $totalPhysicalMemory
Expand Down
Loading