我需要根据其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结果进行过滤
答案 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