根据多个uac状态过滤用户

时间:2019-10-25 15:42:47

标签: powershell filter active-directory

我需要根据其UAC状态过滤活动目录用户。我想通过在数组中搜索值的预定义数组来实现这一点。 无论我如何调整括号(常规或常规),我都会不断从Powershell中获取错误。

这是我的脚本。你能告诉我我在做什么错吗?

$uac = "512", "544", "66048", "66080"

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

我需要确保以后可以通过diffrenet结果进行过滤

2 个答案:

答案 0 :(得分:1)

您当前的问题的答案是您在-gt之后遗漏了一些东西。您可能要在那里-1? (但正如Mattias指出的那样,这也不行)。

但是有更好的方法可以做到这一点。似乎您正在尝试仅查找已启用的帐户。

简短的答案是,为了避免在列表中添加越来越多的数字,您需要这样做:

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

详细答案

userAccountControl属性是一个位标志。位标记是数字,其中二进制数字中的每个数字都是表示含义的标记。禁用标志是第二个数字(从右开始)。例如,514是二进制形式:

  

10 0000 00 1 0

粗体1表示“已禁用”。但是其他任何数字都可以是1,即使十进制表示形式有所不同,它仍将被禁用。

但是未禁用512,因为未设置该位:

  

10 0000 00 0 0

确定该位是否设置的唯一保证方法是使用按位运算。

要对Active Directory执行此操作,您可以使用以下LDAP过滤器:

(!userAccountControl:1.2.840.113556.1.4.803:=2)

这个奇怪的数字是称为LDAP_MATCHING_RULE_BIT_AND的匹配规则。我们使用2,因为它是二进制文件(第二位)中的10。因为我们的查询前面有!,所以它的意思是:“如果未设置第二位”。

答案 1 :(得分:1)

Get-ADUser -Filter不支持针对每个目录对象运行任意代码(例如IndexOf())。但是,如果您想对Active Directory进行-in样式的查询,那么Get-ADUser在其查询过滤器中使用“幕后花絮”的LDAP具有OR运算符({{1 }),您可以用来一次描述多个条件。

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

|

如果您正在寻找许多单独的值,或者将来想更改它们,我建议您仅使用循环和(|(userAccountControl=512)(userAccountControl=544)(userAccountControl=66048)(userAccountControl=66080)) 字符串格式运算符动态构造LDAP查询过滤器:

-f