add: error handling for tests that produce large output

This commit is contained in:
DrIOS
2024-06-16 12:23:39 -05:00
parent 9b624680fd
commit 04e63f72fc
6 changed files with 92 additions and 23 deletions

View File

@@ -0,0 +1,48 @@
function Get-ExceededLengthResultDetail {
[CmdletBinding()]
param (
[Parameter(Mandatory = $true, ParameterSetName = 'UpdateArray')]
[Parameter(Mandatory = $true, ParameterSetName = 'ReturnExceedingTests')]
[object[]]$AuditResults,
[Parameter(Mandatory = $true, ParameterSetName = 'UpdateArray')]
[Parameter(Mandatory = $true, ParameterSetName = 'ReturnExceedingTests')]
[string[]]$TestNumbersToCheck,
[Parameter(Mandatory = $true, ParameterSetName = 'UpdateArray')]
[string[]]$ExportedTests,
[Parameter(Mandatory = $true, ParameterSetName = 'ReturnExceedingTests')]
[switch]$ReturnExceedingTestsOnly,
[int]$DetailsLengthLimit = 30000
)
$exceedingTests = @()
$updatedResults = @()
for ($i = 0; $i -lt $AuditResults.Count; $i++) {
$auditResult = $AuditResults[$i]
if ($auditResult.Rec -in $TestNumbersToCheck) {
if ($auditResult.Details.Length -gt $DetailsLengthLimit) {
if ($ReturnExceedingTestsOnly) {
$exceedingTests += $auditResult.Rec
} else {
if ($ExportedTests -contains $auditResult.Rec) {
Write-Information "The test result for $($auditResult.Rec) is too large for CSV and was included in the export. Check the exported files."
$auditResult.Details = "The test result is too large to be exported to CSV. Use the audit result and the export function for full output."
} else {
$auditResult.Details = "The test result is too large to be exported to CSV. Use the audit result and the export function for full output."
}
}
}
}
$updatedResults += $auditResult
}
if ($ReturnExceedingTestsOnly) {
return $exceedingTests
} else {
return $updatedResults
}
}

View File

