我正在尝试列出特定用户的所有广告组成员身份。输入将是用逗号'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
...
无论何时运行代码,它都只会添加第一个用户的访问权限,并在一行上返回所有组。因此,我需要以某种方式遍历所有组成员身份,并为每个成员添加一行。
答案 0 :(得分:2)
首先,PowerShell不会在单引号字符串中扩展变量。因此,Get-ADUser
永远不会找到匹配项,除非您有一个使用文字帐户名$user
的用户。另外,使用不带通配符的-like
运算符会产生与-eq
运算符相同的结果。如果您正在寻找完全匹配的商品,请使用后者。您可能还需要添加嵌套的引号。
Get-ADUser -Filter "samAccountName -eq '${user}'"
更正:Get-ADUser
似乎可以自己解决过滤器字符串中的变量。我验证了该声明
Get-ADUser -Filter 'samAccountName -eq $user'
确实确实返回了$user
的用户对象,尽管该字符串用单引号引起了。
如果要进行模糊匹配,最好使用ambiguous name resolution。
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
}
答案 1 :(得分:0)
轻松查询所有用户并将其存储在$users
中,例如:
Get-ADUser -Filter * -SearchBase "dc=domain,dc=local"
然后您可以将结果导出为csv或表。
要导出为CSV格式:
Get-ADPrincipalGroupMembership <Username> | select name, groupcategory, groupscope | export-CSV C:\data\ADUserGroups.csv`
要在控制台中将结果格式化为Table格式:
Get-ADPrincipalGroupMembership <Username> | select name, groupcategory, groupscope | Format-Table