Skip to content

Commit fcb0fa4

Browse files
Merge pull request KelvinTegelaar#1346 from kris6673/incidents-alerts
New Defender incident alert and add alltenant support
2 parents 180e34c + b300ce2 commit fcb0fa4

21 files changed

+313
-255
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
2+
function Get-CIPPAlertDefenderIncidents {
3+
<#
4+
.FUNCTIONALITY
5+
Entrypoint
6+
#>
7+
[CmdletBinding()]
8+
param(
9+
[Parameter(Mandatory = $false)]
10+
[Alias('input')]
11+
$InputValue,
12+
$TenantFilter
13+
)
14+
try {
15+
$AlertData = New-GraphGetRequest -uri "https://graph.microsoft.com/v1.0/security/incidents?`$top=50&`$filter=status eq 'active'" -tenantid $TenantFilter | ForEach-Object {
16+
"Incident ID $($_.id): Created at $($_.createdDateTime). Severity: $($_.severity). `nIncident name: $($_.displayName). Incident URL: $($_.incidentWebUrl)."
17+
}
18+
Write-AlertTrace -cmdletName $MyInvocation.MyCommand -tenantFilter $TenantFilter -data $AlertData
19+
20+
} catch {
21+
# Pretty sure this one is gonna be spammy cause of licensing issues, so it's commented out -Bobby
22+
# Write-AlertMessage -tenant $($TenantFilter) -message "Could not get Defender incident data for $($TenantFilter): $(Get-NormalizedError -message $_.Exception.message)"
23+
}
24+
}

Modules/CIPPCore/Public/Alerts/Get-CIPPAlertNoCAConfig.ps1

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,14 @@ function Get-CIPPAlertNoCAConfig {
1212
)
1313

1414
try {
15-
$CAAvailable = (New-GraphGetRequest -uri 'https://graph.microsoft.com/beta/subscribedSkus' -tenantid $TenantFilter -erroraction stop).serviceplans
15+
$CAAvailable = (New-GraphGetRequest -uri 'https://graph.microsoft.com/beta/subscribedSkus' -tenantid $TenantFilter -ErrorAction Stop).serviceplans
1616
if ('AAD_PREMIUM' -in $CAAvailable.servicePlanName) {
1717
$CAPolicies = (New-GraphGetRequest -uri 'https://graph.microsoft.com/v1.0/identity/conditionalAccess/policies' -tenantid $TenantFilter)
1818
if (!$CAPolicies.id) {
1919
$AlertData = 'Conditional Access is available, but no policies could be found.'
2020
Write-AlertTrace -cmdletName $MyInvocation.MyCommand -tenantFilter $TenantFilter -data $AlertData
21-
2221
}
2322
}
24-
2523
} catch {
2624
Write-AlertMessage -tenant $($TenantFilter) -message "Conditional Access Config Alert: Error occurred: $(Get-NormalizedError -message $_.Exception.message)"
2725
}

Modules/CIPPCore/Public/Alerts/Get-CIPPAlertUnusedLicenses.ps1

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,14 @@ function Get-CIPPAlertUnusedLicenses {
1111
$TenantFilter
1212
)
1313

