根据多个uac状态筛选用户



我需要根据活动目录用户的UAC状态筛选他们。我想通过在数组中搜索预定义的值数组来实现这一点。无论我如何取出牙套(curley或regular(,我都会不断收到powershell的错误。

这是我的剧本。你能说出我做错了什么吗?

$uac = "512", "544", "66048", "66080"
Get-ADUser -Properties *  -SearchBase "DC=domain,DC=com" -Filter $uac.IndexOf(userAccountControl) -gt 0 | Select * |OUT-GRIDVIEW

我需要确保我可以在未来的中通过不同的结果进行过滤

Get-ADUser -Filter不支持对每个目录对象运行arbitrary代码(如IndexOf()(。但是,如果您想对Active Directory执行-in样式的查询,那么LDAP(Get-ADUser在其查询筛选器中使用"后台"(具有OR运算符(|(,您可以使用它来同时描述多个条件。

在您的情况下,生成的查询过滤器必须看起来像这样:

(|(userAccountControl=512)(userAccountControl=544)(userAccountControl=66048)(userAccountControl=66080))

如果您正在寻找许多单独的值,或者将来可能想要更改它们,我建议您只需使用循环和-f字符串格式运算符动态构建LDAP查询过滤器:

# exact values we're looking for any of
$uac = "512", "544", "66048", "66080"
# template strings for the LDAP query filter
$LDAPORTemplate = '(|{0})'
$UACEqualsTemplate = '(useraccountcontrol={0})'
# generate the individual filter clause for each possible UAC value
$clauses = foreach($value in $uac){
$UACEqualsTemplate -f $value
}
# join in a single string
$clauses = $clauses -join ''
# wrap in OR operator
$LDAPQuery = $LDAPORTemplate -f $clauses
Get-ADUser -LDAPFilter $LDAPQUery -Properties * -SearchBase "DC=domain,DC=com" |Select * |Out-GridView

您的直接问题的答案是,在-gt之后您缺少了一些东西。你可能想要-1?(但正如马蒂亚斯所指出的,即使这样也不会奏效(。

但有更好的方法可以做到这一点。您似乎试图只查找已启用的帐户。

简单的答案是,为了避免在你的列表中添加越来越多的数字,你想这样做:

Get-ADUser -Properties * -SearchBase "DC=domain,DC=com" -LDAPFilter "(!userAccountControl:1.2.840.113556.1.4.803:=2)"

答案很长

userAccountControl属性是一个位标志。位标志是指二进制数中的每个数字都是表示某种意义的标志的数字。禁用标志是第二位(从右起(。例如,514是二进制的:

10 0000 0010

粗体1表示"禁用"。但是,任何其他数字都可以是1,即使十进制表示不同,它仍然会被禁用。

但是512没有被禁用,因为该位是而不是集:

10 0000 0000

识别该位是否已设置的唯一有保证的方法是使用逐位操作。

要使用Active Directory做到这一点,您可以使用以下LDAP筛选器:

(!userAccountControl:1.2.840.113556.1.4.803:=2)

这个奇怪的数字就是名为LDAP_matching_rule_BIT_AND的匹配规则。我们使用2,因为它是二进制的10(第二位(。因为我们的查询前面有!,这意味着:"如果第二位没有设置"。

最新更新