PowerShell远程突然停止工作

我在执行远程PowerShell脚本时遇到问题,该脚本应该在每天运行一次的任务pipe理器任务中更新应用程序的安装以进行自动化testing。

相当简单的脚本(下面的细节)用于成功运行约一年。 突然间,它开始失败,因为远程PowerShell脚本不能执行。 我不知道这是什么根源。 本地IT确保他们没有改变任何东西。

(我应该注意,我可以用别的东西来代替powershell脚本,但是我不打算轻易放弃,除此之外,我想知道这里有什么问题)

以下是一般设置:

未连接到域的Windows Server 2008 R2虚拟机称为目标。 在目标上分配给pipe理员组的本地用户u_target

域(称为域D)中的Windows Server 2008 R2虚拟机称为源。 分配给源上的pipe理员组的域D用户u_source

Powershell在两个虚拟机上都有2.0版本。

目标上的所有命令u_target具有pipe理权限的u_target执行,所有源上的命令u_source具有pipe理权限的u_source执行。 我三重检查,powershell已经开始作为pipe理员在所有情况下。

大约一年前,我在两台虚拟机上启用了psremoting,如下所示:

在目标上,u_target在admin中执行powershell enable-psremoting -forceset-item wsman:\local\client\TrustedHosts -value 'source' enable-psremoting -force set-item wsman:\local\client\TrustedHosts -value 'source'之后机器重新启动。

两个命令都没有任何错误地执行。 后来,当我遇到麻烦时,我用*replace了“来源”,以确保问题不是由于打字错误造成的。

在源代码中, u_source在admin powershell enable-psremoting -force 。 这台机器也重新启动。

之后,当事情失败时,目标也被添加到TrustedHosts。

应该执行的脚本原则上看起来如下:

 $server = 'target' #(using the FQHN) $username = 'u_target' $password = 'u_targetpwd' #(the correct one, of course) $pass = ConvertTo-SecureString -AsPlainText $password -Force $Cred = New-Object System.Management.Automation.PSCredential -Argumentlist $username,$pass $scbScriptBlock = { # a valid script. For simplicity assume it's Get-ChildItem C:\ } Invoke-Command -ComputerName $server -Credential $Cred -ScriptBlock $scbScriptBlock 

这个结果,因为大约一个星期在下面的错误消息:

 [target] Connecting to remote server failed with following error messages : The connection to the specified remote host was refused. Verify that the WS-Management service is running on the remote host and configured to listen for requests on the correct port and HTTP URL. For more information, see the about_Remote_Troubleshooting Help topic. + CategoryInfo : OpenError: (:) [], PSRemotingTransportException + FullyQualifiedErrorID : PSSessionStateBroken 

我试图解决这个问题或找出什么是错的:

  • 阅读about_Remote_TroublShooting帮助主题。 除了less数例外(见下文),我确信我遵循了那里的指示,但没有成功。
  • 阅读文档
  • 重新configurationWSMan(见上)
  • 使用Get-Itemvalidation可信任的主机设置,使用Set-Item创build它们(并且不忘记重新启动wsman)。
  • 与有问题的用户login到两台计算机,并validation它们仍属于pipe理员组,并且其密码仍然有效
  • 用一个简单的脚本replace原来的脚本块,以确保它不是被破坏的脚本块。
  • validation了计算机彼此了解(ping,从源到目标的testing连接)
  • validation了u_target能够在使用远程桌面会话中的powershelllogin到目标时执行脚本块中的命令
  • search互联网。 一次打击是暗示目标上的u_target的用户configuration文件可能被破坏,而不是
  • validation的WSMan正在服务pipe理器中运行
  • 在脚本中用'target \ u_target'replace'u_target'并从头开始尝试
  • 几次重启了有问题的虚拟机,并重复了上述所有内容
  • 创build了一个类似的设置替代源和目标虚拟机(这些安装了PowerShell 3.0版)。 远程处理也失败了。 远程处理似乎与一对域绑定的虚拟机(昨天,今天我无法得到它的工作),但我不想要,但是,工作正常。
  • 在Windows日志 – >应用程序和Windows日志 – >安全性部分中检查了目标的事件日志。 虽然脚本更早(当它仍然正常工作)生成,例如,login事件现在已经不存在了。 没有错误,要么。
  • 检查源和目标上的防火墙设置。 我认为他们没问题,但也许我只是想相信“启用psremoting”工具是否正确工作
  • (当然,检查脚本也失败了,我在这个问题中使用的简单的脚本块,而不是原来的,我不应该在这里发布)。

所以这是我的问题:

  • 当然,这一个;-):你有什么想法可能导致脚本突然失败?

  • 我不确定的事情是端口和HTTP URL WSpipe理正在监听,我将如何检查? 我执行了'winrm enumerate winrm / config / listener',因为事件中的一些旧消息告诉我这样做,我注意到这里的主机名似乎是未定义的。 CertificateThumbprint似乎也没有任何价值,但Transport是HTTP。

  • 有没有最近的更新或修补程序已知会造成PS Remoting麻烦?
  • 是否有任何典型的设置pipe理员想要应用networking广泛,可能会导致这种失败?
  • 我可以在哪里看(特别是事件日志,事件ID)?

我想到的一些更荒谬的想法可能不是太荒谬(?):

  • 虚拟机已经build立了几乎整整一年的脚本开始失败 – 是否有一些设置过了一年后,我不会另外注意,但会造成这种影响?
  • 安装.net Framework 4.5.2 – 我确定脚本处于工作状态之后,发生了,虽然
  • 有没有可能过期的证书?

如果为WSMan提供程序启用跟踪选项(至less在源服务器上,可能还有远程),则可能能够获得有关此类问题的更多信息。 没有这个,没有太多logging。 要启用跟踪logging:

 Import-Module PSDiagnostics Enable-PsWsmanCombinedTrace <run your script> Disable-PsWsmanCombinedTrace 

查看PowerShell事件日志(Applications and Services Logs / Microsoft / Windows / PowerShell / Operational)
如果WinRM使用SSL,证书应该在计算机帐户中进行个人访问。

您可以使用以下命令确认configuration为侦听的端口: winrm get winrm/config 。 这将包括如信任的地址/主机,如果源是手动configuration或GPO(这将覆盖您的configuration),并且如果启用证书身份validation的信息。

检查源服务器和目标服务器上的Windows远程pipe理/操作事件日志。 日志logging很薄弱,但如果有错误,可能会logging在那里。

netstat应该确认监听端口(在下面的例子中是5985):

 netstat -ano | findstr /i ":598" TCP 0.0.0.0:5985 0.0.0.0:0 LISTENING 4 TCP 192.168.1.132:49223 192.168.1.131:5985 ESTABLISHED 972 TCP [::]:5985 [::]:0 LISTENING 4 

如果您在源和目标上执行netmon数据包捕获以确认发生了什么networking活动,这也将有所帮助。