src/Public/Invoke-MCSAssessment.ps1
|
function Invoke-MCSAssessment { Param( [Alias("Tenant","Tenants")] [string]$TenantID, [Alias("Subscription","Subscriptions","Subs")] [String[]]$SubscriptionID, [Alias("Workload","Workloads")] [String]$WorkloadName = "Default_Workload", [switch]$SkipCompress, [switch]$SkipARI, [switch]$SkipWARA, [switch]$SkipMDC, [switch]$SkipMCSB, [switch]$SkipPSRule, [switch]$FullWARA, [switch]$Debug ) if ($Debug.IsPresent) { $DebugPreference = "Continue" } else { $DebugPreference = "SilentlyContinue" } Write-Host "Starting MCS Assessment for Workload: " -NoNewline Write-Host $WorkloadName -ForegroundColor Green Write-Debug ((get-date -Format 'yyyy-MM-dd HH:mm:ss') + ' - Setting Variables and Validating Parameters') $workingDirectory = (Get-Location).Path Write-Debug ((get-date -Format 'yyyy-MM-dd HH:mm:ss') + ' - Working Directory set to: ' + $workingDirectory) if ($workingDirectory -eq "C:\") { Write-Host "Error: Working Directory cannot be the root of C:\" -ForegroundColor Red exit 1 } Write-Debug ((get-date -Format 'yyyy-MM-dd HH:mm:ss') + ' - Validating Parameters') if (-Not $TenantID) { Write-Host "Error: No TenantID" -ForegroundColor Red exit 1 } if (-Not $SubscriptionID) { Write-Host "Error: No SubscriptionID" -ForegroundColor Red exit 1 } if ($SkipARI.IsPresent) { Write-Host "Skipping ARI Data Collection as per user request." } else { Write-Host "Starting " -NoNewline Write-Host "ARI" -NoNewline -ForegroundColor Magenta Write-Host " Data Collection" Invoke-ARI -ReportDir $workingDirectory -ReportName $WorkloadName -NoAutoUpdate -DiagramFullEnvironment -TenantId $TenantID -SubscriptionId $SubscriptionID -Debug -IncludeCosts -Lite } $ResourceCollection = @() if ($SkipWARA.IsPresent) { Write-Host "Skipping WARA Data Collection as per user request." } else { Write-Host "Starting " -NoNewline Write-Host "WARA" -NoNewline -ForegroundColor Magenta Write-Host " Data Collection" $ResourceCollection += Invoke-MCSWARA -TenantID $TenantID -SubscriptionID $SubscriptionID -WorkloadName $WorkloadName -FullWARA $FullWARA -WorkingDirectory $workingDirectory } Write-Debug ((get-date -Format 'yyyy-MM-dd HH:mm:ss') + ' - Gathering Full Resource List for further data processing') $ResourceList = Invoke-MCSGeneralInventory -SubscriptionID $SubscriptionID try { $RootPath = (get-item $PSScriptRoot).parent $AssessmentFiles = Join-Path $RootPath 'Private' 'Assessment' $MDCQuery = Get-Content -Path ("$AssessmentFiles\MDC.kql") -Raw -Encoding UTF8 $MCSBQuery = Get-Content -Path ("$AssessmentFiles\MCSB.kql") -Raw -Encoding UTF8 } catch { if (!$SkipMDC.IsPresent -and !$SkipMCSB.IsPresent) { Write-Host "Error: Could not read MDC or MCSB queries." -ForegroundColor Red exit 1 } } if ($SkipMDC.IsPresent) { Write-Host "Skipping Defender for Cloud Data Collection as per user request." } else { Write-Host "Starting " -NoNewline Write-Host "Defender for Cloud (MDC)" -NoNewline -ForegroundColor Magenta Write-Host " Data Collection" $ResourceCollection += Invoke-MCSMDC -SubscriptionID $SubscriptionID -MDCQuery $MDCQuery -ResourceList $ResourceList -WorkingDirectory $workingDirectory } if ($SkipMCSB.IsPresent) { Write-Host "Skipping Security Benchmark Data Collection as per user request." } else { Write-Host "Starting " -NoNewline Write-Host "Security Benchmark (MCSB)" -NoNewline -ForegroundColor Magenta Write-Host " Data Collection" $ResourceCollection += Invoke-MCSMCSB -SubscriptionID $SubscriptionID -MCSBQuery $MCSBQuery -ResourceList $ResourceList -WorkingDirectory $workingDirectory } if ($SkipPSRule.IsPresent) { Write-Host "Skipping PSRule Data Collection as per user request." } else { Write-Host "Starting " -NoNewline Write-Host "PSRule" -NoNewline -ForegroundColor Magenta Write-Host " Data Collection" $ResourceCollection += Invoke-MCSPSRule -SubscriptionID $SubscriptionID -WorkingDirectory $workingDirectory } Write-Host "Total Recommendation Lines to Export: " -NoNewline Write-Host $($ResourceCollection.Count) -ForegroundColor Cyan $ResourceCollection | Export-Csv -Path "$workingDirectory\Consolidated_Assessment_for_Review_$WorkloadName.csv" -NoTypeInformation -Encoding UTF8 if ($SkipCompress.IsPresent) { Write-Host "Skipping compression as per user request." -ForegroundColor Yellow } else { Write-Host "Compressing generated files into ZIP file..." Invoke-MCSCompress -WorkingDirectory $WorkingDirectory } Remove-MCSFiles -WorkingDirectory $workingDirectory } |