2016-08-02 13 views
0

Ich habe eine App, die es Benutzern ermöglicht, die Abwesenheitsnotiz anderer Benutzer auf Exchange über eine einfache Webschnittstelle zu aktualisieren.Interner Fehler beim Erstellen von RunSpace

Mein erster Versuch, diese Microsoft.Exchange.WebServices verwendet, um die Erstellung zu verbinden Dienstleistungen auszutauschen, aber ich hatte diese zu verlassen (auch wenn es funktioniert hat) aufgrund der auf dem Systemkonto erforderlichen Berechtigungen (ein Konto OOF-Nachrichten über EWS Aktualisierung erfordert FULL Postfachberechtigungen).

Also, dies zu überwinden, habe ich die folgende Klasse, die PowerShell Remote verwendet die gleiche Sache zu erreichen:

public class ExchangeShell 
{ 
    private Runspace MyRunSpace; 
    private PowerShell MyPowerShell; 
    private Uri ExchangeServer; 

    public ExchangeShell() 
    { 
     var exchangeserverurl = new Uri("http://EXCHANGESERVER/PowerShell"); 
     var psCredential = GetCredentials(); 
     var connectionInfo = new WSManConnectionInfo(exchangeserverurl, "http://schemas.microsoft.com/powershell/Microsoft.Exchange", psCredential); 

     try 
     { 
      MyRunSpace = RunspaceFactory.CreateRunspace(connectionInfo); 
     } 
     catch (Exception ex) 
     { 
      Email.Send($"Unable to connect \n\n Error: {ex.Message} "); 
      Environment.Exit(Environment.ExitCode); 
     } 
    } 

    public OofSettings GetOofSettings(string email) 
    { 
     using (MyRunSpace) 
     { 
      MyRunSpace.Open(); 

      using (var powerShell = PowerShell.Create()) 
      { 
       powerShell.Runspace = MyRunSpace; 

       var command = new PSCommand(); 

       command.AddCommand("Get-MailboxAutoReplyConfiguration"); 
       command.AddParameter("Identity", email); 

       powerShell.Commands = command; 

       var result = powerShell.Invoke(); 

       var oofSetting = new OofSettings(); 

       oofSetting.State = (OofState)Enum.Parse(typeof(OofState), result[0].Properties["AutoReplyState"].Value.ToString()); 
       oofSetting.Duration = new TimeWindow((DateTime)result[0].Properties["StartTime"].Value, (DateTime)result[0].Properties["EndTime"].Value); 
       oofSetting.ExternalAudience = (OofExternalAudience)Enum.Parse(typeof(OofExternalAudience), result[0].Properties["ExternalAudience"].Value.ToString()); 
       oofSetting.InternalReply = result[0].Properties["InternalMessage"].Value.ToString(); 
       oofSetting.ExternalReply = result[0].Properties["ExternalMessage"].Value.ToString(); 

       return oofSetting; 
      } 
     } 
    } 

    private PSCredential GetCredentials() 
    { 
     var secureString = new SecureString(); 
     foreach (char c in @"PASSWORD") 
     { 
      secureString.AppendChar(c); 
     } 
     return new PSCredential("SERVICEACCOUNT", secureString); 
    } 
} 

Dies funktioniert auch, wenn sie lokal auf meinem Rechner oder als EXE auf dem Server ausgeführt.

Allerdings, wenn ich Gastgeber dies über IIS ich auf dieser Linie einen Fehler sehe:

MyRunSpace = RunspaceFactory.CreateRunspace(connectionInfo); 

ein interner Fehler aufgetreten.

Dies ist keine sehr hilfreiche Fehlermeldung und ich bin mir nicht sicher, wie ich über das Debugging gehen kann. Hat jemand dazu irgendwelche Vorschläge?


aktualisieren

angebracht ich einen Tracer in web.config und hier ist eine Trace-Informationen nach Auswahl eines Benutzers ihre aus dem Amt Details abzurufen:

