public/Test-CmHealth.ps1

#Requires -RunAsAdministrator
<#
.SYNOPSIS
    Validate MECM/ConfigMgr site systems and configuration
.DESCRIPTION
    Validate MECM/ConfigMgr site systems and configuration
.PARAMETER SiteServer
    NetBIOS or FQDN of site server (primary, CAS, secondary). Default is localhost
.PARAMETER SqlInstance
    NetBIOS or FQDN of site database SQL instance. Default is localhost
.PARAMETER Database
    Name of site database. Default is "CM_P01"
.PARAMETER SiteCode
    ConfigMgr site code. Default is "P01"
.PARAMETER TestingScope
    Scope of tests to execute: All (default), Host, AD, SQL, CM, WSUS, Select
    The Select option displays a gridview to select the individual tests to perform
.PARAMETER Remediate
    Attempt remediation when possible
.PARAMETER Source
    Alternate source path for WinSXS referencing. Used only for Test-HostServerFeatures
    Default is C:\Windows\WinSxS
.PARAMETER DaysBack
    Number of days to go back for checking status messages, errors, warnings, etc. Default is 7
.EXAMPLE
    Test-CmHealth -SiteServer "CM01" -SqlInstance "CM01" -Database "CM_P01" -SiteCode "P01" -TestingScope "ALL"
    Runs all tests
.EXAMPLE
    Test-CmHealth -SiteServer "CM01" -SqlInstance "CM01" -Database "CM_P01" -SiteCode "P01" -TestingScope "Host"
    Runs only the site server host tests
.EXAMPLE
    Test-CmHealth -SiteServer "CM01" -SqlInstance "CM01" -Database "CM_P01" -SiteCode "P01" -TestingScope "Host" -Remediate
    Runs only the site server host tests and attempts to remediate identified deficiences
.EXAMPLE
    Test-CmHealth -SiteServer "CM01" -SqlInstance "CM01" -Database "CM_P01" -SiteCode "P01" -TestingScope "Host" -Remediate -Source "\\server3\sources\ws2019\WinSxS"
    Runs only the site server host tests and attempts to remediate identified deficiences with WinSXS source path provided
.LINK
    https://github.com/Skatterbrainz/cmhealth
.NOTES
    Thank you!
#>

function Test-CmHealth {
    [CmdletBinding()]
    param (
        [parameter()][ValidateNotNullOrEmpty()][string] $SiteServer = "localhost",
        [parameter()][ValidateNotNullOrEmpty()][string] $SqlInstance = "localhost",
        [parameter()][ValidateNotNullOrEmpty()][string] $Database = "CM_P01",
        [parameter()][ValidateLength(3,3)][string] $SiteCode = "",
        [parameter()][ValidateSet('All','Host','AD','SQL','CM','WSUS','Select')][string] $TestingScope = 'All',
        [parameter()][bool] $Remediate = $False,
        [parameter()][string] $Source = "c:\windows\winsxs",
        [parameter()][int] $DaysBack = 7
    )
    $startTime = (Get-Date)
    $params = [ordered]@{
        ComputerName = $SiteServer
        SqlInstance  = $SqlInstance
        SiteCode     = $SiteCode
        Database     = $Database
        Source       = $Source
        Remediate    = $Remediate
        BackDays     = $DaysBack
        Verbose      = $VerbosePreference
    }
    $mpath = $(Split-Path (Get-Module cmhealth).Path)
    $tpath = "$($mpath)\tests"
    $tests = Get-ChildItem -Path $tpath -Filter "*.ps1"
    Write-Verbose "$($tests.Count) tests found in library"
    switch ($TestingScope) {
        'All' {
            $testset = @($tests.BaseName)
        }
        'Select' {
            $testset = @($tests.BaseName | Out-GridView -Title "Select Test to Execute" -OutputMode Multiple)
        }
        Default {
            $testset = @($tests.BaseName | Where-Object {$_ -match "Test-$($TestingScope)"})
        }
    }
    Write-Verbose "$($testset.Count) tests were selected"
    foreach ($test in $testset) {
        $testname = $test += ' -ScriptParams $params'
        Invoke-Expression -Command $testname
    }
    $runTime = New-TimeSpan -Start $startTime -End (Get-Date)
    Write-Host "completed $($testset.Count) tests in: $($runTime.Hours) hrs $($runTime.Minutes) min $($runTime.Seconds) sec"
}