如何在 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转义序列:)
我正在尝试过滤 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转义序列:)