如何在 PowerShell Active Directory 过滤器中转义 \ 反斜杠字符

How to Escape \ backslash character in PowerShell Active Directory filter

我正在尝试过滤 Active Directory 中信息字段中有 UNC 的组,但很难找到如何转义 UNZ 路径中的反斜杠字符。以下 returns 没有结果:

Get-ADGroup -filter 'Info -like "*\server\share*"' -Properties Name,Info | Select Name,Info

而以下确实 return 一些结果,但如果两组具有相似的 UNC 路径,则结果将不准确:

Get-ADGroup -filter 'Info -like "*server*share*"' -Properties Name,Info | Select Name,Info

我试过使用 c\u5c[char]0x25 `u{5c}*\\server\path**`\`\server`\path* 都没有成功,并且有 运行 个想法和搜索结果可供尝试。

请帮忙!

使用 -LDAPFilter 参数,然后将所有文字反斜杠替换为转义序列 C:

Get-ADObject -LDAPFilter '(info=*CCserverCshare*)'

您可以编写一个通用函数来处理转义字符串值:

function ConvertTo-LDAPFilterString
{
  param(
    [string]$Value
  )

  $charsToEscape = "\*()`0".ToCharArray()

  foreach($char in $charsToEscape){
    $escapeSequence = '\{0:X2}' -f +$char
    $Value = $Value.Replace("$char", $escapeSequence)
  }

  return $Value
}

现在你可以做:

$escapedPath = ConvertTo-LDAPFilterString '\server\share'
Get-ADObject -LDAPFilter "(info=*$escapedPath*)"

至于为什么也就是说,它不是Active Directory特有的,而是LDAPv3设计的一部分。

RFC 4515 § 3 描述了 LDAPv3 过滤器字符串的正确语法,其中包括称为“value-encoding 规则”的内容:

[...] the octets that represent the ASCII characters "*" (ASCII 0x2a), "(" (ASCII 0x28), ")" (ASCII 0x29), "\" (ASCII 0x5c), and NUL (ASCII 0x00) are represented as a backslash "\" (ASCII 0x5c) followed by the two hexadecimal digits representing the value of the encoded octet.

这种狭窄而独特的编码规则的原因是允许 明确 forward-only 解析过滤器字符串 - \ 在 a 的值部分子句是 always fixed-length 转义序列的开始,因为文字 \also 被编码为 fixed-width转义序列:)