Category  Message     From First(s)  From Last(s) 
aspx.page  Begin PreInit 
aspx.page  End PreInit    0.000025   0.000025 
aspx.page  Begin Init    0.000035   0.000009 
aspx.page  End Init     0.000057   0.000022 
aspx.page  Begin InitComplete  0.000065   0.000008 
aspx.page  End InitComplete   0.000073   0.000008 
aspx.page  Begin PreLoad   0.000081   0.000008 
aspx.page  End PreLoad    0.000093   0.000012 
aspx.page  Begin Load    0.000101   0.000008 

Aber ich wirklich don‘ Ich weiß nicht, was ich aus dieser Information machen soll - es scheint nicht viel darüber zu sagen, was zwischen dem runspace und dem Server passiert.

Stack Trace:

bei System.Management.Automation.Remoting.Client.WSManClientSessionTransportManager.Initialize (Uri ConnectionURI, WSManConnectionInfo connection) bei System.Management.Automation.Remoting.Client.WSManClientSessionTransportManager .. ctor (Guid runspacePoolInstanceId, WSManConnectionInfo connection, PSRemotingCryptoHelper cryptoHelper) bei System.Management.Automation.Remoting.ClientRemoteSessionDSHandlerImpl..ctor (ClientRemoteSession Sitzung, PSRemotingCryptoHelper cryptoHelper, RunspaceConnectionInfo connection, URIDirectionReported uriRedirectionHandler) bei System.Man agement.Automation.Remoting.ClientRemoteSessionImpl..ctor (RemoteRunspacePoolInternal rsPool, URIDirectionReported uriRedirectionHandler) bei System.Management.Automation.Internal.ClientRunspacePoolDataStructureHandler..ctor (RemoteRunspacePoolInternal clientRunspacePool, TypeTable typeTable) bei System.Management.Automation.Runspaces.Internal. RemoteRunspacePoolInternal..ctor (Int32 minRunspaces, Int32 maxRunspaces, TypeTable typeTable, PSHost-Host, PSPrimitiveDictionary applicationArguments, RunspaceConnectionInfo connectionInfo) bei System.Management.Automation.Runspaces.RunspacePool..ctor (Int32 minRunspaces, Int32 maxRunspaces, TypeTable typeTable, PSHost-Host, PSPrimitiveDictionary applicationArguments, RunspaceConnectionInfo connectionInfo) bei System.Management.Automation.RemoteRunspace..ctor (TypeTable typeTable, RunspaceConnectionInfo connection, PSHost Wirt, PSPrimitiveDictionary applicationArguments) bei System.Management.Automation.Runspaces.RunspaceFactory.CreateRunspace (RunspaceConnectionInfo connection, PSHost Wirt, TypeTable typeTable, PSPrimitiveDictionary applicationArguments) bei SetOutOfOffice.ExchangeShell ..ctor()

Antwort

0

Dieses Problem wurde verursacht, weil ich die falsche Version von PowerShell auf dem Server installiert hatte.

Es ist eine Schande, dass die Internal Error Nachricht dies nicht erwähnt, aber wahrscheinlich eine gute zu überprüfen, wenn dieser Fehler auftritt.

1

Wenn Sie debuggen wollen, sollten Sie in der Lage sein zu verwenden, in .NET Tracing oder hängen Sie einfach den Debugger

Ein häufiges Problem versagt Zertifikatsprüfungen so dass Sie vielleicht zu umgehen versuchen jene zB

connectionInfo.SkipCACheck = true; connectionInfo.SkipCNCheck = true; connectionInfo.MaximumConnectionRedirectionCount = 4;

+0

Vielen Dank für Ihre Antwort Glen, ich habe versucht, diese 'connectionInfo' Checks zu überspringen, aber ohne Erfolg. Nach der Überprüfung von 'trace.axd' kann ich wirklich keine nützlichen Informationen sehen (obwohl ich es vielleicht nicht richtig lese) - ich habe einige in meiner Frage gepostet – Bassie