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 文件(如果需要,可以使用 certutilopenssl 轻松切换到 PEM)。我最初的想法是从提取的 Base64 值构建一个 PEM 格式的 CRL 文件,但我看得太远了...

我将 Mathias 的回答作为答案,因为他实际上最好地回答了我的问题;最后我没有说明我想要一个 CRL 文件。