2014-03-05 4 views
0

PowerShell을 사용하여 명령을 실행하는 원격 컴퓨터 (웹 서버와 관련하여 원격)에 연결하는 C# Asp.Net 응용 프로그램이 있습니다. 이것은 일반적으로 작동하지만 일부 상황에서는 (아직 완전히 이해하지 못함) ANY 원격 세션을 설정하는 능력이 완전히 손실됩니다. 그렇게되면, 모든 시도는 다음과 같은 예외가 원격 PowerShell을 결과에 연결 : PowerShell remoting : 예외 WSManClientSessionTransportManager.Initialize()의 PSInvalidOperationException

 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 구성 요소 내에서 일부 조건이 트리거 될 때까지 모든 것이 작동하기 때문입니다. ... 그 수

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

:

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(); 

을 또한 풀을 통해 다음

내가 연결하는 방법입니다 약간의 외부 스택 프레임이 약간 다르다는 점을 제외하면 차이가 없습니다.

나는 이것이 스레딩과 관련이 있다고 생각합니다. 우리는 AJAX 요청에 응답하는 IIS 스레드에서 일부 PowerShell 연결을 (동 기적으로) 수행하며, 일부 연결은 비동기 적으로 별도의 스레드에서 수행되며 ThreadPool.QueueUserWorkItem(...)을 통해 시작됩니다. 그래서 처음에는 (IIS를 다시 시작할 때) 두 가지 유형의 호출이 모두 작동하고 잘못된 이벤트가 발생한 후에 모든 유형의 연결 시도가 위의 예외를 throw하기 시작합니다. 이것은 항상 동기 호출이 수행 한 (매우 간단하고 겉으로보기에 좋지 않은) 후 비동기 호출 이후에 발생합니다. IIS가 다시 시작되면 조건이 다시 트리거 될 때까지 해당 정책이 지워집니다.

일부 PowerShell 작업이 리소스를 올바르게 해제하지 못하는 것처럼 보입니다. 세션이 끝나면 실행 공간/풀에 Close(), Disconnect()Dispose()의 모든 조합을 사용하여 닫으려고했지만 아무런 차이가 없습니다.

추신. 원격 관리를위한이 이벤트 로그가있다 :

(Event ID: 28) Access Denied error: the WSManCreateSession API caller does not match the creator of the application object

이 메시지는 처음 이후 모든 연결에 대해 다음 후 성공적인 동기 PowerShell을 연결하고 나타납니다.

답변

1

runspace.Open()을 호출 할 때 가장 및 Kerberos를 사용하여 Exchange 2010에 원격으로 연결하려고 할 때 동일한 문제가 발생하지만 제 경우에는 작동하지 않습니다.Windows 원격 관리 이벤트 로그에서 WSMan이 인증 된 사용자 계정을 사용하여 성공적으로 인증 한 다음 "(이벤트 ID : 22) WSMan에서 호출하여 셸에서 출력을 받으면"응용 프로그램 풀 계정에서 시작되어 동일한 오류가 발생하는 것을 볼 수 있습니다 " (이벤트 ID : 28) 액세스 거부 오류 : WSManCreateSession의 API의 호출자는 응용 프로그램 개체 "

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

의 Web.config가 <identity impersonate="true" />

사이트 인증을 포함 포함의 창조자와 일치하지 않습니다 바람 ows 인증 : 사용 가능 익명 : 사용 안함