Helpers/Firewall.ps1
function Test-FirewallPaths { [CmdletBinding()] [OutputType([Object])] param ( [Parameter(Mandatory = $True, ValueFromPipeline)] [String] $Path, [Parameter(Mandatory = $True)] [String] $Key, [Parameter(Mandatory = $True)] [Object] $ExpectedValue, [Parameter(Mandatory = $True)] [String] $ProfileType, [PSCustomObject] $Result = @{ Message = "Registry value not found." Status = "False" } ) BEGIN { $FirewallProfiles = Get-NetFirewallProfile -ErrorAction SilentlyContinue } PROCESS { $regValue = Get-ItemProperty -ErrorAction SilentlyContinue ` -Path $Path ` -Name $Key ` | Select-Object -ExpandProperty "$($Key)" # if regValue == expectedValue OR if the LogFilePath ends with .log if (($regValue -eq $ExpectedValue) -or (($Key -eq "LogFilePath") -and ($regValue -match "[a-z]*.log"))) { $Result = @{ Message = "Compliant" Status = "True" } } # if regValue isnot empty AND regValue isnot expectedValue AND result is not True (yet) # This result is ranked #2 below "Compliant" and above "Registry value not found" if (($null -ne $regValue) -and ($regValue -ne $ExpectedValue) -and ($Result.Status -ne "True")) { $Result = @{ Message = "Registry value is '$regValue'. Expected: $ExpectedValue" Status = "False" } } } END { $FirewallProfile = $FirewallProfiles | Where-Object {$_.Name -eq $ProfileType} $FirewallProfileValue = $FirewallProfile.$Key # check whether value is a number if ($FirewallProfileValue -is [int32] -or $FirewallProfileValue -is [uint32] -or $FirewallProfileValue -is [int64] -or $FirewallProfileValue -is [uint64]) { # if value is a number, the value may also be greater and equals to the expectedvalue if ($FirewallProfileValue -ge $expectedValue) { $Result = @{ Message = "Compliant" Status = "True" } } } if ($FirewallProfileValue -eq $expectedValue) { $Result = @{ Message = "Compliant" Status = "True" } } if ($Key -eq "LogFilePath") { if ($FirewallProfiles -eq $null -or $FirewallProfiles.Count -lt 3) { ### if profiles are empty, skip comparison and continue with other checks } else { if (($FirewallProfiles[0].LogFileName -eq $FirewallProfiles[1].LogFileName) -or ($FirewallProfiles[0].LogFileName -eq $FirewallProfiles[2].LogFileName) -or ($FirewallProfiles[1].LogFileName -eq $FirewallProfiles[2].LogFileName)) { $Result = @{ Message = "For better organization and identification of specific issues within each profile consider using separate logfiles for each profile." Status = "Warning" } } } } return $Result } } |