批处理脚本运行良好,但通过 PowerShell Remoting 执行时失败

Posted

技术标签:

【中文标题】批处理脚本运行良好,但通过 PowerShell Remoting 执行时失败【英文标题】:Batch script runs fine, but fails when executed through PowerShell Remoting 【发布时间】:2012-03-29 12:54:21 【问题描述】:

我在 Windows 2008 R2 服务器上有以下批处理脚本:

@echo off
djoin.exe /provision /domain my.domain.com /machine test /savefile savefile.txt
echo %ERRORLEVEL%

如果我在服务器本身上运行脚本,无论是通过命令提示符还是 PowerShell,它都可以正常工作并返回“0”。

问题是我需要从远程计算机上执行它,所以我做了以下(仅用于测试的示例):

Invoke-Command -ComputerName remotehost -ScriptBlock .\script.cmd

输出为“-1073740940”,可能是错误代码 C0000374,可能与堆损坏有关。

这似乎是 djoin 命令本身的问题。我可以注释掉 djoin 并运行其他二进制文件,例如 ping,使用相同的 Invoke-Command 没有问题。

请记住,当从目标计算机上的 PowerShell 执行脚本时,该脚本运行良好,远程操作可能会引入哪些问题?

在这两种情况下,脚本都使用我的帐户以相同的权限执行,该帐户是 Domain Admins 的成员。我怀疑这是一个权限问题,不知道还能去哪里看。

[编辑]

放弃一切。这要么是 djoin 中的错误,要么是 djoin 和 PS 远程处理之间的交互中的一些模糊问题。

我设法直接在客户端上运行 djoin,使用“runas /netonly ...”来提供域凭据。这是一个非常混乱的解决方案(我还没有弄清楚如何获得由 runas 启动的进程的退出状态),但可以完成工作。

【问题讨论】:

Invoke-Command -Computer remotehost -ScriptBlock djoin.exe /provision /domain my.domain.com /machine test /savefile savefile.txt; $LASTEXITCODE 有什么不同吗?换句话说:为什么需要批处理文件? 以完全相同的方式失败。批处理文件是在我用尽所有其他关于如何运行 djoin.exe 的想法时出现的。问题是运行“djoin.exe /?”,例如,工作得很好,我确实得到了使用输出。但是这个命令是用来在活动目录中预置计算机帐户的,这是失败的主要操作。 好的,但是问题不是批处理文件,而是围绕 PowerShell 远程处理的环境以某种方式阻止了 djoin 做它应该做的事情。 @VokinLoksar,你找出问题所在了吗?我遇到了同样的问题,似乎无法找出问题所在.. 不。仍在使用 'runas /netonly "/user:$user" $cmd' 其中 $cmd 是 djoin 命令字符串。 【参考方案1】:

这几乎可以肯定是一个经典的“双跳”身份验证问题。请记住,当您使用 PowerShell 远程处理时,您正在使用这些跃点之一。如果需要身份验证,您在访问第三台远程计算机的远程计算机上执行的任何操作都不太可能工作。

要解决此问题,您可以使用允许您委托凭据的身份验证方法,例如 CredSSP。这比简单地更改身份验证类型要复杂一些,因为您必须在客户端事务的服务器端进行更改。请参阅 MSDN 上的这篇博文,PowerShell Remoting and the “Double-Hop” Problem 和这篇“嘿,脚本专家!”帖子,Enable PowerShell "Second-Hop" Functionality with CredSSP。

【讨论】:

以上是关于批处理脚本运行良好,但通过 PowerShell Remoting 执行时失败的主要内容,如果未能解决你的问题,请参考以下文章

通过 Powershell 远程 TFS 签入

Powershell 脚本无法使用任务计划程序通过 Outlook 发送电子邮件

从PowerShell设置Visual Studio环境变量

在 CMD 中运行 PowerShell 脚本(带有弹出窗口)

Powershell 脚本不通过计划任务运行

从命令行运行但不能通过 cron 运行时脚本运行良好