使用 PowerShell 查询 AD 以匹配二进制数据
Query AD using PowerShell to match binary data
我是一个 PowerShell 新手,事实上非常非常新手。我有一个任务我无法执行,除非使用 PowerShell(我不想证明为什么,相信我,我不想讨论其他方法)。
这是我的问题。我需要在 Active Directory 中查询匹配记录,以寻找 16 字节二进制字段(在我们的安装中称为 netbootGUID)的相等性。目标是确保在添加新记录之前不存在具有相同 netbootGUID 的其他记录(不,他们无法在数据库级别强制执行该策略,我无法从墙的一侧对此进行控制)。
作为向最终解决方案发展的测试,我正在做的事情是,我正在获取记录,选择它的 netbootGUID,然后使用我刚刚选择的 netbootGUID 查询回 AD,以测试肯定的答案。
下面是一个旨在执行此操作的代码片段:
$value = Get-ADComputer -Server $myADserver -SearchBase "CN=Computers,$baseDN" -Filter 'Name -eq "an_existing_computer"' -Credential $credentials -Properties netbootGUID
$guid = $value.netbootGUID
Get-ADComputer -Server $myADserver -SearchBase "CN=Computers,$baseDN" -Filter "netbootGUID -eq $guid" -Credential $credentials -Properties Name
当我对之前获得的 netbootGUID 值执行搜索时,我没有获得值,而是收到一条错误消息:
Get-ADComputer : Erreur lors de l’analyse de la requête: «netbootGUID -eq 198 132 111 6 121 119 69 126 168 146 101 129 136 20 157 221» Message d’erreur: «syntax error» à la position: «21».
Au caractère C:\Users\Administrator\Documents\Tests PowerShell\netbootGUID_AD_Caisses.ps1:42 : 1
+ Get-ADComputer -Server $serveurAD -SearchBase "CN=Computers,$baseDN" -Filter "ne ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ParserError: (:) [Get-ADComputer], ADFilterParsingException
+ FullyQualifiedErrorId : ActiveDirectoryCmdlet:Microsoft.ActiveDirectory.Management.ADFilterParsingExeption,Microsoft.ActiveDirectory.Management.Commands.GetADComputer
对于法语错误消息,我深表歉意,我不知道如何切换到英语。
似乎说作为 $guid 传递的 16 字节二进制值被解释为字符串而不是数组或类似的东西。我可能需要 "cast" 一些东西或明确类型。
谁能帮我解决这个问题?
您必须为此使用原始 LDAP 查询过滤器。使用 LDAP 进行二进制数据搜索时要记住两件事:
- 二进制过滤器必须匹配精确值(不能部分或通配符搜索)
- 每个字节需要转为十六进制并加上前缀
\
考虑到这一点,我们需要一个看起来像这样的过滤器:
(netboodGUID=\C6FE\A8D\DD)
从一个字节数组开始,你可以这样做:
$guidBinaryString = @($guid|ForEach-Object { '\{0:X2}' -f $_ }) -join ''
$LDAPFilter = "(netboodGUID=$guidBinaryString)"
Get-ADComputer -LDAPFilter $LDAPFilter -Server $myADserver -SearchBase "CN=Computers,$baseDN" -Credential $credentials -Properties Name
我是一个 PowerShell 新手,事实上非常非常新手。我有一个任务我无法执行,除非使用 PowerShell(我不想证明为什么,相信我,我不想讨论其他方法)。
这是我的问题。我需要在 Active Directory 中查询匹配记录,以寻找 16 字节二进制字段(在我们的安装中称为 netbootGUID)的相等性。目标是确保在添加新记录之前不存在具有相同 netbootGUID 的其他记录(不,他们无法在数据库级别强制执行该策略,我无法从墙的一侧对此进行控制)。
作为向最终解决方案发展的测试,我正在做的事情是,我正在获取记录,选择它的 netbootGUID,然后使用我刚刚选择的 netbootGUID 查询回 AD,以测试肯定的答案。
下面是一个旨在执行此操作的代码片段:
$value = Get-ADComputer -Server $myADserver -SearchBase "CN=Computers,$baseDN" -Filter 'Name -eq "an_existing_computer"' -Credential $credentials -Properties netbootGUID
$guid = $value.netbootGUID
Get-ADComputer -Server $myADserver -SearchBase "CN=Computers,$baseDN" -Filter "netbootGUID -eq $guid" -Credential $credentials -Properties Name
当我对之前获得的 netbootGUID 值执行搜索时,我没有获得值,而是收到一条错误消息:
Get-ADComputer : Erreur lors de l’analyse de la requête: «netbootGUID -eq 198 132 111 6 121 119 69 126 168 146 101 129 136 20 157 221» Message d’erreur: «syntax error» à la position: «21».
Au caractère C:\Users\Administrator\Documents\Tests PowerShell\netbootGUID_AD_Caisses.ps1:42 : 1
+ Get-ADComputer -Server $serveurAD -SearchBase "CN=Computers,$baseDN" -Filter "ne ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ParserError: (:) [Get-ADComputer], ADFilterParsingException
+ FullyQualifiedErrorId : ActiveDirectoryCmdlet:Microsoft.ActiveDirectory.Management.ADFilterParsingExeption,Microsoft.ActiveDirectory.Management.Commands.GetADComputer
对于法语错误消息,我深表歉意,我不知道如何切换到英语。
似乎说作为 $guid 传递的 16 字节二进制值被解释为字符串而不是数组或类似的东西。我可能需要 "cast" 一些东西或明确类型。
谁能帮我解决这个问题?
您必须为此使用原始 LDAP 查询过滤器。使用 LDAP 进行二进制数据搜索时要记住两件事:
- 二进制过滤器必须匹配精确值(不能部分或通配符搜索)
- 每个字节需要转为十六进制并加上前缀
\
考虑到这一点,我们需要一个看起来像这样的过滤器:
(netboodGUID=\C6FE\A8D\DD)
从一个字节数组开始,你可以这样做:
$guidBinaryString = @($guid|ForEach-Object { '\{0:X2}' -f $_ }) -join ''
$LDAPFilter = "(netboodGUID=$guidBinaryString)"
Get-ADComputer -LDAPFilter $LDAPFilter -Server $myADserver -SearchBase "CN=Computers,$baseDN" -Credential $credentials -Properties Name