powershell - 网格中的多行
问题描述
我正在尝试列出特定用户的所有广告组成员身份。输入将是一个用逗号分隔的登录字符串'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 不会扩展单引号字符串中的变量。因此,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
}
推荐阅读
- c++ - 使用指针在 OpenCV 中上传图像
- rest - 无法更新/添加/删除用户到 Ranger 中的组
- android - Flowable订阅在插入记录后获取空列表
- spring - Spring Pagination sorting with cases
- security - RSA 公钥以什么格式通过 Internet 发送?
- tsql - 联结表上的 tsql update trigger1 更新主表,主表更新 trigger2 尝试更新主表中同一行上的其他列 - 失败
- javascript - 如何在不损失质量的情况下扩大图像?
- python - 如何
从 Python 爬取中删除 - express - Vue/Vuex - 如何在路由更改后保持用户身份登录
- firebase - Flutter for Auth 的 Firebase UI