我有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连接后显示,然后显示所有连接。
答案 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