在 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...
但我有两件事无法解决:
如何获取包含的用户主体名称?我无法从 ObjectGUID 中查找,也无法弄清楚如何从我的用户数组中查找。
如何将其分类为打印的矩阵,其中我在旁边有几行用户(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'
, ...).
我正在尝试改编我在网上找到的一些代码并具有以下内容:
$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...
但我有两件事无法解决:
如何获取包含的用户主体名称?我无法从 ObjectGUID 中查找,也无法弄清楚如何从我的用户数组中查找。
如何将其分类为打印的矩阵,其中我在旁边有几行用户(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'
, ...).