pwsh/dev/functions/processMDfCCoverage.ps1 (116 lines of code) (raw):
function processMDfCCoverage {
Write-Host ' Processing Defender Coverage'
$start = Get-Date
$htDefenderProps = @{}
$htDefenderExtensions = @{}
foreach ($x in $arrayDefenderPlans) {
if (-not $htDefenderProps.($x.defenderPlan)) {
$htDefenderProps.($x.defenderPlan) = [System.Collections.ArrayList]@()
}
if (-not $htDefenderExtensions.($x.defenderPlan)) {
$htDefenderExtensions.($x.defenderPlan) = [System.Collections.ArrayList]@()
}
foreach ($noteprop in ($x.defenderPlanFull.properties | Get-Member).where({ $_.MemberType -eq 'NoteProperty' })) {
if ($htDefenderProps.($x.defenderPlan) -notcontains $noteprop.Name) {
$null = $htDefenderProps.($x.defenderPlan).Add($noteprop.Name)
}
if ($noteprop.Name -eq 'extensions') {
foreach ($extension in $x.defenderPlanFull.properties.($noteprop.Name)) {
if ($htDefenderExtensions.($x.defenderPlan) -notcontains $extension.name) {
$null = $htDefenderExtensions.($x.defenderPlan).Add($extension.name)
}
}
}
}
}
$arrayDefenderPlansNamesUnique = $arrayDefenderPlans.defenderPlan | Sort-Object -Unique
$script:arrayDefenderPlansCoverage = [System.Collections.ArrayList]@()
foreach ($defenderPlanName in $arrayDefenderPlansNamesUnique) {
foreach ($defenderPlanEntry in $arrayDefenderPlans.where({ $_.defenderPlan -eq $defenderPlanName })) {
$objDefenderPlan = [ordered]@{
plan = $defenderPlanEntry.defenderPlan
subscriptionId = $defenderPlanEntry.subscriptionId
subscriptionName = $defenderPlanEntry.subscriptionName
subscriptionMgPath = $defenderPlanEntry.subscriptionMgPath
}
foreach ($prop in $htDefenderProps.($defenderPlanName)) {
if ($prop -eq 'extensions') {
foreach ($extension in $htDefenderExtensions.($defenderPlanName)) {
$extensionObject = $defenderPlanEntry.defenderPlanFull.properties.extensions.where({ $_.name -eq $extension })
if ($extensionObject.count -gt 0) {
$objDefenderPlan.("ext_$($extension)") = $extensionObject.isEnabled
if ($defenderPlanName -eq 'StorageAccounts' -and $extension -eq 'OnUploadMalwareScanning') {
if ($extensionObject.additionalExtensionProperties.CapGBPerMonthPerStorageAccount) {
$objDefenderPlan.("ext_$("$($extension)_CapGBPerMonthPerStorageAccount")") = $extensionObject.additionalExtensionProperties.CapGBPerMonthPerStorageAccount
}
else {
$objDefenderPlan.("ext_$("$($extension)_CapGBPerMonthPerStorageAccount")") = $null
}
}
}
else {
$objDefenderPlan.("ext_$($extension)") = $null
if ($defenderPlanName -eq 'StorageAccounts' -and $extension -eq 'OnUploadMalwareScanning') {
$objDefenderPlan.("ext_$("$($extension)_CapGBPerMonthPerStorageAccount")") = $null
}
}
}
}
elseif ($prop -eq 'replacedBy') {
$objDefenderPlan.($prop) = $defenderPlanEntry.defenderPlanFull.properties.($prop) -join ';'
}
else {
$objDefenderPlan.($prop) = $defenderPlanEntry.defenderPlanFull.properties.($prop)
}
if ($defenderPlanName -eq 'VirtualMachines' -and $prop -eq 'subPlan') {
if ($defenderPlanEntry.defenderPlanFull.properties.($prop)) {
if ($htSecuritySettings.($defenderPlanEntry.subscriptionId).WDATP) {
$objDefenderPlan.('ext_MicrosoftDefenderforEndpoint') = ($htSecuritySettings.($defenderPlanEntry.subscriptionId).WDATP.properties.enabled).ToString()
}
else {
$objDefenderPlan.('ext_MicrosoftDefenderforEndpoint') = 'unknown'
}
}
else {
$objDefenderPlan.('ext_MicrosoftDefenderforEndpoint') = 'n/a'
}
}
}
$null = $script:arrayDefenderPlansCoverage.Add($objDefenderPlan)
}
}
# $tstsmp = Get-Date -Format 'yyyyMMdd_HHmmss'
# $arrayDefenderPlansCoverage | ConvertTo-Json -Depth 99 > "c:\temp\defenderCoverage_Final_$($tstsmp).json"
$arrayDefenderPlanSpecificProperties = [System.Collections.ArrayList]@()
$arrayDefenderPlanCommonProperties = @('plan', 'subscriptionId', 'subscriptionName', 'subscriptionMgPath', 'pricingTier', 'freeTrialRemainingTime')
foreach ($plan in $arrayDefenderPlansCoverage) {
$plan.Keys | ForEach-Object {
if ($_ -notin $arrayDefenderPlanCommonProperties) {
$null = $arrayDefenderPlanSpecificProperties.Add("$($plan.plan)_$($_)")
}
}
}
$arrayDefenderPlanSpecificPropertiesUnique = $arrayDefenderPlanSpecificProperties | Sort-Object -Unique
$arrayDefenderPlansCoverageAll = [System.Collections.ArrayList]@()
foreach ($entry in $arrayDefenderPlansCoverage) {
$obj = [PSCustomObject]@{}
foreach ($cprop in $arrayDefenderPlanCommonProperties) {
$obj | Add-Member -MemberType NoteProperty -Name $cprop -Value $entry.($cprop)
}
foreach ($sprop in $arrayDefenderPlanSpecificPropertiesUnique) {
if ($sprop -like "$($entry.plan)_*") {
$obj | Add-Member -MemberType NoteProperty -Name $sprop -Value $entry.($sprop -replace "$($entry.plan)_", '' )
}
else {
$obj | Add-Member -MemberType NoteProperty -Name $sprop -Value $null
}
}
$null = $arrayDefenderPlansCoverageAll.Add($obj)
}
if (-not $NoCsvExport) {
Write-Host " Exporting MDfCCoverage CSV '$($outputPath)$($DirectorySeparatorChar)$($fileName)_MDfCCoverage.csv'"
$arrayDefenderPlansCoverageAll | Sort-Object -Property plan, subscriptionName | Export-Csv -Path "$($outputPath)$($DirectorySeparatorChar)$($fileName)_MDfCCoverage.csv" -Delimiter "$csvDelimiter" -NoTypeInformation
}
$end = Get-Date
Write-Host " Defender Coverage processing duration: $((New-TimeSpan -Start $start -End $end).TotalMinutes) minutes ($((New-TimeSpan -Start $start -End $end).TotalSeconds) seconds)"
}