fix: export working

This commit is contained in:
DrIOS
2024-06-15 21:15:28 -05:00
parent f981e59b43
commit 848438c33f

View File

@@ -1,66 +1,112 @@
function Export-M365SecurityAuditTable { function Export-M365SecurityAuditTable {
[CmdletBinding()] [CmdletBinding()]
param ( param (
[Parameter(Mandatory = $true, ParameterSetName = "FromAuditResultsSingle")] [Parameter(Mandatory = $true, Position = 1, ParameterSetName = "ExportAllResultsFromAuditResults")]
[Parameter(Mandatory = $true, ParameterSetName = "FromAuditResultsMultiple")] [Parameter(Mandatory = $true, Position = 2, ParameterSetName = "OutputObjectFromAuditResultsSingle")]
[CISAuditResult[]]$AuditResults, [CISAuditResult[]]$AuditResults,
[Parameter(Mandatory = $true, ParameterSetName = "FromCsvSingle")] [Parameter(Mandatory = $true, Position = 1, ParameterSetName = "ExportAllResultsFromCsv")]
[Parameter(Mandatory = $true, ParameterSetName = "FromCsvMultiple")] [Parameter(Mandatory = $true, Position = 2, ParameterSetName = "OutputObjectFromCsvSingle")]
[ValidateScript({ Test-Path $_ -and (Get-Item $_).PSIsContainer -eq $false })] [ValidateScript({ (Test-Path $_) -and ((Get-Item $_).PSIsContainer -eq $false) })]
[string]$CsvPath, [string]$CsvPath,
[Parameter(Mandatory = $false, Position = 1, ParameterSetName = "FromAuditResultsSingle")] [Parameter(Mandatory = $true, Position = 1, ParameterSetName = "OutputObjectFromAuditResultsSingle")]
[Parameter(Mandatory = $false, Position = 1, ParameterSetName = "FromCsvSingle")] [Parameter(Mandatory = $true, Position = 1, ParameterSetName = "OutputObjectFromCsvSingle")]
[ValidateSet("1.1.1", "1.3.1", "6.1.2", "6.1.3", "7.3.4")] [ValidateSet("1.1.1", "1.3.1", "6.1.2", "6.1.3", "7.3.4")]
[string]$TestNumber, [string]$OutputTestNumber,
[Parameter(Mandatory = $false, Position = 1, ParameterSetName = "FromAuditResultsMultiple")] [Parameter(Mandatory = $true, Position = 0, ParameterSetName = "ExportAllResultsFromAuditResults")]
[Parameter(Mandatory = $false, Position = 1, ParameterSetName = "FromCsvMultiple")] [Parameter(Mandatory = $true, Position = 0, ParameterSetName = "ExportAllResultsFromCsv")]
[ValidateSet("1.1.1", "1.3.1", "6.1.2", "6.1.3", "7.3.4")] [switch]$ExportAllTests,
[string[]]$TestNumbers,
[Parameter(Mandatory = $true, Position = 2, ParameterSetName = "FromAuditResultsMultiple")] [Parameter(Mandatory = $true, ParameterSetName = "ExportAllResultsFromAuditResults")]
[Parameter(Mandatory = $true, Position = 2, ParameterSetName = "FromCsvMultiple")] [Parameter(Mandatory = $true, ParameterSetName = "ExportAllResultsFromCsv")]
[Parameter(Mandatory = $false, Position = 2, ParameterSetName = "FromAuditResultsSingle")]
[Parameter(Mandatory = $false, Position = 2, ParameterSetName = "FromCsvSingle")]
[string]$ExportPath [string]$ExportPath
) )
if ($PSCmdlet.ParameterSetName -like "FromCsv*") { function Initialize-CISAuditResult {
[CmdletBinding()]
[OutputType([CISAuditResult])]
param (
[Parameter(Mandatory = $true)]
[string]$Rec,
[Parameter(Mandatory = $true, ParameterSetName = 'Full')]
[bool]$Result,
[Parameter(Mandatory = $true, ParameterSetName = 'Full')]
[string]$Status,
[Parameter(Mandatory = $true, ParameterSetName = 'Full')]
[string]$Details,
[Parameter(Mandatory = $true, ParameterSetName = 'Full')]
[string]$FailureReason,
[Parameter(ParameterSetName = 'Error')]
[switch]$Failure
)
# Import the test definitions CSV file
$testDefinitions = $script:TestDefinitionsObject
# Find the row that matches the provided recommendation (Rec)
$testDefinition = $testDefinitions | Where-Object { $_.Rec -eq $Rec }
if (-not $testDefinition) {
throw "Test definition for recommendation '$Rec' not found."
}
# Create an instance of CISAuditResult and populate it
$auditResult = [CISAuditResult]::new()
$auditResult.Rec = $Rec
$auditResult.ELevel = $testDefinition.ELevel
$auditResult.ProfileLevel = $testDefinition.ProfileLevel
$auditResult.IG1 = [bool]::Parse($testDefinition.IG1)
$auditResult.IG2 = [bool]::Parse($testDefinition.IG2)
$auditResult.IG3 = [bool]::Parse($testDefinition.IG3)
$auditResult.RecDescription = $testDefinition.RecDescription
$auditResult.CISControl = $testDefinition.CISControl
$auditResult.CISDescription = $testDefinition.CISDescription
$auditResult.Automated = [bool]::Parse($testDefinition.Automated)
$auditResult.Connection = $testDefinition.Connection
$auditResult.CISControlVer = 'v8'
if ($PSCmdlet.ParameterSetName -eq 'Full') {
$auditResult.Result = $Result
$auditResult.Status = $Status
$auditResult.Details = $Details
$auditResult.FailureReason = $FailureReason
} elseif ($PSCmdlet.ParameterSetName -eq 'Error') {
$auditResult.Result = $false
$auditResult.Status = 'Fail'
$auditResult.Details = "An error occurred while processing the test."
$auditResult.FailureReason = "Initialization error: Failed to process the test."
}
return $auditResult
}
if ($PSCmdlet.ParameterSetName -like "ExportAllResultsFromCsv" -or $PSCmdlet.ParameterSetName -eq "OutputObjectFromCsvSingle") {
$AuditResults = Import-Csv -Path $CsvPath | ForEach-Object { $AuditResults = Import-Csv -Path $CsvPath | ForEach-Object {
[CISAuditResult]::new( $params = @{
$_.Status, Rec = $_.Rec
$_.ELevel, Result = [bool]$_.Result
$_.ProfileLevel, Status = $_.Status
[bool]$_.Automated, Details = $_.Details
$_.Connection, FailureReason = $_.FailureReason
$_.Rec, }
$_.RecDescription, Initialize-CISAuditResult @params
$_.CISControlVer,
$_.CISControl,
$_.CISDescription,
[bool]$_.IG1,
[bool]$_.IG2,
[bool]$_.IG3,
[bool]$_.Result,
$_.Details,
$_.FailureReason
)
} }
} }
if (-not $TestNumbers -and -not $TestNumber) { if ($ExportAllTests) {
$TestNumbers = "1.1.1", "1.3.1", "6.1.2", "6.1.3", "7.3.4" $TestNumbers = "1.1.1", "1.3.1", "6.1.2", "6.1.3", "7.3.4"
if (-not $ExportPath) {
Write-Error "ExportPath is required when exporting all test results."
return
}
} }
$results = @() $results = @()
$testsToProcess = if ($TestNumber) { @($TestNumber) } else { $TestNumbers } $testsToProcess = if ($OutputTestNumber) { @($OutputTestNumber) } else { $TestNumbers }
foreach ($test in $testsToProcess) { foreach ($test in $testsToProcess) {
$auditResult = $AuditResults | Where-Object { $_.Rec -eq $test } $auditResult = $AuditResults | Where-Object { $_.Rec -eq $test }
@@ -110,11 +156,12 @@ function Export-M365SecurityAuditTable {
$testDef = $script:TestDefinitionsObject | Where-Object { $_.Rec -eq $result.TestNumber } $testDef = $script:TestDefinitionsObject | Where-Object { $_.Rec -eq $result.TestNumber }
if ($testDef) { if ($testDef) {
$fileName = "$ExportPath\$($timestamp)_$($result.TestNumber).$($testDef.TestFileName -replace '\.ps1$').csv" $fileName = "$ExportPath\$($timestamp)_$($result.TestNumber).$($testDef.TestFileName -replace '\.ps1$').csv"
$result.Details | Export-Csv -Path $fileName -NoTypeInformation -Delimiter '|' $result.Details | Export-Csv -Path $fileName -NoTypeInformation
} }
} }
} } elseif ($OutputTestNumber) {
else { return $results[0].Details
return $results.Details } else {
Write-Error "No valid operation specified. Please provide valid parameters."
} }
} }