14-
1514
try {
1615
$LicenseTable = Get-CIPPTable -TableName ExcludedLicenses
1716
$ExcludedSkuList = Get-CIPPAzDataTableEntity @LicenseTable
1817
$AlertData = New-GraphGetRequest -uri 'https://graph.microsoft.com/beta/subscribedSkus' -tenantid $TenantFilter | ForEach-Object {
19-
$skuid = $_
20-
foreach ($sku in $skuid) {
18+
$skuId = $_
19+
foreach ($sku in $skuId) {
2120
if ($sku.skuId -in $ExcludedSkuList.GUID) { continue }
22-
$PrettyName = ($ConvertTable | Where-Object { $_.GUID -eq $sku.skuid }).'Product_Display_Name' | Select-Object -Last 1
21+
$PrettyName = ($ConvertTable | Where-Object { $_.GUID -eq $sku.skuId }).'Product_Display_Name' | Select-Object -Last 1
2322
if (!$PrettyName) { $PrettyName = $sku.skuPartNumber }
2423
if ($sku.prepaidUnits.enabled - $sku.consumedUnits -gt 0) {
2524
"$PrettyName has unused licenses. Using $($_.consumedUnits) of $($_.prepaidUnits.enabled)."

Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-ExecIncidentsListAllTenants.ps1

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@ function Push-ExecIncidentsListAllTenants {
33
.FUNCTIONALITY
44
Entrypoint
55
#>
6-
param(
7-
$Item
8-
)
6+
param($Item)
97

108
$Tenant = Get-Tenants -TenantFilter $Item.customerId
119
$domainName = $Tenant.defaultDomainName

Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Push-ListBasicAuthAllTenants.ps1

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ Function Push-ListBasicAuthAllTenants {
88

99
$domainName = $Item.defaultDomainName
1010

11+
# XXX; This function seems to be unused in the frontend. -Bobby
12+
1113
$currentTime = Get-Date -Format 'yyyy-MM-ddTHH:MM:ss'
1214
$ts = (Get-Date).AddDays(-30)
1315
$endTime = $ts.ToString('yyyy-MM-ddTHH:MM:ss')
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
function Push-ListMailQuarantineAllTenants {
2+
<#
3+
.FUNCTIONALITY
4+
Entrypoint
5+
#>
6+
param($Item)
7+
8+
$Tenant = Get-Tenants -TenantFilter $Item.customerId
9+
$domainName = $Tenant.defaultDomainName
10+
$Table = Get-CIPPTable -TableName cacheQuarantineMessages
11+
Write-Host "PowerShell queue trigger function processed work item: $($Tenant.defaultDomainName)"
12+
13+
try {
14+
$quarantineMessages = New-ExoRequest -tenantid $domainName -cmdlet 'Get-QuarantineMessage' -cmdParams @{ 'PageSize' = 1000 } | Select-Object -ExcludeProperty *data.type*
15+
$GraphRequest = foreach ($message in $quarantineMessages) {
16+
$messageData = @{
17+
QuarantineMessage = [string]($message | ConvertTo-Json -Depth 10 -Compress)
18+
RowKey = [string](New-Guid).Guid
19+
PartitionKey = 'QuarantineMessage'
20+
Tenant = [string]$domainName
21+
}
22+
Add-CIPPAzDataTableEntity @Table -Entity $messageData -Force | Out-Null
23+
}
24+
} catch {
25+
$errorData = ConvertTo-Json -InputObject @{
26+
Identity = $null
27+
ReceivedTime = (Get-Date).ToString('s')
28+
SenderAddress = 'CIPP Error'
29+
RecipientAddress = 'N/A'
30+
Subject = "Could not connect to Tenant: $($_.Exception.Message)"
31+
Size = 0
32+
Type = 'Error'
33+
QuarantineReason = 'ConnectionError'
34+
}
35+
$messageData = @{
36+
QuarantineMessage = [string]$errorData
37+
RowKey = [string]$domainName
38+
PartitionKey = 'QuarantineMessage'
39+
Tenant = [string]$domainName
40+
}
41+
Add-CIPPAzDataTableEntity @Table -Entity $messageData -Force | Out-Null
42+
}
43+
}

Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Administration/Invoke-ListMailboxRules.ps1

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,18 @@ Function Invoke-ListMailboxRules {
1010
[CmdletBinding()]
1111
param($Request, $TriggerMetadata)
1212

13+
$APIName = $Request.Params.CIPPEndpoint
14+
$Headers = $Request.Headers
15+
Write-LogMessage -headers $Headers -API $APIName -message 'Accessed this API' -Sev 'Debug'
16+
1317
# Interact with query parameters or the body of the request.
14-
$TenantFilter = $Request.Query.TenantFilter
18+
$TenantFilter = $Request.Query.tenantFilter
1519

1620
$Table = Get-CIPPTable -TableName cachembxrules
1721
if ($TenantFilter -ne 'AllTenants') {
1822
$Table.Filter = "Tenant eq '$TenantFilter'"
1923
}
20-
$Rows = Get-CIPPAzDataTableEntity @Table | Where-Object -Property Timestamp -GT (Get-Date).Addhours(-1)
24+
$Rows = Get-CIPPAzDataTableEntity @Table | Where-Object -Property Timestamp -GT (Get-Date).AddHours(-1)
2125

2226
$Metadata = @{}
2327
if (!$Rows -or ($TenantFilter -eq 'AllTenants' -and ($Rows | Measure-Object).Count -eq 1)) {
@@ -43,7 +47,7 @@ Function Invoke-ListMailboxRules {
4347
}
4448
#Write-Host ($InputObject | ConvertTo-Json)
4549
$InstanceId = Start-NewOrchestration -FunctionName 'CIPPOrchestrator' -InputObject ($InputObject | ConvertTo-Json -Depth 5 -Compress)
46-
Write-Host "Started permissions orchestration with ID = '$InstanceId'"
50+
Write-Host "Started mailbox rules orchestration with ID = '$InstanceId'"
4751
}
4852

4953
} else {

Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Spamfilter/Invoke-ListMailQuarantine.ps1

Lines changed: 63 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,80 @@ function Invoke-ListMailQuarantine {
99
param($Request, $TriggerMetadata)
1010

1111
$APIName = $Request.Params.CIPPEndpoint
12-
Write-LogMessage -headers $Request.Headers -API $APINAME -message 'Accessed this API' -Sev 'Debug'
13-
$Tenantfilter = $request.Query.tenantfilter
12+
$Headers = $Request.Headers
13+
Write-LogMessage -headers $Headers -API $APIName -message 'Accessed this API' -Sev 'Debug'
14+
15+
# Interact with query parameters or the body of the request.
16+
$TenantFilter = $Request.Query.tenantFilter
1417

1518
try {
16-
$GraphRequest = New-ExoRequest -tenantid $Tenantfilter -cmdlet 'Get-QuarantineMessage' -cmdParams @{ 'PageSize' = 1000 }
19+
$GraphRequest = if ($TenantFilter -ne 'AllTenants') {
20+
New-ExoRequest -tenantid $TenantFilter -cmdlet 'Get-QuarantineMessage' -cmdParams @{ 'PageSize' = 1000 } | Select-Object -ExcludeProperty *data.type*
21+
} else {
22+
$Table = Get-CIPPTable -TableName cacheQuarantineMessages
23+
$PartitionKey = 'QuarantineMessage'
24+
$Filter = "PartitionKey eq '$PartitionKey'"
25+
$Rows = Get-CIPPAzDataTableEntity @Table -filter $Filter | Where-Object -Property Timestamp -GT (Get-Date).AddMinutes(-30)
26+
$QueueReference = '{0}-{1}' -f $TenantFilter, $PartitionKey
27+
$RunningQueue = Invoke-ListCippQueue | Where-Object { $_.Reference -eq $QueueReference -and $_.Status -notmatch 'Completed' -and $_.Status -notmatch 'Failed' }
28+
# If a queue is running, we will not start a new one
29+
if ($RunningQueue) {
30+
$Metadata = [PSCustomObject]@{
31+
QueueMessage = 'Still loading data for all tenants. Please check back in a few more minutes'
32+
}
33+
[PSCustomObject]@{
34+
Waiting = $true
35+
}
36+
} elseif (!$Rows -and !$RunningQueue) {
37+
# If no rows are found and no queue is running, we will start a new one
38+
$TenantList = Get-Tenants -IncludeErrors
39+
$Queue = New-CippQueueEntry -Name 'Mail Quarantine - All Tenants' -Reference $QueueReference -TotalTasks ($TenantList | Measure-Object).Count
40+
$Metadata = [PSCustomObject]@{
41+
QueueMessage = 'Loading data for all tenants. Please check back in a few minutes'
42+
}
43+
$InputObject = [PSCustomObject]@{
44+
OrchestratorName = 'MailQuarantineOrchestrator'
45+
QueueFunction = @{
46+
FunctionName = 'GetTenants'
47+
QueueId = $Queue.RowKey
48+
TenantParams = @{
49+
IncludeErrors = $true
50+
}
51+
DurableName = 'ListMailQuarantineAllTenants'
52+
}
53+
SkipLog = $true
54+
}
55+
Start-NewOrchestration -FunctionName 'CIPPOrchestrator' -InputObject ($InputObject | ConvertTo-Json -Depth 5 -Compress)
56+
[PSCustomObject]@{
57+
Waiting = $true
58+
}
59+
} else {
60+
$messages = $Rows
61+
foreach ($message in $messages) {
62+
$messageObj = $message.QuarantineMessage | ConvertFrom-Json
63+
$messageObj | Add-Member -NotePropertyName 'Tenant' -NotePropertyValue $message.Tenant -Force
64+
$messageObj
65+
}
66+
}
67+
}
1768
$StatusCode = [HttpStatusCode]::OK
1869
} catch {
1970
$ErrorMessage = Get-NormalizedError -Message $_.Exception.Message
2071
$StatusCode = [HttpStatusCode]::Forbidden
2172
$GraphRequest = $ErrorMessage
2273
}
2374

75+
if (!$body) {
76+
$StatusCode = [HttpStatusCode]::OK
77+
$body = [PSCustomObject]@{
78+
Results = @($GraphRequest | Where-Object -Property Identity -NE $null | Sort-Object -Property ReceivedTime -Descending )
79+
Metadata = $Metadata
80+
}
81+
}
82+
2483
# Associate values to output bindings by calling 'Push-OutputBinding'.
2584
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
2685
StatusCode = $StatusCode
27-
Body = @($GraphRequest)
86+
Body = $body
2887
})
29-
3088
}

Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Email-Exchange/Spamfilter/Invoke-ListMailQuarantineMessage.ps1

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,19 @@ function Invoke-ListMailQuarantineMessage {
99
param($Request, $TriggerMetadata)
1010

1111
$APIName = $Request.Params.CIPPEndpoint
12-
Write-LogMessage -headers $Request.Headers -API $APINAME -message 'Accessed this API' -Sev 'Debug'
13-
$Tenantfilter = $Request.Query.Tenantfilter
12+
$Headers = $Request.Headers
13+
Write-LogMessage -headers $Headers -API $APIName -message 'Accessed this API' -Sev 'Debug'
14+
15+
# Interact with query parameters or the body of the request.
16+
$TenantFilter = $Request.Query.tenantFilter
17+
$Identity = $Request.Query.Identity
1418

1519
try {
16-
$GraphRequest = New-ExoRequest -tenantid $TenantFilter -cmdlet 'Export-QuarantineMessage' -cmdParams @{ 'Identity' = $Request.Query.Identity }
20+
$GraphRequest = New-ExoRequest -tenantid $TenantFilter -cmdlet 'Export-QuarantineMessage' -cmdParams @{ 'Identity' = $Identity }
1721
$EmlBase64 = $GraphRequest.Eml
1822
$EmlContent = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($EmlBase64))
1923
$Body = @{
20-
'Identity' = $Request.Query.Identity
24+
'Identity' = $Identity
2125
'Message' = $EmlContent
2226
}
2327
$StatusCode = [HttpStatusCode]::OK

Modules/CIPPCore/Public/Entrypoints/HTTP Functions/Identity/Reports/Invoke-ListAzureADConnectStatus.ps1

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,9 @@ Function Invoke-ListAzureADConnectStatus {
1212

1313
$APIName = $Request.Params.CIPPEndpoint
1414
$Headers = $Request.Headers
15-
$TenantFilter = $Request.Query.TenantFilter
16-
Write-LogMessage -Headers $Headers -API $APINAME -message 'Accessed this API' -Sev 'Debug'
17-
15+
Write-LogMessage -Headers $Headers -API $APIName -message 'Accessed this API' -Sev 'Debug'
1816

17+
$TenantFilter = $Request.Query.TenantFilter
1918
$DataToReturn = $Request.Query.DataToReturn
2019
Write-Host "DataToReturn: $DataToReturn"
2120

0 commit comments

Comments
 (0)