如何在 PowerShell 中执行 LDAP 查询

  1. 在 PowerShell 中安装 Active Directory 模块
  2. 使用 PowerShell 过滤器的 Filter 参数
  3. 在 PowerShell 中使用 -LDAPFilter 参数进行 LDAP 过滤器
如何在 PowerShell 中执行 LDAP 查询

在使用 PowerShell 查询 Active Directory 时,最常见的挑战之一是如何正确构建过滤器语法。

不幸的是,所有 Active Directory PowerShell 模块的 cmdlet 上的 Filter 和 LDAP Filter 参数对许多人来说都是一个黑匣子。

本文将深入探讨如何使用 Active Directory 过滤器和 LDAP 过滤器。

在 PowerShell 中安装 Active Directory 模块

在继续之前,需要一些先决条件。

  • 安装 PowerShell Active Directory 模块。
  • 加入域的计算机。
  • 成功连接并验证 Active Directory 域控制器。

通常,运行 Install-Module 命令应从远程 CDN 获取软件包并安装到您的计算机上。但是,对于 Active Directory 模块,我们必须建立一个先决条件包才能成功。

我们需要安装的先决条件包是 RSAT 或者 远程服务器管理工具

您可以运行下面的 PowerShell 脚本在您的计算机或服务器上安装 RSAT

在 Windows 10 上安装 RSAT:

Add-WindowsCapability -Name Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0 -Online

在 Windows Server(从 2008 到 2016 的多个版本)上安装远程服务器管理工具:

Install-WindowsFeature -Name "RSAT-AD-PowerShell" -IncludeAllSubFeature

在您的计算机上安装远程服务器管理工具功能也将安装 Windows PowerShell 的 Active Directory 模块。

使用 PowerShell 过滤器的 Filter 参数

PowerShell 过滤器使用标准的 Windows PowerShell 表达式语法。这种方法通常被称为 Active Directory 搜索过滤器语法。

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

在过滤器内部,您将使用运算符比较各种 AD 对象属性。例如,Get-ADUser 命令返回一个 Name 属性。

因此,如果我们想要查找所有匹配特定名称的用户,您将使用:

Get-ADUser -Filter "Name -eq 'John'"

属性名称可以是 LDAP 名称或通过 Active Directory cmdlet 返回的属性的规范名称。

属性值通常用单引号或双引号括起来。唯一接受的通配符是星号 *

我们可以看到,上面用双引号括起来了过滤器,而 John 被单引号括起来。

在 PowerShell 中使用 -LDAPFilter 参数进行 LDAP 过滤器

轻量目录访问协议(Lightweight Directory Access Protocol,LDAP)是一种用于访问和修改目录数据的厂商中立协议。

当听到“目录”一词时,我们可能会想到一本电话簿,但在 Active Directory 的上下文中,这意味着更多。

Active Directory 存储并使许多不同类型的对象可访问,LDAP 协议用于保护这些数据。由于 Active Directory 可以存储许多不同的数据类型,应用程序和用户需要轻松查询该目录。

Active Directory 实现了 LDAP,即轻量目录访问协议。使用 cmdlet 的 -LDAPFilter 参数使您能够使用 LDAP 过滤器,例如在 Active Directory 用户和计算机中创建的那些过滤器。

LDAP 搜索过滤器的语法在 RFC 编号 4515 中定义。每个过滤器规则用括号 () 括起来。

以下是一些使用 Active Directory 组过滤器作为基础的示例,以开始创建您自己的过滤器。

  • 名称 (CN) 为 Department 的所有组。
`'(cn=Department)'
  • 名称为 Department 并且描述为 Prod 的所有组。
'(&(cn=Department)(description=Prod))'
  • 名称为 DepartmentShare Access 的所有组。
'(|(cn=Professional Services Department)(cn=Share Access))'
  • 所有组的描述不是 Prod。包括那些没有描述字段的组。
'(!(description=Prod))'
  • 描述为 Prod 但名称不是 Department 的所有组。
'(&(description=Prod)(!(cn=Department)))'
  • 描述为 \\fileserver1\share 的所有组。
'(description=\5c\5cfileserver1\5cshare)'
Enjoying our tutorials? Subscribe to DelftStack on YouTube to support us in creating more high-quality video guides. Subscribe
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn