在 PowerShell 中执行 LDAP 查询

Marion Paul Kenneth Mendoza 2023年1月30日 2022年5月16日
  1. 在 PowerShell 中安装 Active Directory 模块
  2. 为 PowerShell 过滤器使用 Filter 参数
  3. 在 PowerShell 中为 LDAP 过滤器使用 -LDAPFilter 参数
在 PowerShell 中执行 LDAP 查询

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

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

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

在 PowerShell 中安装 Active Directory 模块

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

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

通常,运行命令 Install-Module 应该从远程 CDN 获取软件包并将其安装在你的计算机上。尽管如此,对于 Active Directory 模块,我们必须建立一个先决条件包才能成功。

我们需要安装的必备包是 `RSAT 或 Remote Server Administration Tools。

你可以运行下面的 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 中为 LDAP 过滤器使用 -LDAPFilter 参数

轻量级目录访问协议 (LDAP) 是一种与供应商无关的协议,用于访问和修改目录数据。

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

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

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

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

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

  • 所有名称 (CN) 为 Department 的组。
`'(cn=Department)'
  • 名称为 Department 且描述为 Prod 的所有组。
'(&(cn=Department)(description=Prod))'
  • 名称为部门共享访问的所有组。
'(|(cn=Professional Services Department)(cn=Share Access))'
  • 所有组都没有 Prod 的描述。包括根本没有描述字段的那些。
'(!(description=Prod))'
  • 所有带有 Prod 描述但不带有 Department 名称的组。
'(&(description=Prod)(!(cn=Department)))'
  • 描述为 \\fileserver1\share 的所有组。
'(description=\5c\5cfileserver1\5cshare)'
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