0

我有 C# Asp.Net 应用程序,它连接到远程计算机(与 Web 服务器相关的远程)以使用 PowerShell 在它们上运行命令。这通常有效,但是在某些情况下(我还不完全理解),我们完全失去了建立任何远程会话的能力。发生这种情况时,任何连接到远程 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();

...这没有什么区别,除了少数外部堆栈框架略有不同。

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

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

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

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

此消息首先在同步 PowerShell 连接成功出现,然后在之后的所有连接中出现。

4

2 回答 2

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 身份验证:已启用 匿名:已禁用

于 2014-09-22T16:30:28.810 回答
0

问题在于 PowerShell 4.0。更新到 5.1 版

于 2019-12-01T12:14:00.460 回答