我所拥有的简化版本是三个powershell脚本。一个使用凭据调用其他powershell脚本。第二个调用存储在第三个脚本中的函数。所以基本上我的第一个脚本的主要功能看起来像这样:
Invoke-Command -ScriptBlock { param($script,$param) &$script $param} -ArgumentList $scriptToRun,$param) -ComputerName $computerName -Credential $cred
此函数成功调用第二个脚本,该脚本采用传入的参数,如下所示:
param($path) . ./functions.ps1 addToiTunes $path
第三个脚本包含一个名为addToiTunes的函数,其基本函数通过为iTunes创建COM对象来启动:
function addToiTunes($path) {
$iTunes = New-Object -ComObject iTunes.application
Write-Host "Completed"
}
问题是,它永远不会进入Write-Host语句。它只是挂在New-Object语句上,然后最终停止并声明“脚本执行完成”。
知道为什么会这样吗?是因为它试图在后台进程中创建一个新的com对象吗?或者它可能是我的凭据呼叫实际上没有工作?
有谁知道调用New-Object的更好方法?或者我应该检查该应用程序的现有对象?我不确定问题是什么。
答案 0 :(得分:1)
这似乎与凭据有关。如果我从调用中删除了computername和creds,我没有得到CO_E_SERVER_EXEC_FAILURE消息,当不需要凭证时,这一切都很好......
<强>更新强> 我在这里创建了一个与问题更直接相关的新问题:Using credentials on ScriptBlock causing COM errors connecting to application
答案 1 :(得分:0)
这不是Powershell着名的旧第二跳问题吗?您需要使用 Enable-WSManCredSSP 设置客户端凭据委派,请参阅此处的脚本专家:http://blogs.technet.com/b/heyscriptingguy/archive/2012/11/14/enable-powershell-quot-second-hop-quot-functionality-with-credssp.aspx
否则第二个'n第三个powershell脚本不会继承您的凭据并作为本地系统运行。