Powershell: реверсирование / итерация хеш-таблицы с отношением "многие к одному" - PullRequest
0 голосов
/ 05 мая 2020

Я автоматизирую задачу в Active Directory / Azure, которая проверяет хеш-таблицу групп, если они являются членами ключа (группа AAD), затем добавляю их к значению (группа AD). Структура и метод в основном следующие:

$mappings = @{
    "1 - AAD Group" = "AD 1"
    "1 - Another Group" = "AD 1"
    "2 - Hello" = "AD 2"
    "3 - Hi" = "AD 3"
    "3 - Another" = "AD 3"
    "3 - Again" = "AD 3"
}

foreach ($mapping in $mappings.GetEnumerator() | Sort-Object -Property Key) {
    # Get AAD and AD group names
    $aadgroup = $mapping.Key
    $adgroup = $mapping.Value

    # Get object ID of AAD group
    $objectid = (Get-AzureADGroup -All $true | Where-Object {$_.DisplayName -eq $aadgroup}).ObjectId

    # Get members of AAD group
    $members = Get-AzureADGroupMember -All $true -ObjectId $objectid

    # Check if each member is part of the corresponding AD group
    foreach ($member in $members) {
        $username = $member.MailNickName
        $groups = (Get-ADUser -Identity $username -Properties MemberOf).MemberOf
        if (!($groups -match $adgroup)) {
            # User is not a member of the AD group, so add to group
            Add-ADGroupMember -Identity "$adgroup" -Members $username
        }
    }
}

Каждая группа AAD связана с одной группой AD, но одна группа AD может быть связана с несколькими группами AAD.

Эта часть в порядке , Я успешно добавляю пользователей в группы AD, если они входят в связанную группу AAD. У меня возникает замешательство, когда я потом хочу сделать обратное. То есть для каждого пользователя, который является частью AD 1, если они не входят ни в одну из групп AAD, связанных с этой группой, удалите их из AD 1.

Как я думал об этом. было бы создать другую хэш-таблицу, где ключом является группа AD, тогда значение представляет собой массив групп AAD, связанных с этой группой, и перебирать каждый ключ, чтобы проверить, являются ли они частью какой-либо из групп значений. Как я могу go создать эту хеш-таблицу автоматически на основе данных в исходной хеш-таблице, и как я могу затем перебирать несколько значений для одного ключа?

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

1 Ответ

0 голосов
/ 05 мая 2020

Вы можете перевернуть свою $mappings таблицу с помощью Group-Object следующим образом:

$mappings = @{
    "1 - AAD Group" = "AD 1"
    "1 - Another Group" = "AD 1"
    "2 - Hello" = "AD 2"
    "3 - Hi" = "AD 3"
    "3 - Another" = "AD 3"
    "3 - Again" = "AD 3"
}

$reverseMappings = $mappings.GetEnumerator() |Group -Property Value -AsHashTable

foreach($reverseMapping in $reverseMappings.GetEnumerator()){
  $ADGroup = $reverseMapping.Key
  foreach($AADGroup in $reverseMapping.Value.Name){
     # Add AAD members here
  }
}
...