0

我正在努力从 Active Directory 中获取非活动用户列表,Search-ADAccount然后通过管道将其传输到,Get-ADUser以便我可以使用 whereMemberOf不包含该组"Accounts_to_Keep"。我相信我可以使用正确的数字 ( 379) 和完整的 DN 字符串。但是,如果组移动,我想使用-match-like仅使用组的名称。它返回的数字不一样。

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

从字符串中删除完整的 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
4

2 回答 2

1

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

'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*') }
于 2019-12-23T21:33:51.353 回答
1

我认为测试专有名称-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。如果不能保证这一点,您可以传递该组的名称,而不是其名称,objectGUID或者毫无歧义objectSidGet-ADGroup检索该确切的组。

于 2019-12-23T22:43:46.667 回答