Powershell 基于多个uac状态筛选用户
我需要根据我的active directory用户的UAC状态筛选他们。我希望通过在数组中搜索预定义的值数组来实现这一点。 无论我如何使用大括号(curley或regular),我总是从powershell中得到错误 这是我的剧本。你能看出我做错了什么吗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
$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
(第二位)。因为我们的查询有前面的code>表示“如果第二位未设置”。您的直接问题的答案是您在-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
(第二位)。因为我们的查询有前面的code>表示:“如果未设置第二位”。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值的所有用户,谢谢!