PowerShell 脚本应该查找不在特定 OU 中的已禁用用户,并输出该 OU 中的用户

PowerShell 脚本应该查找不在特定 OU 中的已禁用用户,并输出该 OU 中的用户

嘿,我这里有这个 cmdlet:

Get-ADUser -filter {(distinguishedName -notlike "Disabled Users") -and (enabled -eq $false)} -searchBase "ou=FirstOU,dc=domain,dc=com"

我建立它是为了查找不在“禁用用户”OU 中的禁用用户。(OU 内的 OU)

但由于某种原因,它不仅返回不在“禁用用户”中的禁用用户,还返回其中的禁用用户。

为啥不起作用(distinguishedName -notlike "Disabled Users")

为了使我的结构清晰:

Forest
    FirstOU
       users,groups,etc..
       Disabled Users OU
.
.
.

答案1

括号和通配符。尝试

PS C:\Users\BigHomie> Get-ADUser -SearchBase "OU=Users,dc=eng,dc=mit,dc=edu" -SearchScope Subtree -Filter {distinguishedname -notlike "*Disabled*"}

找到了正确的语法这里

答案2

过滤器作用于您尝试检索的对象类型,在本例中为用户对象。因此,您的查询将返回 dn 不是“已禁用用户”的任何已禁用用户。它将过滤器应用于用户对象,而不是 OU。

是的,当然……正如 BigHomie 正确指出的那样,用户 dn 将包含字符串“Disabled Users”。真正的问题是缺少通配符,因为用户 dn 不会完全是“Disabled Users”

尝试一下这个:

Get-ADUser -Filter  {(Enabled -eq $false)} | ? { ($_.distinguishedname -notlike '*Disabled Users*') }

答案3

您的查询无效,因为DN 属性不支持 LDAP 查询中的通配符匹配(如果没有通配符, -like/-notlike就毫无用处)。

您只需检索所有已禁用的用户,然后从结果中过滤掉不需要的帐户:

$Disabled = Get-ADUser -Filter { useraccountcontrol -bor 2 } -SearchBase "ou=FirstOU,dc=domain,dc=com"
$Filtered = $AllDisabledUsers |Where-Object {$_.distinguishedName -notmatch "OU=Disabled Users"}

{ useraccountcontrol -bor 2 }相当于针对已禁用帐户的“纯” LDAP 过滤器:
(&(useraccountcontrol:1.2.840.113556.1.4.803:=2))

相关内容