在 powershell 中将列表转置为矩阵

Transpose list to matrix in powershell

我正在尝试改编我在网上找到的一些代码并具有以下内容:

$groups = Get-ADGroup -Filter {GroupCategory -eq ‘security’} -SearchBase ‘OU=Groups,DC=corp,DC=test,DC=local’
$users = Get-ADUser -Filter * -SearchBase “dc=corp,dc=test,dc=local”

$addADGroupMembers = @{}

foreach($group in $groups) {
    $addADGroupMembers.Add($group.Name, $group.ObjectGUID)
}

$htUsers = @{}
$htProps = @{}
$addADGroupMembers.Keys | foreach {$htProps.$_=$null}
foreach ($group in $addADGroupMembers.GetEnumerator()){
    foreach ($user in $group.Value){
        if (!$htUsers.ContainsKey($user)){
            $htProps.UserID = $user
            $htUsers.$user = $htProps.Clone()
        }
        ($htUsers.$user).$($group.Name) = 1
    }
}

这给了我一个用户列表,每个用户都有如下列表元素:

Accounts Administrators                                   : False
Support Read-Write                                        : False
Username                                                  : user1@test.local
Purchasing Read-Write                                     : False
Developers Administrators                                 : False
SharePoint 365 Administrators                             : False
Operations Read-Write                                     : False

Accounts Administrators                                   : True
Support Read-Write                                        : False
Username                                                  : joe@test.local
Purchasing Read-Write                                     : False
Developers Administrators                                 : False
SharePoint 365 Administrators                             : True
Operations Read-Write                                     : False

#snip...

但我有两件事无法解决:

  1. 如何获取包含的用户主体名称?我无法从 ObjectGUID 中查找,也无法弄清楚如何从我的用户数组中查找。

  2. 如何将其分类为打印的矩阵,其中我在旁边有几行用户(UPN 是第一列),以及他们的相关组(如果他们是,则为 True)一个成员)沿着顶部。

这将形成以下内容:

                    Accounts        Support        Sales
User1@domain.com      1                             1
User2@domain.com                       1

在此先感谢您的帮助,将为您提供一些声望点数。

您不想为此使用普通哈希表。将 UPN 和组名称放入(有序的)哈希表中并从中创建自定义对象:

$groups = Get-ADGroup -Filter "GroupCategory -eq 'security'" -SearchBase 'OU=Groups,DC=corp,DC=test,DC=local'

Get-ADUser -Filter * -SearchBase "dc=corp,dc=test,dc=local" -Properties MemberOf | ForEach-Object {
  $props = [ordered]@{ 'Username' = $_.UserPrincipalName }
  $groups | ForEach-Object {
    $props[$_.Name] = $false
  }

  $_.MemberOf | Get-ADGroup | Select-Object -Expand Name | ForEach-Object {
    if ($props.ContainsKey($_)) {
      $props[$_] = $true
    }
  }

  New-Object -Type PSObject -Property $props
}

输出看起来像这样:

Username            Accounts        Support        Sales
--------            --------        -------        -----
User1@domain.com        True          False         True
User2@domain.com       False           True        False
...

如果您想要空值而不是 False 用户不是组的成员,请将 $false 替换为空字符串 ('') 并替换 $true 与你想使用的任何标记 (1, 'x', ...).