在powershell

时间:2017-05-17 07:53:16

标签: powershell powershell-v3.0

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

$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)顶部。

  3. 这将形成如下:

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

    感谢您提前获得帮助,我们会为您提供一些声望点。

1 个答案:

答案 0 :(得分:3)

您不想为此使用普通哈希表。将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',...)。