Invoke-Command远程获取证书FriendlyName与本地执行结果不一致
PowerShell远程调用无法获取证书FriendlyName的解决方法
问题原因
通过Invoke-Command远程获取证书对象时,PowerShell会将对象序列化后传回本地。证书的FriendlyName属于扩展属性,并非默认序列化的核心属性,反序列化后本地无法正确读取该值,导致输出空行;而本地直接执行时访问的是实时证书对象,能正常获取所有属性。
解决方案
方案1:在远程脚本块中直接提取FriendlyName
直接在远程端将FriendlyName提取为字符串返回,避免对象序列化带来的属性丢失:
$certFriendlyNames = Invoke-Command -ComputerName $computername -ScriptBlock { Get-ChildItem Cert:\LocalMachine\My | Select-Object -ExpandProperty FriendlyName } foreach ($name in $certFriendlyNames) { $name }
方案2:远程返回包含所需属性的自定义对象
如果需要同时获取其他证书属性,在远程脚本块中通过Select-Object指定需要的属性,返回自定义对象,确保序列化后本地能正确读取:
$certificates = Invoke-Command -ComputerName $computername -ScriptBlock { Get-ChildItem Cert:\LocalMachine\My | Select-Object FriendlyName, Thumbprint, Subject } foreach ($certificate in $certificates) { $certificate.FriendlyName }
方案3:强制刷新远程证书存储(针对刚添加的证书)
如果怀疑是远程证书存储未刷新导致友好名称未同步,可在远程脚本块中手动刷新证书存储后再获取:
$certificates = Invoke-Command -ComputerName $computername -ScriptBlock { $store = New-Object System.Security.Cryptography.X509Certificates.X509Store("My", "LocalMachine") $store.Open([System.Security.Cryptography.X509Certificates.OpenFlags]::ReadOnly) $certs = $store.Certificates $store.Close() $certs | Select-Object FriendlyName, Thumbprint } foreach ($certificate in $certificates) { $certificate.FriendlyName }
内容的提问来源于stack exchange,提问作者brettkanker
相关产品推荐
相关产品推荐

