Private/ResultsDisplay.ps1
function Write-ConsolidatedResults { <# .SYNOPSIS Displays consolidated results for all devices checked. .PARAMETE Write-Host " WARNINGS (Recommended to Address):" foreach ($warning in $warnings) { Write-Host " $($warning.Check): $($warning.Details)" Write-Host " WARNINGS (Recommended to Address):" foreach ($warning in $warnings) { Write-Host " $($warning.Check): $($warning.Details)"evices Array of device names that were checked. .PARAMETER AzureLoginSuccess Boolean indicating if Azure login was successful. #> param( [string[]]$Devices, [bool]$AzureLoginSuccess ) Write-Host "`n`n CONSOLIDATED RESULTS - ALL DEVICES" Write-Host "" $consolidatedResults = @() foreach ($deviceName in $script:allResults.Keys) { $consolidatedResults += $script:allResults[$deviceName] } if ($consolidatedResults.Count -gt 0) { $consolidatedResults | Format-Table -Property Device, Check, Result, Details -AutoSize # Overall summary $totalChecks = $consolidatedResults.Count $okCount = ($consolidatedResults | Where-Object { $_.Result -eq "OK" }).Count $warningCount = ($consolidatedResults | Where-Object { $_.Result -eq "Warning" }).Count $errorCount = ($consolidatedResults | Where-Object { $_.Result -eq "Error" }).Count $infoCount = ($consolidatedResults | Where-Object { $_.Result -eq "Info" }).Count Write-Host " OVERALL SUMMARY" Write-Host "" Write-Host "Devices Checked:`t$($Devices.Count)" Write-Host "Total Checks:`t`t$totalChecks" Write-Host " OK:`t`t`t$okCount" Write-Host " Warnings:`t`t$warningCount" Write-Host " Errors:`t`t$errorCount" Write-Host " Info:`t`t$infoCount" Write-Host "Azure Login:`t`t$(if ($AzureLoginSuccess) { ' Success' } else { ' Failed' })" Write-Host "Resource Providers:`t$(if ($script:resourceProvidersChecked) { ' Checked' } else { ' Skipped' })" Write-Host "" # Device-specific summaries Write-Host "`n Per-Device Summary:" -ForegroundColor Yellow foreach ($deviceName in $script:allResults.Keys | Sort-Object) { $deviceResults = $script:allResults[$deviceName] $deviceOK = ($deviceResults | Where-Object { $_.Result -eq "OK" }).Count $deviceWarnings = ($deviceResults | Where-Object { $_.Result -eq "Warning" }).Count $deviceErrors = ($deviceResults | Where-Object { $_.Result -eq "Error" }).Count $deviceInfo = ($deviceResults | Where-Object { $_.Result -eq "Info" }).Count $osVersion = if ($script:deviceOSVersions[$deviceName]) { $script:deviceOSVersions[$deviceName] } else { "Unknown OS" } $status = if ($deviceErrors -gt 0) { " Errors" } elseif ($deviceWarnings -gt 0) { " Warnings" } else { " Ready" } Write-Host " $deviceName [$osVersion]: $status (OK: $deviceOK, Warnings: $deviceWarnings, Errors: $deviceErrors, Info: $deviceInfo)" -ForegroundColor Green } # Detailed Issues per Device Write-Host "`n`n DETAILED ISSUES TO ADDRESS PER DEVICE" Write-Host "" $hasAnyIssues = $false foreach ($deviceName in $script:allResults.Keys | Sort-Object) { $deviceResults = $script:allResults[$deviceName] $deviceErrors = $deviceResults | Where-Object { $_.Result -eq "Error" } $deviceWarnings = $deviceResults | Where-Object { $_.Result -eq "Warning" } if ($deviceErrors.Count -gt 0 -or $deviceWarnings.Count -gt 0) { $hasAnyIssues = $true $osVersion = if ($script:deviceOSVersions[$deviceName]) { $script:deviceOSVersions[$deviceName] } else { "Unknown OS" } Write-Host "`n DEVICE: $deviceName [$osVersion]" -ForegroundColor Green Write-Host "" # Display Errors first if ($deviceErrors.Count -gt 0) { Write-Host " CRITICAL ERRORS (Must Fix):" foreach ($deviceError in $deviceErrors) { Write-Host " $($deviceError.Check): $($deviceError.Details)" # Provide specific remediation guidance switch ($deviceError.Check) { "Device Connectivity" { Write-Host " Action Required:" Write-Host " - Verify device is powered on and network accessible" Write-Host " - Enable WinRM: winrm quickconfig" Write-Host " - Check Windows Firewall settings for remote management" } "PowerShell Version" { Write-Host " Action Required:" Write-Host " - Download and install PowerShell 5.1 or later" Write-Host " - Or install PowerShell 7: https://github.com/PowerShell/PowerShell/releases" } "Az Module" { Write-Host " Action Required:" Write-Host " - Install Azure PowerShell: Install-Module -Name Az -Scope CurrentUser" Write-Host " - Or as admin: Install-Module -Name Az -Scope AllUsers" } "Azure Arc Agent" { Write-Host " Action Required:" Write-Host " - Download agent from Azure portal - Azure Arc - Servers" Write-Host " - Install: msiexec /i AzureConnectedMachineAgent.msi /quiet" } "Network Connectivity" { Write-Host " Action Required:" Write-Host " - Check internet connectivity and DNS resolution" Write-Host " - Verify firewall allows HTTPS (443) to *.azure.com" Write-Host " - Configure proxy if required" } "Execution Policy" { Write-Host " Action Required:" Write-Host " - Set policy: Set-ExecutionPolicy RemoteSigned -Scope CurrentUser" Write-Host " - Or as admin: Set-ExecutionPolicy RemoteSigned" } "MDE Service" { Write-Host " Action Required:" Write-Host " - Install Microsoft Defender for Endpoint from Microsoft 365 Defender portal" Write-Host " - Start service: Start-Service -Name Sense" } "MDE Extension" { Write-Host " Action Required:" Write-Host " - Install via Azure portal or PowerShell after Arc onboarding" Write-Host " - Ensure Microsoft Defender for Cloud is enabled" } "OS Version" { Write-Host " Action Required:" Write-Host " - Verify OS version is supported by Azure Arc" Write-Host " - Consider OS upgrade if version is not supported" } default { Write-Host " Action Required:" Write-Host " - Review error details and consult Azure Arc documentation" Write-Host " - Check Azure Arc troubleshooting guide" } } } Write-Host "" } # Display Warnings if ($deviceWarnings.Count -gt 0) { Write-Host " WARNINGS (Recommended to Address):" foreach ($warning in $deviceWarnings) { Write-Host " $($warning.Check): $($warning.Details)" # Provide specific recommendations switch ($warning.Check) { "PowerShell Version" { Write-Host " Recommendation:" Write-Host " - Consider upgrading to PowerShell 7.x for enhanced Azure features" -ForegroundColor Yellow Write-Host " - PowerShell 7 offers better cross-platform support" } "Az Module" { Write-Host " Recommendation:" Write-Host " - Install Az module on device for local Azure operations" Write-Host " - Enables local Azure CLI and PowerShell commands" } "Azure Arc Agent" { Write-Host " Recommendation:" Write-Host " - Install Azure Connected Machine agent before Arc onboarding" Write-Host " - Agent required for Azure Arc-enabled servers functionality" } "Network Connectivity" { Write-Host " Recommendation:" Write-Host " - Test connectivity: Test-NetConnection management.azure.com -Port 443" Write-Host " - Ensure stable internet connection for Azure services" } "Execution Policy" { Write-Host " Recommendation:" Write-Host " - Current policy may limit script execution capabilities" Write-Host " - Consider setting to RemoteSigned for Azure operations" } "MDE Service" { Write-Host " Recommendation:" Write-Host " - Install MDE for enhanced security monitoring" Write-Host " - Integrates with Azure Defender for Cloud" } "MDE Extension" { Write-Host " Recommendation:" Write-Host " - Extension will be available after Arc onboarding" Write-Host " - Provides automated MDE deployment capabilities" } "OS Version" { Write-Host " Recommendation:" Write-Host " - Verify compatibility with latest Azure Arc features" -ForegroundColor Yellow Write-Host " - Check Azure Arc supported operating systems documentation" } default { Write-Host " Recommendation:" Write-Host " - Review warning for potential optimization opportunities" Write-Host " - Consider addressing for optimal Azure Arc experience" } } } Write-Host "" } # Show action priority for this device if ($deviceErrors.Count -gt 0) { Write-Host " Priority for $deviceName`: Fix $($deviceErrors.Count) critical error(s) before proceeding" } elseif ($deviceWarnings.Count -gt 0) { Write-Host " Priority for $deviceName`: Address $($deviceWarnings.Count) warning(s) for optimal setup" } } else { # Device has no issues $osVersion = if ($script:deviceOSVersions[$deviceName]) { $script:deviceOSVersions[$deviceName] } else { "Unknown OS" } Write-Host "`n`n DEVICE: $deviceName [$osVersion]" -ForegroundColor Green Write-Host "" Write-Host " No issues found - Ready for Azure Arc onboarding!" } } if (-not $hasAnyIssues) { Write-Host "`n EXCELLENT! No warnings or errors found across all devices!" Write-Host "All systems are fully ready for Azure Arc onboarding and MDE integration." } # Cross-Device Priority Summary if ($hasAnyIssues) { Write-Host "`n`n CROSS-DEVICE PRIORITY SUMMARY" Write-Host "" # Critical errors summary $criticalErrors = $consolidatedResults | Where-Object { $_.Result -eq "Error" } if ($criticalErrors.Count -gt 0) { Write-Host "`n CRITICAL ISSUES (Must Fix Before Arc Onboarding):" $errorGroups = $criticalErrors | Group-Object -Property Check | Sort-Object Name foreach ($group in $errorGroups) { $affectedDevices = ($group.Group | Select-Object -Property Device -Unique).Device -join ", " Write-Host " $($group.Name)" Write-Host " Affected devices: $affectedDevices" Write-Host " Impact: Blocks Azure Arc onboarding process" Write-Host "" } } # High priority warnings $highPriorityWarnings = $consolidatedResults | Where-Object { $_.Result -eq "Warning" -and ($_.Check -eq "Azure Arc Agent" -or $_.Check -eq "Network Connectivity" -or $_.Check -eq "PowerShell Version") } if ($highPriorityWarnings.Count -gt 0) { Write-Host " HIGH PRIORITY RECOMMENDATIONS:" -ForegroundColor Yellow $warningGroups = $highPriorityWarnings | Group-Object -Property Check | Sort-Object Name foreach ($group in $warningGroups) { $affectedDevices = ($group.Group | Select-Object -Property Device -Unique).Device -join ", " Write-Host " $($group.Name)" Write-Host " Affected devices: $affectedDevices" Write-Host " Impact: May affect Azure Arc functionality or performance" Write-Host "" } } # Azure configuration status Write-Host " AZURE CONFIGURATION STATUS:" if ($AzureLoginSuccess) { Write-Host " Azure Authentication: Successfully completed" } else { Write-Host " Azure Authentication: Failed - required for resource provider checks" } if ($script:resourceProvidersChecked) { if ($script:unregisteredProviders.Count -eq 0) { Write-Host " Resource Providers: All required providers are registered" if ($script:resourceProvidersRegistered) { Write-Host " Resource Provider Registration: New providers were registered during this session" } } else { Write-Host " Resource Providers: $($script:unregisteredProviders.Count) provider(s) still need registration" Write-Host " Unregistered: $($script:unregisteredProviders -join ', ')" if ($script:resourceProvidersRegistered) { Write-Host " Some providers were registered this session, but registration incomplete" } } } else { if ($AzureLoginSuccess) { Write-Host " Resource Providers: Check incomplete - some providers may not be registered" } else { Write-Host " Resource Providers: Not checked - Azure login required" } } # Next steps recommendation Write-Host "`n RECOMMENDED NEXT STEPS:" -ForegroundColor Yellow Write-Host "`t1. Address all critical errors first (red items above)" Write-Host "`t2. Resolve high-priority warnings for optimal experience" Write-Host "`t3. Ensure Azure authentication is completed" if ($script:resourceProvidersRegistered) { Write-Host "`t4. Resource providers registered - ready for Arc onboarding" } else { Write-Host "`t4. Verify Azure resource providers are registered (script can assist)" } Write-Host "`t5. Re-run this script to validate fixes" Write-Host "`t6. Proceed with Azure Arc onboarding process" } Write-Host "`n Consolidated log saved as: $($script:globalLogFile)" # Final status determination # Use the stored unregistered providers information instead of re-checking $allProvidersRegistered = ($AzureLoginSuccess -and $script:unregisteredProviders.Count -eq 0) if ($errorCount -eq 0 -and $warningCount -eq 0 -and $AzureLoginSuccess -and $script:resourceProvidersChecked -and $allProvidersRegistered) { Write-Host "`n ALL SYSTEMS GO! All prerequisites passed for all devices!" Write-Host " Systems are fully ready for Azure Arc and MDE integration." } elseif ($errorCount -eq 0 -and $AzureLoginSuccess -and $allProvidersRegistered) { Write-Host "`n READY WITH MINOR ITEMS: Prerequisites check completed with warnings only." Write-Host " You can proceed with Azure Arc onboarding, but addressing warnings is recommended." } elseif ($errorCount -eq 0 -and $AzureLoginSuccess -and -not $allProvidersRegistered) { Write-Host "`n PARTIALLY READY: Device checks passed but resource provider registration incomplete." Write-Host " Please register all required Azure resource providers before Arc onboarding." if ($script:unregisteredProviders.Count -gt 0) { Write-Host " Missing providers: $($script:unregisteredProviders -join ", ")" } } else { Write-Host "`n NOT READY: Prerequisites check completed with critical errors." Write-Host " Please resolve all critical errors before proceeding with Azure Arc onboarding." } } else { Write-Host " No results collected. Please check device connectivity and permissions." } Write-Host Write-Host "" Write-Host "END: Multi-Device Azure Arc and MDC/MDE Prerequisites Checks" Write-Host "" } |