You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求协助排查PowerShell删除过期证书脚本的Invoke-Command报错

问题排查与解决

核心错误原因

  1. 文件类型误用:你通过Get-Content读取的Test.pfx是证书二进制文件,并非存储服务器名称的纯文本文件。读取二进制文件会得到乱码或无效内容,导致$ListOfServer中没有有效服务器名,最终$Server为空,触发ComputerName参数不能为空的校验错误。
  2. 参数调用错误:报错信息显示你实际运行的脚本中使用了-ComputerName $Server.Name,但如果$Server是字符串类型的服务器名,它不存在.Name属性,$Server.Name会返回$null,同样会导致参数为空的报错。

修复步骤

步骤1:修正服务器列表文件

  • 确保服务器列表存储在纯文本文件(如Servers.txt)中,每行填写一个服务器名称,示例格式:
    Server01
    Server02
    DC01
    
  • 修改脚本中的文件路径为正确的文本文件路径:
    $ListOfServer = Get-Content "C:\Temp\expired_certs\Servers.txt"
    

步骤2:修正ComputerName参数

  • 若服务器列表是纯文本每行一个名称,$Server即为字符串类型的服务器名,直接使用$Server作为参数值,不要添加.Name:
    Invoke-Command -ComputerName $Server -ScriptBlock {
        # 原有证书处理逻辑不变
    }
    

步骤3:添加空值校验(可选但推荐)

在循环中加入空值判断,跳过无效的服务器条目,避免重复触发错误:

$ListOfServer = Get-Content "C:\Temp\expired_certs\Servers.txt"
# 过滤空行和空白字符
$ListOfServer = $ListOfServer | Where-Object { $_ -match '\S' }

Foreach($Server in $ListOfServer) {
    if([string]::IsNullOrWhiteSpace($Server)) { continue }
    Invoke-Command -ComputerName $Server -ScriptBlock {
        $Certs = Get-ChildItem "Cert:\LocalMachine\My" -Recurse
        Foreach($Cert in $Certs) {
            If($Cert.NotAfter -lt (Get-Date)) {
                # 添加-Force参数避免删除时弹出确认提示
                $Cert | Remove-Item -Force
            }
        }
    }
}

步骤4:额外优化建议

  • 删除证书时添加-Force参数,避免交互确认提示;
  • 增加日志输出,记录删除的证书信息,方便后续排查:
    Invoke-Command -ComputerName $Server -ScriptBlock {
        $Certs = Get-ChildItem "Cert:\LocalMachine\My" -Recurse
        Foreach($Cert in $Certs) {
            If($Cert.NotAfter -lt (Get-Date)) {
                Write-Host "已删除过期证书:$($Cert.Subject),过期时间:$($Cert.NotAfter)"
                $Cert | Remove-Item -Force
            }
        }
    }
    

内容的提问来源于stack exchange,提问作者Krissy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 21:12:48