Рекурсивно удалить Azure групп управления (вложенные списки внутри PSObject) - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь написать сценарий, который рекурсивно удаляет Azure Группы управления. Azure Группы управления могут иметь до 6 уровней иерархии. Вы не можете удалить группу управления верхнего уровня, если сначала не были удалены все дочерние элементы.

$toplevelgroup = Get-AzManagementGroup -GroupName 'MyTopLevelGroup' -Expand -Recurse

Возвращает объект «PSManagementGroup». Если у него есть дочерние группы управления, вы можете получить к ним доступ следующим образом:

$toplevelgroup.Children

, который возвращает что-то вроде этого:

Type        : /providers/Microsoft.Management/managementGroups
Id          : /providers/Microsoft.Management/managementGroups/2
Name        : 2
DisplayName : 2
Children    : 3

Примечание. Дети: 3 фактически, потому что группа управления на следующий уровень ниже называется '3'.

Мой сценарий должен

  1. Получить объект группы управления верхнего уровня на основе параметра переданного имени группы управления.
  2. Проверьте, сколько уровней дочерних групп управления существует
  3. L oop через самый нижний уровень групп управления, сначала удалите их, затем перейдите на следующий родительский уровень, удалите их и повторите до верхнего уровня группа также удаляется.

То, что я изначально написал, глупо и работает только при наличии трехуровневой группы управления, поэтому я ищу какой-нибудь указатель, который поможет сделать этот сценарий более надежным.

# Delete All Management Groups
$toplevelgroup = Get-AzManagementGroup -GroupName 'MyTopLevelGroup' -Expand -Recurse
$children = $toplevelgroup.Children
$grandchildren = $toplevelgroup.Children.Children
foreach ($grandchild in $grandchildren) {
    Remove-AzManagementGroup -GroupName $grandchild.Name
}
foreach ($child in $children){
    Remove-AzManagementGroup -GroupName $child.Name 
}
Remove-AzManagementGroup -GroupName $toplevelgroup.Name

Документы:

Get-AzManagementGroup Remove-AzManagementGroup

1 Ответ

0 голосов
/ 14 июля 2020

Если вы хотите удалить группы уровень за уровнем (от самого нижнего до верхнего) на основе логики выше c. Вы можете использовать приведенный ниже фрагмент.

function remove-recursively($name)
{
#gets the parent item
$parent = Get-AzManagementGroup -GroupName $name -Expand -Recurse

#if the children is null
if($parent.Children -eq $null)
{

$temp = $parent.Name 
Write-Host "Removing management Group $temp" -ForegroundColor White
#removes the bottom most in the iteration.
Remove-AzManagementGroup -InputObject $parent
}
else
{
foreach($children in $parent.Children)
{
#recurse if it is not null
remove-recursively($children.Name)
}
}

}

Вы можете выполнять итерацию несколько раз - пока в группе root не останется дочерних элементов.

while((Get-AzManagementGroup -GroupName ("CEO") -Expand -Recurse).Children -ne $null)
{
remove-recursively -name CEO
}

В качестве альтернативы Если ваша цель - удалить всю группу на верхнем уровне. Вы можете написать функцию, которая вызывается рекурсивно до тех пор, пока не будет удален root.

Логика функции c выглядит следующим образом:

  1. Получить группу
  2. Найдите, есть ли дети
  3. Если да, следуйте шагу 1 для каждого ребенка в группе.
  4. Удалите группу.

Предоставляя вам фрагмент функции, основанной на приведенном выше логе c.

function remove-recursively($name)
{
#Enters the parent Level
Write-Host "Entering the scope with $name" -ForegroundColor Green
$parent = Get-AzManagementGroup -GroupName $name -Expand -Recurse

#Checks if there is any parent level.
if($parent.Children -ne $null)
{
Write-Host "Found the following Children :" -ForegroundColor White
Write-host ($parent.Children | select Name).Name -ForegroundColor Yellow
foreach($children in $parent.Children)
{
#tries to recurs to each child item
remove-recursively($children.Name)
}
}

#this below executes if all the child items are deleted or if doesn't have any child item
Write-Host "Removing the scope $name" -ForegroundColor Cyan
#Comment the below line if you just want to understand the flow
Remove-AzManagementGroup -InputObject $parent
}

Вы можете вызвать функцию, как показано ниже:

remove-recursively -name <RootGroupName>

Фрагмент Вывод:

Logi c 1: enter image description here Logic 2 : введите описание изображения здесь

Рекомендуем протестировать скрипты в среде Dev.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...