当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 在学习 AD 的同时掌握 PowerShell 中的 LDAP 过滤器

作者:精品下载站 日期:2024-12-14 13:18:05 浏览:12 分类:玩电脑

在学习 AD 的同时掌握 PowerShell 中的 LDAP 过滤器


使用 PowerShell 查询 Active Directory 时最常见的问题之一是如何正确构建过滤器语法。所有 ActiveDirectory PowerShell 模块 cmdlet 上的Filter 和 LDAP Filter 参数对许多人来说都是一个黑匣子。

在这篇博文中,我们将深入了解如何使用 Active Directory 过滤器。我希望在这篇文章结束时,您将不再尝试使用 Where-Object 和过滤器!

先决条件

对于我要向您展示的任何代码,我将假设以下几点:

  • 您已安装 PowerShell ActiveDirectory 模块
  • 您使用的是已加入域的计算机
  • 您可以成功连接并验证 AD 域控制器

使用许多 Active Directory cmdlet 搜索对象时,可以使用两种不同的筛选器语言:PowerShell 筛选器和 LDAP 筛选器。

PowerShell 过滤器

PowerShell 筛选器使用标准 PowerShell 表达式语法。这通常称为 Active Directory 搜索过滤器语法。

这些过滤器与 Filter 参数一起使用。 Filter 参数语法

运营商

在为 Filter 参数构建过滤器时,您需要至少使用一个运算符。这里使用的运算符是您在使用像 Where-Object 这样的命令时可能会用到的熟悉的运算符。

Filter 参数内部,您可以使用以下运算符。

-eq

等于

-le

小于或等于

-ge

大于或等于

-ne

不等于

-lt

少于

-gt

比...更棒

-approx

约等于

-bor

按位或

-band

按位与

-recursivematch

递归匹配

-like

喜欢

-notlike

不喜欢

-and

布尔与

-or

布尔或

-not

布尔非

参考 AD 对象属性

在过滤器内部,您将使用运算符比较各种 AD 对象属性。例如,Get-AdUser cmdlet 返回 Name 属性。如果您想查找与特定名称匹配的所有用户,您可以使用:

PS51> Get-Aduser -Filter "Name -eq 'Adam Bertram'"

属性名称可以是随 AD cmdlet 返回的属性的名称或 LDAP 筛选器名称。

属性值通常用单引号或双引号括起来。唯一接受的通配符是星号 (*)。您可以在上面看到过滤器被双引号包围,而 Adam Bertram 被单引号包围。

在过滤器中使用某些字符时必须进行“转义”。这些都是:

CharacterEscaped AsNotes“`”Only required if the data is enclosed in double quotes.‘\’Only required if the data is enclosed in single quotes.NUL\00This is a standard LDAP escape sequence.\\5cThis is a standard LDAP escape sequence.*\2aAutomatically escaped. Only in -eq and -ne comparisons. You should use -like and -notlike operators for wildcard comparison.(/28Automatically escaped.)/29Automatically escaped.//2fAutomatically escaped.

什么是 Active Directory LDAP?

LDAP(即轻量级目录访问协议)是一种与供应商无关的协议,用于访问和修改目录数据。当听到目录这个词时,您可能会想到电话簿,但在 Active Directory 的上下文中,这意味着更多。许多不同的对象类型都通过 Active Directory 进行存储和访问,LDAP 协议作为访问该数据的一种方式。

由于 Active Directory 可以存储许多不同的数据类型,因此应用程序和用户需要一种轻松查询该目录的方法。请继续阅读以了解 LDAP 过滤器如何协助过滤该数据!

LDAP 过滤器

Active Directory 实现了 LDAP,即轻量级目录访问协议。通过将 LDAPFilter 参数与 cmdlet 结合使用,您可以使用 LDAP 过滤器,例如在 Active Directory 用户和计算机中创建的过滤器。

LDAP 过滤器的语法在 RFC 编号 4515 中定义。

每个过滤规则都用括号 ( ) 括起来。可以通过将组括在括号中并包含以下比较器来对过滤规则进行分组:

&

|

或者

!

不是

LDAP 过滤器还有一个特殊的匹配规则对象标识符(OID):

1.2.840.113556.1.4.803

按位与

1.2.840.113556.1.4.804

按位或

1.2.840.113556.1.4.1941

链匹配(用于专有名称属性)

有四种过滤器类型:

=

等于

~=

约等于

>=

大于或等于

<=

小于或等于

有四种项目类型:

=

简单的

=*

展示

=something*

子串

Extensible

因类型而异

LDAP 过滤器规则必须与属性的 LDAP 名称一起使用,并且如果在 LDAP 过滤器中使用某些字符值,则必须对其进行“转义”。这些都是:

*

\2a

(

\28

)

\29

\

\5c

NUL

\00

用于比较的属性值通常不需要用引号引起来。

LDAP 过滤器示例

构建 LDAP 过滤器可能具有挑战性。以下是一些使用活动目录组过滤器的示例,您可以将其用作开始创建自己的过滤器的基础。

  • 所有名称为“专业服务部”(cn) 的团体

    'cn -eq "专业服务部门"' 或 `'(cn=专业服务部门)'

  • 所有名称为“专业服务部门”且描述为“实时”的群组

    '(cn -eq "专业服务部") -and (description -eq "Live")''(&(cn=专业服务部)(description=Live))'

  • 所有名称为“专业服务部门”或“所有部门共享访问权限”的团体

    '(cn -eq "专业服务部门") - 或 (cn -eq "所有部门共享访问权限")''(|(cn=专业服务部门)(cn=全部部门共享访问))'

  • 所有团体都没有“Live”的描述。 包括那些根本没有描述字段的内容

    '(!(description=Live))'

  • 所有团体都没有“Live”的描述。 排除那些根本没有描述字段的内容

    '描述-ne“Live”'

  • 所有描述为“Live”但名称不为“Professional Services Department”的团体

    '(description -eq "Live") -and (cn -ne "专业服务部")''(&(description=Live)(!(cn=专业服务部) ))'

  • 描述为“\\fileserver1\fileshare”的所有组

    'description -eq "ccfileserver1cfileshare"''(description=ccfileserver1cfileshare)'

