【问题标题】:Powershell: Reversing/iterating through a hashtable with a many-to-one relationshipPowershell:反向/迭代具有多对一关系的哈希表
【发布时间】:2020-05-04 23:55:43
【问题描述】:

我在 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 组。

这部分很好,如果用户在关联的 AAD 组中,我会成功将用户添加到 AD 组。当我想在之后做相反的事情时,我的困惑就出现了。也就是说,对于属于 AD 1 的每个用户,如果他们不在与该组关联的任何 AAD 组中,则将其从 AD 1 中删除。

我想到的方法是创建另一个哈希表,其中键是 AD 组,然后值是与该组关联的 AAD 组数组,并遍历每个键以检查它们是否'重新成为任何价值组的一部分。如何根据原始哈希表中的数据自动创建该哈希表,然后如何遍历单个键的多个值?

可能有更好的数据结构或方法,我不知道这会使整个事情变得更容易,但我的整体知识非常有限。任何建议将不胜感激,谢谢。

【问题讨论】:

  • 谢谢@Theo,明白了!

标签: powershell active-directory hashtable


【解决方案1】:

您可以像这样用Group-Object 翻转您的$mappings 桌子:

$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
  }
}

【讨论】:

  • 太棒了,谢谢!我只是有一个小问题,下划线变量似乎没有工作,但是用 $reverseMapping 替换 $_ 现在按预期返回值。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 2013-09-19
  • 1970-01-01
  • 2013-06-04
相关资源
最近更新 更多