Powershell:如何从 SearchResultEntry 对象的属性中获取 base64 值?
Powershell: How to grab base64 value from attribute of SearchResultEntry object?
我的目标是从 LDAP 连接获取 CA 的已发布 CRL。
我有一个搜索 LDAP(不是 Active Directory!)的功能,如预期的那样 returns a System.DirectoryServices.Protocols.SearchResultEntryCollection
。
$results = LDAPsearch "$_LDAP_server`:$_LDAP_searchPort" "cn=$CA,$_LDAP_searchBase" '(&(certificateRevocationList=*))'
ForEach ($element in $results){
$element.Attributes['cn'].GetValues('string')
$element.Attributes['certificateRevocationList;binary'].GetValues('string')
}
上面正确读取了返回的每个元素的 cn
属性值,但是 certificateRevocationList
以一种奇怪的格式返回,完全不符合我期望的 Base64 字符串(例如如果您将数据导出到 LDIF 文件或者如果您使用 Linux ldapsearch 命令,则可以读取一个)...
如何获得实际的 Base64 值?
不幸的是,您只能将 'byte[]' 或 'string' 作为参数传递给 GetValues 方法(这里的 'Base64String' 选项对我很有用,但是...)。
当前输出如下(其中 cn
值正确写入但 certificateRevocationList
不正确):
检索原始 CRL 为 byte[]
,然后自己转换为 base64:
$crlBin = $element.Attributes['certificateRevocationList;binary'].GetValues('byte[]')
$crlB64 = [Convert]::ToBase64String($crlBin)
只需添加我最终使用的选项,就容易多了,因为我的最终目标实际上是将 CRL 保存为文件(并能够解析它):
$crlBin = $element.Attributes['certificateRevocationList;binary'].GetValues('byte[]')[0]
[IO.File]::WriteAllBytes("$_localDir\CRL_$CA.crl",$crlBin)
这会以 DER 格式写入实际的 CRL 文件(如果需要,可以使用 certutil
或 openssl
轻松切换到 PEM)。我最初的想法是从提取的 Base64 值构建一个 PEM 格式的 CRL 文件,但我看得太远了...
我将 Mathias 的回答作为答案,因为他实际上最好地回答了我的问题;最后我没有说明我想要一个 CRL 文件。
我的目标是从 LDAP 连接获取 CA 的已发布 CRL。
我有一个搜索 LDAP(不是 Active Directory!)的功能,如预期的那样 returns a System.DirectoryServices.Protocols.SearchResultEntryCollection
。
$results = LDAPsearch "$_LDAP_server`:$_LDAP_searchPort" "cn=$CA,$_LDAP_searchBase" '(&(certificateRevocationList=*))'
ForEach ($element in $results){
$element.Attributes['cn'].GetValues('string')
$element.Attributes['certificateRevocationList;binary'].GetValues('string')
}
上面正确读取了返回的每个元素的 cn
属性值,但是 certificateRevocationList
以一种奇怪的格式返回,完全不符合我期望的 Base64 字符串(例如如果您将数据导出到 LDIF 文件或者如果您使用 Linux ldapsearch 命令,则可以读取一个)...
如何获得实际的 Base64 值?
不幸的是,您只能将 'byte[]' 或 'string' 作为参数传递给 GetValues 方法(这里的 'Base64String' 选项对我很有用,但是...)。
当前输出如下(其中 cn
值正确写入但 certificateRevocationList
不正确):
检索原始 CRL 为 byte[]
,然后自己转换为 base64:
$crlBin = $element.Attributes['certificateRevocationList;binary'].GetValues('byte[]')
$crlB64 = [Convert]::ToBase64String($crlBin)
只需添加我最终使用的选项,就容易多了,因为我的最终目标实际上是将 CRL 保存为文件(并能够解析它):
$crlBin = $element.Attributes['certificateRevocationList;binary'].GetValues('byte[]')[0]
[IO.File]::WriteAllBytes("$_localDir\CRL_$CA.crl",$crlBin)
这会以 DER 格式写入实际的 CRL 文件(如果需要,可以使用 certutil
或 openssl
轻松切换到 PEM)。我最初的想法是从提取的 Base64 值构建一个 PEM 格式的 CRL 文件,但我看得太远了...
我将 Mathias 的回答作为答案,因为他实际上最好地回答了我的问题;最后我没有说明我想要一个 CRL 文件。