使用 RecursiveMatch 或链匹配

使用匹配规则 OID 或 RecursiveMatch 参数是解决有关查询 AD 的常见问题的有效方法:“我怎样才能知道用户所属的所有组,直接还是间接?' 您可以使用 Active Directory 搜索过滤器 memberOf 属性来查找。

使用简单的 LDAP 匹配规则比大型脚本要高效得多。使用我们的示例域domain.local,Kristin Diaz 是专业服务部门安全组的直接成员。查看 AD 中她的 memberOf 属性反映了这一点;仅显示专业服务部门

PS51> Get-ADUser -Identity Kristin.Diaz -Property memberOf

DistinguishedName : CN=Diaz Kristin,OU=Professional Services,OU=All User Accounts,DC=domain,DC=local
Enabled           : True
GivenName         : Kristin
MemberOf          : {CN=Professional Services Department,OU=All Groups,DC=domain,DC=local}
Name              : Diaz Kristin
ObjectClass       : user
ObjectGUID        : 04fe6336-c541-4e71-b7ed-6fee7db23482
SamAccountName    : Kristin.Diaz
SID               : S-1-5-21-447422785-3715515833-3878445295-1186
Surname           : Diaz
UserPrincipalName :

通过使用匹配规则 OID 或 RecursiveMatch 参数,您会发现它们间接是所有部门共享访问的成员。这是因为专业服务部门组是所有部门共享访问的成员。

PS51> Get-ADGroup -LDAPFilter '(member:1.2.840.113556.1.4.1941:=CN=Diaz Kristin,OU=Professional Services,OU=All User Accounts,DC=domain,DC=local)'
PS51> Get-ADGroup -Filter 'member -RecursiveMatch "CN=Diaz Kristin,OU=Professional Services,OU=All User Accounts,DC=domain,DC=local"'

两者都返回以下内容:

DistinguishedName : CN=All Departments Share Access,OU=All Groups,DC=domain,DC=local
GroupCategory     : Security
GroupScope        : Universal
Name              : All Departments Share Access
ObjectClass       : group
ObjectGUID        : 8ac0e0b7-9225-40a4-b168-a0330960e182
SamAccountName    : All Departments Share Access
SID               : S-1-5-21-447422785-3715515833-3878445295-1254

DistinguishedName : CN=Professional Services Department,OU=All Groups,DC=domain,DC=local
GroupCategory     : Security
GroupScope        : Universal
Name              : Professional Services Department
ObjectClass       : group
ObjectGUID        : a8432583-7cac-4e8e-8d94-51e1c5bb1989
SamAccountName    : Professional Services Department
SID               : S-1-5-21-447422785-3715515833-3878445295-1255

SearchBase 和 SearchScope 参数

在大型环境中,AD 可以包含数千个对象。提高性能并减少任何查询返回的对象数量的一种方法是确定搜索范围。

SearchBase 参数确定 AD 层次结构中任何搜索的开始位置。使用 cmdlet 时,这是一个可分辨名称的字符串表示形式(默认情况下是域的“顶部”)。 SearchScope 也分为三个级别:

  1. Base - 已指定为 SearchBase 的对象。
  2. OneLevel - 搜索立即包含在 SearchBase 中但不在任何子容器中的对象。
  3. SubTree - 在 AD 层次结构中递归地向下搜索 SearchBase 和任何子容器中包含的对象。

在上面的示例中,将 SearchBase 设置为 OU=All User Accounts,DC=domain,DC=localSearchScopeBase 将尝试查询 OU 对象本身,OneLevelSearchScope 将仅搜索所有用户帐户 OU,而 SearchScope 则仅搜索 OU 对象。 SubTree 的 将搜索“所有用户帐户”和“专业服务”OU。

概括

您现在应该很好地了解如何使用 Active Directory PowerShell cmdlet 进行过滤。您可以看到,构建完美的过滤器语法需要做很多工作。构建适当的过滤器比使用 Where-Object cmdlet 要困难得多。

但花时间学习过滤 AD 对象的“正确”方法,并获得出色性能和效率的回报!

进一步阅读

  • 32 个 Active Directory 脚本可实现一切自动化
  • TechNet 上的 LDAP 语法过滤器

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