首页 > 解决方案 > 网格中的多行

问题描述

我正在尝试列出特定用户的所有广告组成员身份。输入将是一个用逗号分隔的登录字符串'login1,login2'。因此,我检查了每个用户,并以用户名作为标题列出了他们的会员资格。不知何故,它只显示第一个条目。它还在一行中显示用户组,我不知道如何更改它。

下面的代码:

$users = $logon -split ','
$q = @()

foreach ($user in $users) {
    $usernm = Get-ADUser -Filter 'samAccountName -like $user' | select Name
    $useraccess = Get-ADPrincipalGroupMembership $user | Select-Object Name
    $userobj = New-Object PSObject
    $userobj | Add-Member Noteproperty $usernm.Name $useraccess.Name
    $q += $userobj
}

预期输出将类似于:

fullnameuser1           fullnameuser2         list of users goes on...
-------------           -------------         ------------------------
adgroup1                adgroup3              ...
adgroup2                adgroup4
...                     ...

原则上,这也意味着如果我输入$q.'fullnameuser1'输出将是:

fullnameuser1 
-------------
adgroup1
adgroup2
...     

每当运行代码时,它只会添加第一个用户的访问权限,同时返回一行中的所有组。所以不知何故,我需要检查所有组成员资格并为每个成员添加一行。

标签: powershell

解决方案


首先,PowerShell 不会扩展单引号字符串中的变量。因此,Get-ADUser除非您有一个具有字面帐户名称的用户,否则将永远找不到匹配项$user。此外,使用-like不带通配符的运算符会产生与运算符相同的结果-eq。如果您正在寻找精确匹配,请使用后者。您可能还需要添加嵌套引号。

Get-ADUser -Filter "samAccountName -eq '${user}'"

更正: Get-ADUser似乎可以自行解析过滤器字符串中的变量。我验证和声明

Get-ADUser -Filter 'samAccountName -eq $user'

$user尽管字符串在单引号中,但确实返回了用户对象。


如果您想要模糊匹配,最好使用模糊名称解析

Get-ADUser -LDAPFilter "(anr=${user})"

您可能还希望避免在循环中附加到数组,并在创建后将成员添加到自定义对象。两者都是缓慢的操作。将循环输出收集到一个变量中,并在创建对象时直接指定对象属性。

$q = foreach ($user in $users) {
    ...
    New-Object -Type PSObject -Property {
        $usernm.Name = $useraccess.Name
    }
}

最后,我会考虑使用用户名作为属性名不好的设计。如果您正在构建一个哈希表(将唯一键映射到值),那将是可以的,但对于自定义对象,相同种类的所有对象的属性名称应该相同。

New-Object -Type PSObject -Property {
    Name  = $usernm.Name
    Group = $useraccess.Name
}

推荐阅读