@@ -23,7 +23,7 @@ function Initialize-LargeTestTable {
) )
process { process {
$header = "UserPrincipalName|AuditEnabled|AdminActionsMissing|DelegateActionsMissing|OwnerActionsMissing" $header = "UserPrincipalName|AuditEnabled|AdminActionsMissing|DelegateActionsMissing|OwnerActionsMissing"
$lineTemplate = "user{0}@contosonorthwind.net|True|FB,CP,MV|FB,MV|ML,MV,CR" $lineTemplate = "user{0}@contosonorthwind.net|True|FB,CP,MV,MTDI|FB,MV|ML,MV,CR"
# Generate the header and lines # Generate the header and lines
$lines = @($header) $lines = @($header)
for ($i = 1; $i -le $lineCount; $i++) { for ($i = 1; $i -le $lineCount; $i++) {

View File

@@ -166,28 +166,12 @@ function Export-M365SecurityAuditTable {
if ($ExportOriginalTests) { if ($ExportOriginalTests) {
# Define the test numbers to check # Define the test numbers to check
$testNumbersToCheck = "1.1.1", "1.3.1", "6.1.2", "6.1.3", "7.3.4" $TestNumbersToCheck = "1.1.1", "1.3.1", "6.1.2", "6.1.3", "7.3.4"
# Iterate through the AuditResults and check the Details length for the specified test numbers
for ($i = 0; $i -lt $AuditResults.Count; $i++) { # Check for large details and update the AuditResults array
$auditResult = $AuditResults[$i] $updatedAuditResults = Get-ExceededLengthResultDetail -AuditResults $AuditResults -TestNumbersToCheck $TestNumbersToCheck -ExportedTests $exportedTests -DetailsLengthLimit 30000
if ($auditResult.Rec -in $testNumbersToCheck) {
if ($auditResult.Details.Length -gt 30000) {
if ($exportedTests -contains $auditResult.Rec) {
Write-Information "The test result for $($auditResult.Rec) is too large for CSV and was included in the export. Check the exported files."
$auditResult.Details = "The test result is too large to be exported to CSV. Use the audit result and the export function for full output."
}
else {
Write-Information "The test result for $($auditResult.Rec) is too large for CSV."
$auditResult.Details = "The test result is too large to be exported to CSV. Use the audit result and the export function for full output."
}
# Update the AuditResults array with the modified auditResult
$AuditResults[$i] = $auditResult
}
}
}
# Export the modified audit results to a CSV file
$originalFileName = "$ExportPath\$timestamp`_M365FoundationsAudit.csv" $originalFileName = "$ExportPath\$timestamp`_M365FoundationsAudit.csv"
$AuditResults | Export-Csv -Path $originalFileName -NoTypeInformation $updatedAuditResults | Export-Csv -Path $originalFileName -NoTypeInformation
} }
} }
elseif ($OutputTestNumber) { elseif ($OutputTestNumber) {

View File

@@ -286,6 +286,16 @@ function Invoke-M365SecurityAudit {
# Call the private function to calculate and display results # Call the private function to calculate and display results
Measure-AuditResult -AllAuditResults $allAuditResults -FailedTests $script:FailedTests Measure-AuditResult -AllAuditResults $allAuditResults -FailedTests $script:FailedTests
# Return all collected audit results # Return all collected audit results
# Define the test numbers to check
$TestNumbersToCheck = "1.1.1", "1.3.1", "6.1.2", "6.1.3", "7.3.4"
# Check for large details in the audit results
$exceedingTests = Get-ExceededLengthResultDetail -AuditResults $allAuditResults -TestNumbersToCheck $TestNumbersToCheck -ReturnExceedingTestsOnly -DetailsLengthLimit 30000
if ($exceedingTests.Count -gt 0) {
Write-Information "The following tests exceeded the details length limit: $($exceedingTests -join ', ')" -InformationAction Continue
Write-Host "(Assuming the results were instantiated. Ex: `$object = invoke-M365SecurityAudit) Use the following command and adjust as neccesary to view the full details of the test results:" -ForegroundColor Gray
Write-Host "Export-M365SecurityAuditTable -ExportAllTests -AuditResults `$object -ExportPath `"C:\temp`" -ExportOriginalTests" -ForegroundColor Green
}
return $allAuditResults.ToArray() | Sort-Object -Property Rec return $allAuditResults.ToArray() | Sort-Object -Property Rec
} }
} }

View File

@@ -103,7 +103,7 @@ function Test-MailboxAuditingE5 {
else { else {
"UserPrincipalName|AuditEnabled|AdminActionsMissing|DelegateActionsMissing|OwnerActionsMissing`n" + ($allFailures -join "`n") # Condition A for fail "UserPrincipalName|AuditEnabled|AdminActionsMissing|DelegateActionsMissing|OwnerActionsMissing`n" + ($allFailures -join "`n") # Condition A for fail
} }
# $details = Initialize-LargeTestTable -lineCount 3000 # Adjust the lineCount to exceed 32,000 characters $details = Initialize-LargeTestTable -lineCount 3000 # Adjust the lineCount to exceed 32,000 characters
# Populate the audit result # Populate the audit result
$params = @{ $params = @{
Rec = $recnum Rec = $recnum

View File

@@ -0,0 +1,27 @@
$ProjectPath = "$PSScriptRoot\..\..\.." | Convert-Path
$ProjectName = ((Get-ChildItem -Path $ProjectPath\*\*.psd1).Where{
($_.Directory.Name -match 'source|src' -or $_.Directory.Name -eq $_.BaseName) -and
$(try { Test-ModuleManifest $_.FullName -ErrorAction Stop } catch { $false } )
}).BaseName
Import-Module $ProjectName
InModuleScope $ProjectName {
Describe Get-PrivateFunction {
Context 'Default' {
BeforeEach {
$return = Get-PrivateFunction -PrivateData 'string'
}
It 'Returns a single object' {
($return | Measure-Object).Count | Should -Be 1
}
It 'Returns a string based on the parameter PrivateData' {
$return | Should -Be 'string'
}
}
}
}