Powershell -比如,子数组中的-匹配

Powershell -比如,子数组中的-匹配,powershell,active-directory,operators,contains,group-membership,Powershell,Active Directory,Operators,Contains,Group Membership,我正在使用Search ADAccount从Active Directory获取非活动用户列表,然后将其传送到Get ADUser,这样我就可以在MemberOf不包含组“Accounts\u to\u Keep”的地方使用。我相信我已经使用了正确的数字(379)和完整的DN字符串。但是,如果组移动,我想使用-match或-like来使用组名。它返回的数字不相同 如果我使用MemberOf对单个用户单独执行此操作,它只会过滤掉一个组,并返回用户拥有的另一个组,因此我认为这就是为什么我的-包含的。

我正在使用
Search ADAccount
从Active Directory获取非活动用户列表,然后将其传送到
Get ADUser
,这样我就可以在
MemberOf
不包含组
“Accounts\u to\u Keep”
的地方使用。我相信我已经使用了正确的数字(
379
)和完整的DN字符串。但是,如果组移动,我想使用
-match
-like
来使用组名。它返回的数字不相同

如果我使用
MemberOf
对单个用户单独执行此操作,它只会过滤掉一个组,并返回用户拥有的另一个组,因此我认为这就是为什么我的
-包含的
。有没有一种方法可以对子阵列使用
-like
-match
,而不用
foreach
自己对其进行匹配

已从字符串中删除完整DN

PS>$InactiveAll.Count
488
PS>($InactiveAll |其中{-not$\.memberof.contains(“CN=Accounts\u to\u Keep,OU=DC”)))计数
379
PS>($InactiveAll |其中{$\.memberof-notlike“*Accounts\u To_keep*”).Count
427
PS>($InactiveAll |其中{-not$\.memberof-contains(“CN=Accounts\u to\u Keep,OU=DC”))
61
PS>($InactiveAll |其中{-not($\.memberof-contains(“CN=Accounts\u to\u Keep,OU=DC”))))计数
379
PS>($InactiveAll |其中{$\.memberof-notmatch“Accounts_To_Keep”})。计数
427

-like和-notlike使用通配符,
“*”
。此外,在组数组上使用-notlike和-notmatch与在单个元素上使用它们的结果不同。我想你需要研究一下这些操作员的工作。任何结果都将在where对象中计算为“true”

'group1','group2','group3' -notmatch 'group1'
group2
group3


'group1','group2','group3' -notlike '*group1*'
group2
group3
以下是一种在字符串数组中搜索子字符串的方法:

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


-like和-notlike使用通配符,
“*”
。此外,在组数组上使用-notlike和-notmatch与在单个元素上使用它们的结果不同。我想你需要研究一下这些操作员的工作。任何结果都将在where对象中计算为“true”

'group1','group2','group3' -notmatch 'group1'
group2
group3


'group1','group2','group3' -notlike '*group1*'
group2
group3
以下是一种在字符串数组中搜索子字符串的方法:

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


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

这段代码可能有点不对劲,因为我前面没有一个目录可供测试,但如果您想将该组的成员排除在任何可能存在的位置,我认为您应该让Active directory处理查找该组的操作

$groupToExclude=Get ADGroup-Identity“Accounts\u to\u Keep”
…然后,您可以将可分辨名称作为一个整体进行匹配,而不是匹配可分辨名称子字符串

($InactiveAll |其中{$\.MemberOf-notcontains$groupToExclude.discrimitedName})。计数

这假设域中只有一个名为
Accounts\u的组要保留。如果不能保证这一点,您可以将该组的
objectGUID
objectSid
传递给
获取ADGroup
,以无歧义地检索该确切的组。

我不认为
-match
在测试区分名称方面比
-like
有任何优势,因为在这种情况下,您知道,
'CN=Accounts\u to\u Keep'
将按名称标识所需的组。不要忘记,
-notcontains
的存在是为了简化代码

这段代码可能有点不对劲,因为我前面没有一个目录可供测试,但如果您想将该组的成员排除在任何可能存在的位置,我认为您应该让Active directory处理查找该组的操作

$groupToExclude=Get ADGroup-Identity“Accounts\u to\u Keep”
…然后,您可以将可分辨名称作为一个整体进行匹配,而不是匹配可分辨名称子字符串

($InactiveAll |其中{$\.MemberOf-notcontains$groupToExclude.discrimitedName})。计数

这假设域中只有一个名为
Accounts\u的组要保留。如果不能保证这一点,您可以将该组的
objectGUID
objectSid
传递给
Get-ADGroup
,而不是它的名称,以无歧义地检索该组。

首先从AD获取该组很好,我只是不想硬编码。这解决了这两个问题。谢谢。这是一个很好的观点,首先从广告中抓取这群人。我只是不想硬编码。这解决了这两个问题。非常感谢。