-Like, -匹配子数组

-Like, -Match in subarray

我正在使用 Search-ADAccount 从 Active Directory 获取非活动用户列表,然后将其通过管道传输到 Get-ADUser,这样我就可以在 MemberOf 不包含组 [=] 的地方使用14=]。我相信我可以使用正确的数字 (379) 和完整的 DN 字符串。但是,如果群组移动,我想使用 -match-like 来仅使用群组的名称。它returns的数字不一样。

如果我使用 MemberOf 对单个用户单独执行此操作,它只会过滤掉用户拥有的一个组和 returns 另一个用户,所以我认为这就是为什么我拥有的不仅仅是 -contains。有没有办法不用 foreach 自己对子数组使用 -like-match

从字符串中删除了完整的 DN

PS> $InactiveAll.Count
488
PS> ($InactiveAll | Where {-not $_.memberof.contains("CN=Accounts_to_Keep,OU=DC")}).Count 
379
PS> ($InactiveAll | Where { $_.memberof -notlike "*Accounts_To_keep*"}).Count 
427
PS> ($InactiveAll | Where {-not $_.memberof -contains ("CN=Accounts_to_Keep,OU=DC")}).Count 
61
PS> ($InactiveAll | Where {-not ($_.memberof -contains ("CN=Accounts_to_Keep,OU=DC"))}).Count
379
PS> ($InactiveAll | Where { $_.memberof -notmatch "Accounts_To_Keep"}).Count
427

-like 和-notlike 使用通配符,"*"。此外,在组数组上使用 -notlike 和 -notmatch 与在单个元素上使用它们有不同的结果。我认为您需要研究这些操作员的工作。任何结果都将在 where-object.

中计算为 "true"
'group1','group2','group3' -notmatch 'group1'
group2
group3


'group1','group2','group3' -notlike '*group1*'
group2
group3

这是一种在字符串数组中搜索子字符串的方法:

| where { -not ($_.memberof | select-string group1) }

或者

| where { -not ($_.memberof -match 'group1') }
| where { -not ($_.memberof -like '*group1*') }

我认为 -match 在测试可分辨名称方面不会比 -like 有任何优势,因为在这种情况下,您知道 'CN=Accounts_to_Keep' 将按名称识别所需的组。不要忘记 -notcontains 的存在是为了稍微简化您的代码。

这段代码可能有点偏离,因为我前面没有目录可以测试,但如果你想排除该组的成员,无论它存在在哪里,我认为你应该 让 Active Directory 处理查找组...

$groupToExclude = Get-ADGroup -Identity 'Accounts_to_Keep'

...然后您可以匹配整个可分辨名称,而不是匹配可分辨名称子字符串...

($InactiveAll | Where { $_.MemberOf -notcontains $groupToExclude.DistinguishedName}).Count

这假定域中只有一个组名为 Accounts_to_Keep。如果不能保证这一点,您可以将该组的 objectGUIDobjectSid 传递给 Get-ADGroup 来检索该组,而不是它的名称,而不会产生歧义。