|
| 1 | +function Invoke-AddDefenderTemplate { |
| 2 | + <# |
| 3 | + .FUNCTIONALITY |
| 4 | + Entrypoint |
| 5 | + .ROLE |
| 6 | + Endpoint.MEM.ReadWrite |
| 7 | + #> |
| 8 | + [CmdletBinding()] |
| 9 | + param($Request, $TriggerMetadata) |
| 10 | + |
| 11 | + $APIName = $Request.Params.CIPPEndpoint |
| 12 | + $Headers = $Request.Headers |
| 13 | + |
| 14 | + $TemplateName = $Request.Body.templateName |
| 15 | + if (-not $TemplateName) { |
| 16 | + return ([HttpResponseContext]@{ |
| 17 | + StatusCode = [HttpStatusCode]::BadRequest |
| 18 | + Body = @{ Results = 'A template name prefix is required.' } |
| 19 | + }) |
| 20 | + } |
| 21 | + |
| 22 | + $PolicySettings = $Request.Body.Policy |
| 23 | + $DefenderExclusions = $Request.Body.Exclusion |
| 24 | + $ASR = $Request.Body.ASR |
| 25 | + $EDR = $Request.Body.EDR |
| 26 | + $Package = [string]$Request.Body.package |
| 27 | + |
| 28 | + $Table = Get-CippTable -tablename 'templates' |
| 29 | + $Table.Force = $true |
| 30 | + |
| 31 | + $Results = [System.Collections.Generic.List[string]]::new() |
| 32 | + |
| 33 | + try { |
| 34 | + if ($PolicySettings) { |
| 35 | + $GUID = (New-Guid).GUID |
| 36 | + $PolicyJson = Set-CIPPDefenderAVPolicy -PolicySettings $PolicySettings -TemplateOnly |
| 37 | + $Object = [PSCustomObject]@{ |
| 38 | + Displayname = '{0} - AV Policy' -f $TemplateName |
| 39 | + Description = '' |
| 40 | + RAWJson = (ConvertTo-Json -Depth 15 -Compress -InputObject $PolicyJson) |
| 41 | + Type = 'Catalog' |
| 42 | + GUID = $GUID |
| 43 | + ReusableSettings = @() |
| 44 | + } | ConvertTo-Json -Compress |
| 45 | + Add-CIPPAzDataTableEntity @Table -Entity @{ |
| 46 | + JSON = "$Object" |
| 47 | + RowKey = "$GUID" |
| 48 | + PartitionKey = 'IntuneTemplate' |
| 49 | + GUID = "$GUID" |
| 50 | + Package = $Package |
| 51 | + } |
| 52 | + $Results.Add('Successfully created AV Policy template') |
| 53 | + Write-LogMessage -headers $Headers -API $APIName -message ("Created Defender AV Policy template '{0} - AV Policy'" -f $TemplateName) -Sev 'Info' |
| 54 | + } |
| 55 | + |
| 56 | + if ($ASR) { |
| 57 | + $GUID = (New-Guid).GUID |
| 58 | + $AsrJson = Set-CIPPDefenderASRPolicy -ASR $ASR -TemplateOnly |
| 59 | + $Object = [PSCustomObject]@{ |
| 60 | + Displayname = '{0} - ASR Policy' -f $TemplateName |
| 61 | + Description = '' |
| 62 | + RAWJson = (ConvertTo-Json -Depth 15 -Compress -InputObject $AsrJson) |
| 63 | + Type = 'Catalog' |
| 64 | + GUID = $GUID |
| 65 | + ReusableSettings = @() |
| 66 | + } | ConvertTo-Json -Compress |
| 67 | + Add-CIPPAzDataTableEntity @Table -Entity @{ |
| 68 | + JSON = "$Object" |
| 69 | + RowKey = "$GUID" |
| 70 | + PartitionKey = 'IntuneTemplate' |
| 71 | + GUID = "$GUID" |
| 72 | + Package = $Package |
| 73 | + } |
| 74 | + $Results.Add('Successfully created ASR Policy template') |
| 75 | + Write-LogMessage -headers $Headers -API $APIName -message ("Created Defender ASR Policy template '{0} - ASR Policy'" -f $TemplateName) -Sev 'Info' |
| 76 | + } |
| 77 | + |
| 78 | + if ($EDR) { |
| 79 | + $GUID = (New-Guid).GUID |
| 80 | + $EdrJson = Set-CIPPDefenderEDRPolicy -EDR $EDR -TemplateOnly |
| 81 | + if ($EdrJson) { |
| 82 | + $Object = [PSCustomObject]@{ |
| 83 | + Displayname = '{0} - EDR Policy' -f $TemplateName |
| 84 | + Description = '' |
| 85 | + RAWJson = (ConvertTo-Json -Depth 15 -Compress -InputObject $EdrJson) |
| 86 | + Type = 'Catalog' |
| 87 | + GUID = $GUID |
| 88 | + ReusableSettings = @() |
| 89 | + } | ConvertTo-Json -Compress |
| 90 | + Add-CIPPAzDataTableEntity @Table -Entity @{ |
| 91 | + JSON = "$Object" |
| 92 | + RowKey = "$GUID" |
| 93 | + PartitionKey = 'IntuneTemplate' |
| 94 | + GUID = "$GUID" |
| 95 | + Package = $Package |
| 96 | + } |
| 97 | + $Results.Add('Successfully created EDR Policy template') |
| 98 | + Write-LogMessage -headers $Headers -API $APIName -message ("Created Defender EDR Policy template '{0} - EDR Policy'" -f $TemplateName) -Sev 'Info' |
| 99 | + } |
| 100 | + } |
| 101 | + |
| 102 | + if ($DefenderExclusions) { |
| 103 | + $GUID = (New-Guid).GUID |
| 104 | + $ExclusionJson = Set-CIPPDefenderExclusionPolicy -DefenderExclusions $DefenderExclusions -TemplateOnly |
| 105 | + if ($ExclusionJson) { |
| 106 | + $Object = [PSCustomObject]@{ |
| 107 | + Displayname = '{0} - AV Exclusion Policy' -f $TemplateName |
| 108 | + Description = '' |
| 109 | + RAWJson = (ConvertTo-Json -Depth 15 -Compress -InputObject $ExclusionJson) |
| 110 | + Type = 'Catalog' |
| 111 | + GUID = $GUID |
| 112 | + ReusableSettings = @() |
| 113 | + } | ConvertTo-Json -Compress |
| 114 | + Add-CIPPAzDataTableEntity @Table -Entity @{ |
| 115 | + JSON = "$Object" |
| 116 | + RowKey = "$GUID" |
| 117 | + PartitionKey = 'IntuneTemplate' |
| 118 | + GUID = "$GUID" |
| 119 | + Package = $Package |
| 120 | + } |
| 121 | + $Results.Add('Successfully created AV Exclusion Policy template') |
| 122 | + Write-LogMessage -headers $Headers -API $APIName -message ("Created Defender AV Exclusion Policy template '{0} - AV Exclusion Policy'" -f $TemplateName) -Sev 'Info' |
| 123 | + } |
| 124 | + } |
| 125 | + } catch { |
| 126 | + $ErrorMessage = Get-CippException -Exception $_ |
| 127 | + $FullError = "Failed to create template: $($ErrorMessage.NormalizedMessage) | $($_.InvocationInfo.ScriptName):$($_.InvocationInfo.ScriptLineNumber) | $($_.Exception.GetType().FullName)" |
| 128 | + $Results.Add($FullError) |
| 129 | + Write-LogMessage -headers $Headers -API $APIName -message $FullError -Sev 'Error' -LogData $ErrorMessage |
| 130 | + } |
| 131 | + |
| 132 | + return ([HttpResponseContext]@{ |
| 133 | + StatusCode = [HttpStatusCode]::OK |
| 134 | + Body = @{ Results = @($Results) } |
| 135 | + }) |
| 136 | +} |
0 commit comments