Powershell 基于多个uac状态筛选用户

Powershell 基于多个uac状态筛选用户,powershell,filter,active-directory,Powershell,Filter,Active Directory,我需要根据我的active directory用户的UAC状态筛选他们。我希望通过在数组中搜索预定义的值数组来实现这一点。 无论我如何使用大括号(curley或regular),我总是从powershell中得到错误 这是我的剧本。你能看出我做错了什么吗 $uac = "512", "544", "66048", "66080" Get-ADUser -Properties * -SearchBase "DC=domain,DC=com" -Filter $uac.IndexOf(userA

我需要根据我的active directory用户的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

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

您当前问题的答案是您在
-gt
之后遗漏了一些内容。您可能想要
-1
?(但正如马蒂亚斯指出的那样,即使这样也行不通)

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

简而言之,为了避免在列表中添加越来越多的数字,您需要执行以下操作:

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

该属性是位标志。位标志是数字,其中二进制数中的每个数字都是一个表示某种意义的标志。禁用标志是第二个数字(从右侧开始)。例如,514是二进制的:

10万0010

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

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

10万0000

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

要使用Active Directory执行此操作,请使用以下LDAP筛选器:

(!userAccountControl:1.2.840.113556.1.4.803:=2)

这个奇怪的数字就是所谓的匹配规则。我们使用
2
,因为它是二进制的
10
(第二位)。因为我们的查询有
表示“如果第二位未设置”。

您的直接问题的答案是您在
-gt
之后缺少了一些内容。您可能想要
-1
?(但正如马蒂亚斯指出的那样,即使这样也行不通)

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

简而言之,为了避免在列表中添加越来越多的数字,您需要执行以下操作:

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

该属性是位标志。位标志是数字,其中二进制数中的每个数字都是一个表示某种意义的标志。禁用标志是第二个数字(从右侧开始)。例如,514是二进制的:

10万0010

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

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

10万0000

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

要使用Active Directory执行此操作,请使用以下LDAP筛选器:

(!userAccountControl:1.2.840.113556.1.4.803:=2)

这个奇怪的数字就是所谓的匹配规则。我们使用
2
,因为它是二进制的
10
(第二位)。因为我们的查询有
表示:“如果未设置第二位”。

Get ADUser-Filter
不支持针对每个目录对象运行任意代码(如
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

Get ADUser-Filter
不支持对每个目录对象运行任意代码(如
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

那么您想返回
userAccountControl
具有这4个精确值之一的任何用户吗?或者您想将它们用作位掩码筛选器?是的,我想返回该数组中具有uac值的所有用户,谢谢!那么您想返回
userAccountControl
具有这4个精确值之一的任何用户吗?或者您想将它们用作位掩码筛选器?是的,我想返回该数组中具有uac值的所有用户,谢谢!