@@ -5,198 +5,158 @@ function New-CIPPBackupTask {
55 $TenantFilter
66 )
77
8- $FunctionStopwatch = [System.Diagnostics.Stopwatch ]::StartNew()
9- Write-Host " CIPPBACKUP: Starting backup task: $Task for tenant: $TenantFilter "
10-
118 $BackupData = switch ($Task ) {
129 ' CippCustomVariables' {
13- $TaskStopwatch = [System.Diagnostics.Stopwatch ]::StartNew()
14- Write-Host " CIPPBACKUP: Backing up Custom Variables for $TenantFilter "
15- $ReplaceTable = Get-CIPPTable - tablename ' CippReplacemap'
16-
17- # Get tenant-specific variables
18- $Tenant = Get-Tenants - TenantFilter $TenantFilter
19- $CustomerId = $Tenant.customerId
20-
21- $TenantVariables = Get-CIPPAzDataTableEntity @ReplaceTable - Filter " PartitionKey eq '$CustomerId '"
22-
23- # If backing up AllTenants, also get global variables
24- if ($TenantFilter -eq ' AllTenants' ) {
25- $GlobalVariables = Get-CIPPAzDataTableEntity @ReplaceTable - Filter " PartitionKey eq 'AllTenants'"
26- $AllVariables = @ ($TenantVariables ) + @ ($GlobalVariables )
27- $TaskStopwatch.Stop ()
28- Write-Host " CIPPBACKUP: CippCustomVariables backup completed in $ ( $TaskStopwatch.Elapsed.TotalSeconds ) seconds"
29- $AllVariables
30- } else {
31- $TaskStopwatch.Stop ()
32- Write-Host " CIPPBACKUP: CippCustomVariables backup completed in $ ( $TaskStopwatch.Elapsed.TotalSeconds ) seconds"
33- $TenantVariables
10+ Measure-CIPPTask - Name ' CIPP.BackupCompleted' - Section ' CustomVariables' - Execute {
11+ $ReplaceTable = Get-CIPPTable - tablename ' CippReplacemap'
12+
13+ # Get tenant-specific variables
14+ $Tenant = Get-Tenants - TenantFilter $TenantFilter
15+ $CustomerId = $Tenant.customerId
16+
17+ $TenantVariables = Get-CIPPAzDataTableEntity @ReplaceTable - Filter " PartitionKey eq '$CustomerId '"
18+
19+ # If backing up AllTenants, also get global variables
20+ if ($TenantFilter -eq ' AllTenants' ) {
21+ $GlobalVariables = Get-CIPPAzDataTableEntity @ReplaceTable - Filter " PartitionKey eq 'AllTenants'"
22+ $AllVariables = @ ($TenantVariables ) + @ ($GlobalVariables )
23+ $AllVariables
24+ } else {
25+ $TenantVariables
26+ }
3427 }
3528 }
3629 ' users' {
37- $TaskStopwatch = [ System.Diagnostics.Stopwatch ]::StartNew()
38- Write-Host " CIPPBACKUP: Backup users for $TenantFilter "
39- $Users = New-GraphGetRequest - uri ' https://graph.microsoft.com/beta/users?$top=999 ' - tenantid $TenantFilter | Select-Object * - ExcludeProperty mail , provisionedPlans , onPrem * , * passwordProfile * , * serviceProvisioningErrors * , isLicenseReconciliationNeeded , isManagementRestricted , isResourceAccount , * date * , * external * , identities , deletedDateTime , isSipEnabled , assignedPlans , cloudRealtimeCommunicationInfo , deviceKeys , provisionedPlan , securityIdentifier
40- # remove the property if the value is $null
41- $users = $Users | ForEach-Object {
42- $_ .psobject.properties | Where-Object { $null -eq $_.Value } | ForEach-Object {
43- $_ .psobject.properties.Remove ( $_ .Name )
30+ Measure-CIPPTask - Name ' CIPP.BackupCompleted ' - Section ' Users ' - Execute {
31+ $Users = New-GraphGetRequest - uri ' https://graph.microsoft.com/beta/ users?$top=999 ' - tenantid $TenantFilter | Select-Object * - ExcludeProperty mail , provisionedPlans , onPrem * , * passwordProfile * , * serviceProvisioningErrors * , isLicenseReconciliationNeeded , isManagementRestricted , isResourceAccount , * date * , * external * , identities , deletedDateTime , isSipEnabled , assignedPlans , cloudRealtimeCommunicationInfo , deviceKeys , provisionedPlan , securityIdentifier
32+ # remove the property if the value is $null
33+ $users = $Users | ForEach-Object {
34+ $_ .psobject.properties | Where-Object { $null -eq $_ .Value } | ForEach-Object {
35+ $_.psobject.properties.Remove ( $_ .Name )
36+ }
4437 }
38+ $Users
4539 }
46- $TaskStopwatch.Stop ()
47- Write-Host " CIPPBACKUP: Users backup completed in $ ( $TaskStopwatch.Elapsed.TotalSeconds ) seconds"
48- $Users
49-
5040 }
5141 ' groups' {
52- $TaskStopwatch = [System.Diagnostics.Stopwatch ]::StartNew()
53- Write-Host " CIPPBACKUP: Backup groups for $TenantFilter "
54- $Groups = New-GraphGetRequest - uri ' https://graph.microsoft.com/beta/groups?$top=999' - tenantid $TenantFilter
55- $TaskStopwatch.Stop ()
56- Write-Host " CIPPBACKUP: Groups backup completed in $ ( $TaskStopwatch.Elapsed.TotalSeconds ) seconds"
57- $Groups
42+ Measure-CIPPTask - Name ' CIPP.BackupCompleted' - Section ' Groups' - Execute {
43+ New-GraphGetRequest - uri ' https://graph.microsoft.com/beta/groups?$top=999' - tenantid $TenantFilter
44+ }
5845 }
5946 ' ca' {
60- $TaskStopwatch = [System.Diagnostics.Stopwatch ]::StartNew()
61- Write-Host " CIPPBACKUP: Backup Conditional Access Policies for $TenantFilter "
62- $Policies = New-GraphGetRequest - uri ' https://graph.microsoft.com/beta/conditionalAccess/policies?$top=999' - tenantid $TenantFilter - AsApp $true
63- Write-Host ' CIPPBACKUP: Creating templates for found Conditional Access Policies'
64- foreach ($policy in $policies ) {
65- try {
66- New-CIPPCATemplate - TenantFilter $TenantFilter - JSON $policy
67- } catch {
68- " Failed to create a template of the Conditional Access Policy with ID: $ ( $policy.id ) . Error: $ ( $_.Exception.Message ) "
47+ Measure-CIPPTask - Name ' CIPP.BackupCompleted' - Section ' ConditionalAccess' - Execute {
48+ $Policies = New-GraphGetRequest - uri ' https://graph.microsoft.com/beta/conditionalAccess/policies?$top=999' - tenantid $TenantFilter - AsApp $true
49+ foreach ($policy in $policies ) {
50+ try {
51+ New-CIPPCATemplate - TenantFilter $TenantFilter - JSON $policy
52+ } catch {
53+ " Failed to create a template of the Conditional Access Policy with ID: $ ( $policy.id ) . Error: $ ( $_.Exception.Message ) "
54+ }
6955 }
7056 }
71- $TaskStopwatch.Stop ()
72- Write-Host " CIPPBACKUP: Conditional Access backup completed in $ ( $TaskStopwatch.Elapsed.TotalSeconds ) seconds"
7357 }
7458 ' intuneconfig' {
75- $TaskStopwatch = [ System.Diagnostics.Stopwatch ]::StartNew()
76- Write-Host " CIPPBACKUP: Backup Intune Configuration Policies for $TenantFilter "
77- $GraphURLS = @ ( " https://graph.microsoft.com/beta/deviceManagement/deviceConfigurations? `$ select=id,displayName,lastModifiedDateTime,roleScopeTagIds,microsoft.graph.unsupportedDeviceConfiguration/originalEntityTypeName& `$ expand=assignments&top=1000 "
78- ' https://graph.microsoft.com/beta/deviceManagement/windowsDriverUpdateProfiles '
79- " https://graph.microsoft.com/beta/deviceManagement/groupPolicyConfigurations ?`$ expand=assignments&top=999 "
80- " https://graph.microsoft.com/beta/deviceAppManagement/mobileAppConfigurations? `$ expand=assignments& `$ filter=microsoft.graph.androidManagedStoreAppConfiguration/appSupportsOemConfig%20eq%20true "
81- ' https://graph.microsoft.com/beta/deviceManagement/configurationPolicies '
82- ' https://graph.microsoft.com/beta/deviceManagement/windowsFeatureUpdateProfiles '
83- ' https://graph.microsoft.com/beta/deviceManagement/windowsQualityUpdatePolicies '
84- ' https://graph.microsoft.com/beta/deviceManagement/windowsQualityUpdateProfiles '
85- )
86-
87- foreach ( $url in $GraphURLS ) {
88- try {
89- $Policies = New-GraphGetRequest - uri " $ ( $url ) " - tenantid $TenantFilter
90- $URLName = (( $url ).split( ' ? ' ) | Select-Object - First 1 ) -replace ' https://graph.microsoft.com/beta/deviceManagement/ ' , ' '
91- foreach ( $Policy in $Policies ) {
92- try {
93- New-CIPPIntuneTemplate - TenantFilter $TenantFilter - URLName $URLName - ID $Policy .ID
94- } catch {
95- $ErrorMessage = Get-NormalizedError - Message $_ .Exception.Message
96- " Failed to create a template of the Intune Configuration Policy with ID: $ ( $Policy .id ) . Error: $ErrorMessage "
59+ Measure-CIPPTask - Name ' CIPP.BackupCompleted ' - Section ' IntuneConfiguration ' - Execute {
60+ $GraphURLS = @ ( " https://graph.microsoft.com/beta/deviceManagement/deviceConfigurations? `$ select=id,displayName,lastModifiedDateTime,roleScopeTagIds,microsoft.graph.unsupportedDeviceConfiguration/originalEntityTypeName& `$ expand=assignments&top=1000 "
61+ ' https://graph.microsoft.com/beta/deviceManagement/windowsDriverUpdateProfiles '
62+ " https://graph.microsoft.com/beta/deviceManagement/groupPolicyConfigurations? `$ expand=assignments&top=999 "
63+ " https://graph.microsoft.com/beta/deviceAppManagement/mobileAppConfigurations ?`$ expand=assignments&`$ filter=microsoft.graph.androidManagedStoreAppConfiguration/appSupportsOemConfig%20eq%20true "
64+ ' https://graph.microsoft.com/beta/deviceManagement/configurationPolicies '
65+ ' https://graph.microsoft.com/beta/deviceManagement/windowsFeatureUpdateProfiles '
66+ ' https://graph.microsoft.com/beta/deviceManagement/windowsQualityUpdatePolicies '
67+ ' https://graph.microsoft.com/beta/deviceManagement/windowsQualityUpdateProfiles '
68+ )
69+
70+ foreach ( $url in $GraphURLS ) {
71+ try {
72+ $Policies = New-GraphGetRequest - uri " $ ( $url ) " - tenantid $TenantFilter
73+ $URLName = (( $url ).split( ' ? ' ) | Select-Object - First 1 ) -replace ' https://graph.microsoft.com/beta/deviceManagement/ ' , ' '
74+ foreach ( $Policy in $Policies ) {
75+ try {
76+ New-CIPPIntuneTemplate - TenantFilter $TenantFilter - URLName $URLName - ID $Policy .ID
77+ } catch {
78+ $ErrorMessage = Get-NormalizedError - Message $_ .Exception.Message
79+ " Failed to create a template of the Intune Configuration Policy with ID: $ ( $Policy .id ) . Error: $ErrorMessage "
80+ }
9781 }
82+ } catch {
83+ Write-Host " Failed to backup $url "
9884 }
99- } catch {
100- Write-Host " CIPPBACKUP: Failed to backup $url "
10185 }
10286 }
103- $TaskStopwatch.Stop ()
104- Write-Host " CIPPBACKUP: Intune Configuration backup completed in $ ( $TaskStopwatch.Elapsed.TotalSeconds ) seconds"
10587 }
10688 ' intunecompliance' {
107- $TaskStopwatch = [System.Diagnostics.Stopwatch ]::StartNew()
108- Write-Host " CIPPBACKUP: Backup Intune Configuration Policies for $TenantFilter "
109-
110- New-GraphGetRequest - uri ' https://graph.microsoft.com/beta/deviceManagement/deviceCompliancePolicies?$top=999' - tenantid $TenantFilter | ForEach-Object {
111- New-CIPPIntuneTemplate - TenantFilter $TenantFilter - URLName ' deviceCompliancePolicies' - ID $_.ID
89+ Measure-CIPPTask - Name ' CIPP.BackupCompleted' - Section ' IntuneCompliance' - Execute {
90+ New-GraphGetRequest - uri ' https://graph.microsoft.com/beta/deviceManagement/deviceCompliancePolicies?$top=999' - tenantid $TenantFilter | ForEach-Object {
91+ New-CIPPIntuneTemplate - TenantFilter $TenantFilter - URLName ' deviceCompliancePolicies' - ID $_.ID
92+ }
11293 }
113- $TaskStopwatch.Stop ()
114- Write-Host " CIPPBACKUP: Intune Compliance backup completed in $ ( $TaskStopwatch.Elapsed.TotalSeconds ) seconds"
11594 }
11695
11796 ' intuneprotection' {
118- $TaskStopwatch = [System.Diagnostics.Stopwatch ]::StartNew()
119- Write-Host " CIPPBACKUP: Backup Intune Configuration Policies for $TenantFilter "
120-
121- New-GraphGetRequest - uri ' https://graph.microsoft.com/beta/deviceAppManagement/managedAppPolicies?$top=999' - tenantid $TenantFilter | ForEach-Object {
122- New-CIPPIntuneTemplate - TenantFilter $TenantFilter - URLName ' managedAppPolicies' - ID $_.ID
97+ Measure-CIPPTask - Name ' CIPP.BackupCompleted' - Section ' IntuneProtection' - Execute {
98+ New-GraphGetRequest - uri ' https://graph.microsoft.com/beta/deviceAppManagement/managedAppPolicies?$top=999' - tenantid $TenantFilter | ForEach-Object {
99+ New-CIPPIntuneTemplate - TenantFilter $TenantFilter - URLName ' managedAppPolicies' - ID $_.ID
100+ }
123101 }
124- $TaskStopwatch.Stop ()
125- Write-Host " CIPPBACKUP: Intune Protection backup completed in $ ( $TaskStopwatch.Elapsed.TotalSeconds ) seconds"
126102 }
127103
128104 ' antispam' {
129- $TaskStopwatch = [System.Diagnostics.Stopwatch ]::StartNew()
130- Write-Host " CIPPBACKUP: Backup Anti-Spam Policies for $TenantFilter "
131-
132- $Policies = New-ExoRequest - tenantid $Tenantfilter - cmdlet ' Get-HostedContentFilterPolicy' | Select-Object * - ExcludeProperty * odata* , * data .type*
133- $Rules = New-ExoRequest - tenantid $Tenantfilter - cmdlet ' Get-HostedContentFilterRule' | Select-Object * - ExcludeProperty * odata* , * data .type*
105+ Measure-CIPPTask - Name ' CIPP.BackupCompleted' - Section ' AntiSpam' - Execute {
106+ $Policies = New-ExoRequest - tenantid $Tenantfilter - cmdlet ' Get-HostedContentFilterPolicy' | Select-Object * - ExcludeProperty * odata* , * data .type*
107+ $Rules = New-ExoRequest - tenantid $Tenantfilter - cmdlet ' Get-HostedContentFilterRule' | Select-Object * - ExcludeProperty * odata* , * data .type*
134108
135- $Policies | ForEach-Object {
136- $_.psobject.properties | Where-Object { $null -eq $_.Value } | ForEach-Object {
137- $_.psobject.properties.Remove ($_.Name )
109+ $Policies | ForEach-Object {
110+ $_.psobject.properties | Where-Object { $null -eq $_.Value } | ForEach-Object {
111+ $_.psobject.properties.Remove ($_.Name )
112+ }
138113 }
139- }
140114
141- $Rules | ForEach-Object {
142- $_.psobject.properties | Where-Object { $null -eq $_.Value } | ForEach-Object {
143- $_.psobject.properties.Remove ($_.Name )
115+ $Rules | ForEach-Object {
116+ $_.psobject.properties | Where-Object { $null -eq $_.Value } | ForEach-Object {
117+ $_.psobject.properties.Remove ($_.Name )
118+ }
144119 }
145- }
146120
147- $JSON = @ { policies = $Policies ; rules = $Rules } | ConvertTo-Json - Depth 10
148- $TaskStopwatch.Stop ()
149- Write-Host " CIPPBACKUP: Anti-Spam backup completed in $ ( $TaskStopwatch.Elapsed.TotalSeconds ) seconds"
150- $JSON
121+ @ { policies = $Policies ; rules = $Rules } | ConvertTo-Json - Depth 10
122+ }
151123 }
152124
153125 ' antiphishing' {
154- $TaskStopwatch = [System.Diagnostics.Stopwatch ]::StartNew()
155- Write-Host " CIPPBACKUP: Backup Anti-Phishing Policies for $TenantFilter "
156-
157- $Policies = New-ExoRequest - tenantid $Tenantfilter - cmdlet ' Get-AntiPhishPolicy' | Select-Object * - ExcludeProperty * odata* , * data .type*
158- $Rules = New-ExoRequest - tenantid $Tenantfilter - cmdlet ' Get-AntiPhishRule' | Select-Object * - ExcludeProperty * odata* , * data .type*
126+ Measure-CIPPTask - Name ' CIPP.BackupCompleted' - Section ' AntiPhishing' - Execute {
127+ $Policies = New-ExoRequest - tenantid $Tenantfilter - cmdlet ' Get-AntiPhishPolicy' | Select-Object * - ExcludeProperty * odata* , * data .type*
128+ $Rules = New-ExoRequest - tenantid $Tenantfilter - cmdlet ' Get-AntiPhishRule' | Select-Object * - ExcludeProperty * odata* , * data .type*
159129
160- $Policies | ForEach-Object {
161- $_.psobject.properties | Where-Object { $null -eq $_.Value } | ForEach-Object {
162- $_.psobject.properties.Remove ($_.Name )
130+ $Policies | ForEach-Object {
131+ $_.psobject.properties | Where-Object { $null -eq $_.Value } | ForEach-Object {
132+ $_.psobject.properties.Remove ($_.Name )
133+ }
163134 }
164- }
165135
166- $Rules | ForEach-Object {
167- $_.psobject.properties | Where-Object { $null -eq $_.Value } | ForEach-Object {
168- $_.psobject.properties.Remove ($_.Name )
136+ $Rules | ForEach-Object {
137+ $_.psobject.properties | Where-Object { $null -eq $_.Value } | ForEach-Object {
138+ $_.psobject.properties.Remove ($_.Name )
139+ }
169140 }
170- }
171141
172- $JSON = @ { policies = $Policies ; rules = $Rules } | ConvertTo-Json - Depth 10
173- $TaskStopwatch.Stop ()
174- Write-Host " CIPPBACKUP: Anti-Phishing backup completed in $ ( $TaskStopwatch.Elapsed.TotalSeconds ) seconds"
175- $JSON
142+ @ { policies = $Policies ; rules = $Rules } | ConvertTo-Json - Depth 10
143+ }
176144 }
177145
178146 ' CippWebhookAlerts' {
179- $TaskStopwatch = [System.Diagnostics.Stopwatch ]::StartNew()
180- Write-Host " CIPPBACKUP: Backup Webhook Alerts for $TenantFilter "
181- $WebhookTable = Get-CIPPTable - TableName ' WebhookRules'
182- $WebhookData = Get-CIPPAzDataTableEntity @WebhookTable | Where-Object { $TenantFilter -in ($_.Tenants | ConvertFrom-Json ).value }
183- $TaskStopwatch.Stop ()
184- Write-Host " CIPPBACKUP: Webhook Alerts backup completed in $ ( $TaskStopwatch.Elapsed.TotalSeconds ) seconds"
185- $WebhookData
147+ Measure-CIPPTask - Name ' CIPP.BackupCompleted' - Section ' WebhookAlerts' - Execute {
148+ $WebhookTable = Get-CIPPTable - TableName ' WebhookRules'
149+ Get-CIPPAzDataTableEntity @WebhookTable | Where-Object { $TenantFilter -in ($_.Tenants | ConvertFrom-Json ).value }
150+ }
186151 }
187152 ' CippScriptedAlerts' {
188- $TaskStopwatch = [System.Diagnostics.Stopwatch ]::StartNew()
189- Write-Host " CIPPBACKUP: Backup Scripted Alerts for $TenantFilter "
190- $ScheduledTasks = Get-CIPPTable - TableName ' ScheduledTasks'
191- $ScriptedAlerts = Get-CIPPAzDataTableEntity @ScheduledTasks | Where-Object { $_.hidden -eq $true -and $_.command -like ' Get-CippAlert*' -and $TenantFilter -in $_.Tenant }
192- $TaskStopwatch.Stop ()
193- Write-Host " CIPPBACKUP: Scripted Alerts backup completed in $ ( $TaskStopwatch.Elapsed.TotalSeconds ) seconds"
194- $ScriptedAlerts
153+ Measure-CIPPTask - Name ' CIPP.BackupCompleted' - Section ' ScriptedAlerts' - Execute {
154+ $ScheduledTasks = Get-CIPPTable - TableName ' ScheduledTasks'
155+ Get-CIPPAzDataTableEntity @ScheduledTasks | Where-Object { $_.hidden -eq $true -and $_.command -like ' Get-CippAlert*' -and $TenantFilter -in $_.Tenant }
156+ }
195157 }
196158 }
197159
198- $FunctionStopwatch.Stop ()
199- Write-Host " CIPPBACKUP: Total backup task completed in $ ( $FunctionStopwatch.Elapsed.TotalSeconds ) seconds"
200160 return $BackupData
201161}
202162
0 commit comments