functions/Remove-HydrationManagementGroupRecursively.ps1
function Remove-HydrationManagementGroupRecursively { <# .SYNOPSIS Removes a Management Group and all of its children recursively. .DESCRIPTION The Remove-HydrationManagementGroupRecursively cmdlet removes a Management Group and all of its children recursively. This is useful for cleaning up Management Groups that were created as part of a test or demonstration. .LINK https://aka.ms/epac https://github.com/Azure/enterprise-azure-policy-as-code/tree/main/Docs/start-hydration-kit.md #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] $HierarchyRootGroupName ) $InformationPreference = "Continue" $fullHierarchy = Get-AzManagementGroupRestMethod -GroupId $HierarchyRootGroupName -Expand -Recurse Write-Debug "Starting Outer Loop" Remove-HydrationChildHierarchy -ChildHierarchy $fullHierarchy.properties.children Write-Debug "Leaving Outer Loop" # Test to ensure deletes were completed if ($(Get-AzManagementGroupRestMethod -GroupId $HierarchyRootGroupName -Expand -Recurse).properties.children.count -gt 0) { Write-Error "Child Deletions Failed, rerun script." } # Delete the root group do { try { $null = Get-AzManagementGroupRestMethod -GroupId $HierarchyRootGroupName -ErrorAction SilentlyContinue } catch { if ($_.Exception.Message -match "NotFound") { Write-Information " $HierarchyRootGroupName confirmed to be removed..." $complete = $true } } if (!($true -eq $complete)) { Write-Information " Removing $HierarchyRootGroupName..." $null = Remove-AzManagementGroup -GroupName $HierarchyRootGroupName try { $null = Get-AzManagementGroupRestMethod -GroupId $HierarchyRootGroupName -ErrorAction SilentlyContinue } catch { if ($_.Exception.Message -match "NotFound") { Write-Information " $HierarchyRootGroupName confirmed to be removed..." $complete = $true } } if (!($complete -eq $true)) { Write-Information " $HierarchyRootGroupName generated an error during deletion, retrying $(6-$i) more times..." $complete = $false $i++ } } }until($true -eq $complete -or $i -eq 6) } |