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

[玩转系统] 在 Powershell 中使用复杂的 LDAP 过滤器

作者:精品下载站 日期:2024-12-14 07:15:56 浏览:14 分类:玩电脑

在 Powershell 中使用复杂的 LDAP 过滤器


使用 Active Directory 和 Powershell 时,使用 ldap 过滤器是一种以出色的性能搜索目录的好方法。唯一的问题是 ldap 过滤器往往有点难以阅读,有时它们看起来像是括号的抖动,中间有一些神秘的值。

当我编写 ldap 过滤器时,我通常将它们编写为多行缩进文本,例如,假设我想搜索所有已启用且未设置为过期的用户(不是联系人或计算机)。在 powershell 脚本中,如下所示:

$filter = '(&(objectCategory=person)(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(|(accountExpires=0)(accountExpires=9223372036854775807))(userAccountControl:1.2.840.113556.1.4.803:=65536))'

真的不那么容易阅读吗?但是如果我使用此处字符串并将其分成多行并添加缩进:

$filter = @'
(&
    (objectCategory=person)
    (objectClass=user)
    (!
        (userAccountControl:1.2.840.113556.1.4.803:=2)
    )
    (|
        (accountExpires=0)
        (accountExpires=9223372036854775807)
    )
    (userAccountControl:1.2.840.113556.1.4.803:=65536)
)
'@

这可能看起来仍然有点复杂,但更容易阅读。遗憾的是,这种格式不是有效的 ldap 过滤器,因此当我写完过滤器时,我必须删除所有换行符和后面的任何空格。这就是 powershell 和正则表达式真正派上用场的地方。

正则表达式是定义可用于匹配文本部分的文本模式的字符串。 MSDN 上有一个很棒的正则表达式参考。在本例中,我们希望在文本中搜索任何后跟零个或多个空格的换行符,并将任何匹配项替换为空字符串或空字符串。查看参考表,我们可以看到 n 将匹配换行符(换行符),而 s 将匹配任何空白字符(即我们的空格)。还有一个量词 (*),它将匹配前一个元素零次或多次。话虽这么说,“ns*”将匹配任何后跟零个或多个空格的换行符。将这个正则表达式模式的替换添加到我们的此处字符串将使我们的 $filter 变量成为有效的 ldap 过滤器:

$filter = @'
(&
    (objectCategory=person)
    (objectClass=user)
    (!
        (userAccountControl:1.2.840.113556.1.4.803:=2)
    )
    (|
        (accountExpires=0)
        (accountExpires=9223372036854775807)
    )
    (userAccountControl:1.2.840.113556.1.4.803:=65536)
)
'@ -replace 'ns*','

'

当我编写自己的 LDAP 过滤器时,这是一个很棒的小技巧,但当我阅读其他人编写的 LDAP 过滤器时,它就没有多大帮助了。为此,我编写了一个小型 powershell 脚本,它将 ldap 过滤器作为字符串并将其重新格式化为更可读的状态。下面是如何重写上一个示例中的 ldap-filter 的示例:

[玩转系统] 在 Powershell 中使用复杂的 LDAP 过滤器

我在 Technet 画廊发布了该脚本。

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

取消回复欢迎 发表评论:

关灯