functions/Core/Test-WinHardenDependencies.ps1
|
function Test-WinHardenDependencies { <# .SYNOPSIS Validates that WinHarden dependencies are available and compatible. .DESCRIPTION Checks for required PowerShell version, optional modules, and system prerequisites. Returns detailed status for debugging without blocking execution. .PARAMETER Module Specific module(s) to check (optional). .PARAMETER ExitOnError Throw exception if critical dependency is missing. .NOTES NAMING JUSTIFICATION: This function uses the plural noun "Dependencies" intentionally because it: 1. Validates MULTIPLE dependencies (PowerShell + modules) 2. Returns MULTIPLE result entries (hash with multiple keys) 3. Accepts MULTIPLE modules (array parameter) Plural usage aligns with PowerShell standards (Get-ChildItem, Get-Module). .EXAMPLE Test-WinHardenDependencies .EXAMPLE Test-WinHardenDependencies -Module GroupPolicy -ExitOnError #> [CmdletBinding()] param( [Parameter(Mandatory = $false)] [ValidateScript( { $null -eq $_ -or $_.Count -gt 0 })] [string[]] $Module, [switch] $ExitOnError ) $ErrorActionPreference = 'Stop' $results = @{} try { # Check PowerShell version $psVersion = $PSVersionTable.PSVersion.Major $results['PowerShellVersion'] = @{ 'Required' = '5.1' 'Actual' = "$psVersion.$($PSVersionTable.PSVersion.Minor)" 'Status' = if ($psVersion -ge 5) { 'OK' } else { 'FAIL' } } if ($results['PowerShellVersion'].Status -eq 'FAIL' -and $ExitOnError) { throw "PowerShell 5.1+ required, but $psVersion found" } # Check optional modules if ($Module) { foreach ($moduleName in $Module) { $moduleCheck = Get-Module -Name $moduleName -ListAvailable -ErrorAction SilentlyContinue $results[$moduleName] = @{ 'Status' = if ($moduleCheck) { 'Available' } else { 'NotFound' } 'Version' = $moduleCheck.Version -join ', ' } if ($results[$moduleName].Status -eq 'NotFound' -and $ExitOnError) { throw "Required module '$moduleName' not found. Install via: Install-Module -Name $moduleName" } } } return $results } catch { if ($ExitOnError) { throw $_ } return @{ 'Error' = $_.Exception.Message } } } |