PowerShell使用数组存储凭据调用Invoke-Command报错求助
问题诊断与修复方案
核心问题点
- 参数传递逻辑错误:你定义的
install_ninja函数未声明接收凭据参数,调用时传入的单个凭据对象没有被函数接收,函数内部Invoke-Command的-Credential参数直接传入了完整的$local_cred凭据数组,而该参数要求输入单个PSCredential对象,这就是你收到参数转换报错的直接原因。同时PowerShell调用函数无需用括号包裹参数,install_ninja($local_cred[0])属于错误语法,会将参数识别为数组传入。 - 执行命令选择不当:
Invoke-Command默认依赖WinRM服务,普通用户设备大概率未开启本地远程执行权限,即使凭据合法也会执行失败。本地使用指定凭据启动安装程序,直接调用Start-Process的-Credential参数即可,无需使用Invoke-Command。 - 文件校验逻辑不严谨:将MB单位的大小转为整数比对,只要文件大小在33MB~34MB区间都会判定为合法,无法准确校验安装包完整性,建议直接比对字节数或文件哈希。
修复后代码
# 预创建所有本地管理员凭据 $c_user = @("IT", "Power") $credContent = Get-Content C:\Ninja\cred.txt $local_cred = @( New-Object System.Management.Automation.PSCredential $c_user[0], ($credContent[0] | ConvertTo-SecureString -AsPlainText -Force), New-Object System.Management.Automation.PSCredential $c_user[1], ($credContent[1] | ConvertTo-SecureString -AsPlainText -Force), New-Object System.Management.Automation.PSCredential $c_user[0], ($credContent[2] | ConvertTo-SecureString -AsPlainText -Force), New-Object System.Management.Automation.PSCredential $c_user[1], ($credContent[3] | ConvertTo-SecureString -AsPlainText -Force) ) # 定义安装函数,支持传入指定凭据 Function Install-Ninja { param( [Parameter(Mandatory=$true)] [PSCredential]$Credential ) # 直接用指定凭据启动msiexec安装,加RunAs确保提权 Start-Process "msiexec.exe" -ArgumentList "/i C:\Ninja\NinjaInstaller.msi /q /norestart" -Credential $Credential -Verb RunAs -Wait } # 安装包完整性校验(直接比对字节数) $installerPath = "C:\Ninja\NinjaInstaller.msi" $expectedSize = 33.87891 * 1MB $actualSize = (Get-Item $installerPath -ErrorAction SilentlyContinue).Length if ($actualSize -ge ($expectedSize - 1KB) -and $actualSize -le ($expectedSize + 1KB)) { # 按顺序尝试所有凭据 try { Install-Ninja -Credential $local_cred[0] -ErrorAction Stop Write-Host "使用旧IT凭据安装成功" exit 0 } catch { Write-Host "fail1" } try { Install-Ninja -Credential $local_cred[1] -ErrorAction Stop Write-Host "使用旧Power凭据安装成功" exit 0 } catch { Write-Host "fail2" } try { Install-Ninja -Credential $local_cred[2] -ErrorAction Stop Write-Host "使用新IT凭据安装成功" exit 0 } catch { Write-Host "fail3" } try { Install-Ninja -Credential $local_cred[3] -ErrorAction Stop Write-Host "使用新Power凭据安装成功" exit 0 } catch { Write-Host "fail4,所有凭据均安装失败" } } else { Write-Host "安装包下载异常,请检查网络后重试" }
内容的提问来源于stack exchange,提问作者Lucky Lehlohonolo Nthite Mpetl
相关产品推荐
相关产品推荐

