真高兴看到人们使用PowerShell Remoting在远程机器上运行命令。这是未来技术的趋势,但是也有点复杂。
只访问本地资源
在开始使用之前,确保命令不访问远程机器上的非本地资源。假如你运行一台Windows 7或Windows 8电脑,使用Remoting将一条命令传输给搭载Windows Server 2008或者更新版本的计算机B,这条命令就能操作计算机B上的所有资源。这是不允许的,特别是访问网络。
为什么?这是因为Remoting将你的证书委派给计算机B,但是安全起见,计算机B不允许更进一步委派证书。
如果你需要这么做,你可以通过使用CredSSP协议实现多级授权。因为有许多安全因素,所以在开始之前,你需要明确。你可以从免费的电子书PowerShell Remoting的秘密浏览更多信息,电子书中有一整章节是关于CredSSP的。
时间问题
命令的另一个可能性问题在于时间。当你在本地手工运行一条命令时,输入、点击“回车”、阅读结果需要一定的时间。在你开始输入下一条命令时,上一条的命令已经运行完成。
当你发送一批命令到远程机器时,并不一定如此。机器在***条命令执行完成之间就可以转到下条命令。尤其是在运行启动单独的进程或线程的外部命令时。
为了解决问题,使用Enter-PSSession连接到远程机器,并手动运行试图发送的任何命令。如果有用,在发送批量命令时,换成使用Invoke-Command。否则,你会遇到时间问题。
你有几种解决问题的方法:你可以使用Start-Sleep命令暂停shell;也可以进行必要的检查,如文件是否存在;在执行其他命令之前,将shell睡眠并重现检查,然后继续开始。
外部命令问题
还有一种可能性只适用于外部命令,而不是本地PowerShell cmdlets,那就是远程机器错误解释了你的命令。在PowerShell v3中,前面的外部命令使用两个破折号(“--”)告诉shell照原来的样子传递给Cmd.exe,甚至不用解析。这通常用来解决外部命令语法问题。
远程规则
如果你通过远程桌面连接或者从服务器直接登录到远程机器的控制台这种方式来成功运行命令的话,那么这条命令不会通过PowerShell Remoting运行,这时你遭遇了“环境问题”。
使用Invoke-Command、Enter-PSSession或其他方法远程进入机器以后,不会像登录到控制台或者远程桌面会话那样得到完整的交互式桌面会话。PowerShell不执行概要文件的脚本,并且没有完整的用户环境。我看到大量的命令都是出于这个原因,但也有可能有一些没有这种问题。
如果你也有这种问题,你可以尝试在远程机器上调度自己的命令。Windows的任务调度程序拥有一个完整的用户帐户,不能保证能够修复问题,但值得一试。
如果这样也不能解决问题,那就是卡住了。如果你的命令需要一个完整的、交互式桌面环境来运行,那么你就必须按照上述方法运行。