PowerShell远程处理:WSManClientSessionTransportManager.Initialize()中的异常PSInvalidOperationException

时间:2014-03-05 03:55:11

标签: c# asp.net multithreading powershell wsman

我有C#Asp.Net应用程序,它连接到远程计算机(远程与Web服务器相关),使用PowerShell在它们上运行命令。 这通常有效,但在某些情况下(我还没有完全理解),我们完全失去了建立 ANY 远程会话的能力。发生这种情况时,任何连接到远程PowerShell的尝试都会导致以下异常:

      System.Management.Automation.PSInvalidOperationException
      at System.Management.Automation.Remoting.Client.WSManClientSessionTransportManager.Initialize(Uri connectionUri, WSManConnectionInfo connectionInfo)
      at System.Management.Automation.Remoting.Client.WSManClientSessionTransportManager..ctor(Guid runspacePoolInstanceId, WSManConnectionInfo connectionInfo, PSRemotingCryptoHelper cryptoHelper, String sessionName)
      at System.Management.Automation.Remoting.ClientRemoteSessionDSHandlerImpl..ctor(ClientRemoteSession session, PSRemotingCryptoHelper cryptoHelper, RunspaceConnectionInfo connectionInfo, URIDirectionReported uriRedirectionHandler)
      at System.Management.Automation.Remoting.ClientRemoteSessionImpl..ctor(RemoteRunspacePoolInternal rsPool, URIDirectionReported uriRedirectionHandler)
      at System.Management.Automation.Internal.ClientRunspacePoolDataStructureHandler..ctor(RemoteRunspacePoolInternal clientRunspacePool, TypeTable typeTable)
      at System.Management.Automation.Runspaces.Internal.RemoteRunspacePoolInternal.CreateDSHandler(TypeTable typeTable)
      at System.Management.Automation.Runspaces.RunspaceFactory.CreateRunspacePool(Int32 minRunspaces, Int32 maxRunspaces, RunspaceConnectionInfo connectionInfo, PSHost host, TypeTable typeTable, PSPrimitiveDictionary applicationArguments)
      at System.Management.Automation.Runspaces.RunspaceFactory.CreateRunspacePool(Int32 minRunspaces, Int32 maxRunspaces, RunspaceConnectionInfo connectionInfo)
      ...

当该条件开始时,所有尝试连接到任何主机都会抛出此异常,而且从我所知道的情况来看,这在发起主机上完全是客户端问题。

我在这里或MS论坛上没有找到任何解释。这是任何类型的用户权限问题,因为在Microsoft组件中触发某些条件之前一切正常。

以下是我的联系方式:

  WSManConnectionInfo ci = new WSManConnectionInfo(
     false, host, 5985, "/wsman",
     "http://schemas.microsoft.com/powershell/Microsoft.PowerShell",
     credential
  );
  ci.AuthenticationMechanism = AuthenticationMechanism.Credssp;

我试图直接获得运行空间:

 runspace = RunspaceFactory.CreateRunspace(ci);
 runspace.ApartmentState = ApartmentState.MTA; // other values don't help
 runspace.Open();

并通过游泳池:

 pool = RunspaceFactory.CreateRunspacePool(1, 5, ci);
 pool.ApartmentState = ApartmentState.MTA;
 pool.Open();

......没有区别,只有少数外层堆栈框架略有不同。

我怀疑这与线程有关。我们直接从IIS线程响应AJAX请求(同步)执行一些PowerShell连接,并且一些连接是通过ThreadPool.QueueUserWorkItem(...)异步启动的,从异步线程完成。 因此,在开始时(重新启动IIS时),两种类型的调用都有效,然后在一些错误事件之后,所有类型的连接尝试都会开始抛出上述异常。这总是发生在同步调用之后(非常简单且看起来是良性的)并且从不在异步调用之后。 IIS重新启动会清除该状态,直到再次触发该条件。

看起来好像某些PowerShell操作可能无法正常释放资源。会话结束后,我尝试在运行空间/池上使用Close()Disconnect()Dispose()的所有组合关闭它们,这没有任何区别。

PS。远程管理的事件日志中有这个:

  

(事件ID:28)访问被拒绝错误:WSManCreateSession API调用者与应用程序对象的创建者不匹配

此消息首先在成功同步PowerShell连接后显示,然后显示所有连接。

2 个答案:

答案 0 :(得分:1)

在调用runspace.Open()时尝试使用Impersonation和Kerberos远程连接到Exchange 2010时遇到同样的问题,但在我的情况下它永远不会有效。在Windows远程管理事件日志中,我看到WSMan使用经过身份验证的用户帐户成功进行身份验证,但后来我看到“(事件ID:22)调用WSMan以接收来自应用程序池帐户启动的shell的输出,从而导致相同的错误” (事件ID:28)访问被拒绝错误:WSManCreateSession API调用者与应用程序对象的创建者不匹配“

Aspnet.config包括       <legacyUnhandledExceptionPolicy enabled="false" /> <legacyImpersonationPolicy enabled="false" />

Web.config包括       <identity impersonate="true" />

网站身份验证       Windows身份验证:已启用       匿名:已禁用

答案 1 :(得分:0)

问题出在PowerShell 4.0。更新到版本5.1