我有 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 连接成功后出现,然后在之后的所有连接中出现。