2016-07-28 22 views
0

Wenn ich den Code unten während des Debuggens in Visual Studio 2015 ausführen, funktioniert es einwandfrei. Wenn es in IIS bereitgestellt wird, erhalte ich den folgenden Fehler in der zweiten Zeile:Der WinRM-Dienst kann die Anforderung nicht verarbeiten. Ein Befehl existiert bereits mit der Befehls-ID, die vom Client angegeben wurde

Der WinRM-Dienst kann die Anforderung nicht verarbeiten. Ein Befehl existiert bereits mit der vom Client angegebenen Befehls-ID.

public static PowerShellResponse AddToDistributionGroup(Credentials creds, string groupName, string memberEmail) 
{ 
    PSCredential cred = new PSCredential(creds.Username, creds.Password.ToSecureString()); 

    WSManConnectionInfo connectionInfo = new WSManConnectionInfo(new Uri(Settings.ExchangeServerAutomationUrl), Settings.ExchangeAutomationSchemaName, cred); 
    connectionInfo.AuthenticationMechanism = AuthenticationMechanism.Kerberos; 

    using (Runspace runspace = RunspaceFactory.CreateRunspace(connectionInfo)) 
    { 
     using (PowerShell ps = PowerShell.Create()) 
     { 
      runspace.Open(); 
      ps.Runspace = runspace; 
      //can't pipe OU to Add-DistrubtionGroupMember b/c it blows up w/ "null reference exception" when member already exists 

      var group = 
        ps 
         .AddCommand("Get-DistributionGroup") 
          .AddParameter("Identity", groupName) 
          .AddParameter("OrganizationalUnit", creds.GetUserDN()) 
         .Invoke() 
         .SingleOrDefault(); 

      if (group == null) 
       return new PowerShellResponse() { Errors = new List<string> { "Group not found." } }; 

      ps.AddStatement(); 

      ps.AddCommand("Add-DistributionGroupMember") 
       .AddParameter("Identity", ((dynamic)group).Identity) 
       .AddParameter("Member", memberEmail); 

      ps.Invoke(); //this is where the error shows up 

      return ps.GetResponse(); 
     } 
    } 
} 

Ich bin eine Verbindung mit Exchange (API-Dokumentation: https://technet.microsoft.com/en-us/library/dn641234(v=exchg.160).aspx) C# und Powershell 3.0 versuchen, ein Mitglied zu einer Verteilergruppe in Exchange unter Verwendung hinzuzufügen.

PowerShellResponse ist eine benutzerdefinierte Klasse, die wir haben, und ps.GetResponse() ist eine benutzerdefinierte Funktion zum Erstellen der genannten PowerShellResponse.

Antwort

0

Nachdem ich diesen Fehler nirgendwo online finden konnte, rief die Lösung, die ich ersann, ps.Invoke() nicht zweimal in einer Anweisung auf. Folgendes funktionierte sowohl lokal als auch nach Bereitstellung in IIS einwandfrei:

public static PowerShellResponse AddToDistributionGroup(Credentials creds, string groupName, string memberEmail) 
{ 
    PSCredential cred = new PSCredential(creds.Username, creds.Password.ToSecureString()); 

    WSManConnectionInfo connectionInfo = new WSManConnectionInfo(new Uri(Settings.ExchangeServerAutomationUrl), Settings.ExchangeAutomationSchemaName, cred); 
    connectionInfo.AuthenticationMechanism = AuthenticationMechanism.Kerberos; 

    PSObject group; 

    using (Runspace runspace = RunspaceFactory.CreateRunspace(connectionInfo)) 
    { 
     using (PowerShell ps = PowerShell.Create()) 
     { 
      runspace.Open(); 
      ps.Runspace = runspace; 

      group = 
        ps 
         .AddCommand("Get-DistributionGroup") 
          .AddParameter("Identity", groupName) 
          .AddParameter("OrganizationalUnit", creds.GetUserDN()) 
         .Invoke() 
         .SingleOrDefault(); 
     } 
    } 

    //can't pipe OU to Add-DistrubtionGroupMember b/c it blows up w/ "null reference exception" when member already exists 
    if (group == null) 
     return new PowerShellResponse() { Errors = new List<string> { "Group not found." } }; 

    using (Runspace runspace = RunspaceFactory.CreateRunspace(connectionInfo)) 
    { 
     using (PowerShell ps = PowerShell.Create()) 
     { 
      runspace.Open(); 
      ps.Runspace = runspace; 

      ps.AddCommand("Add-DistributionGroupMember") 
       .AddParameter("Identity", ((dynamic)group).Identity) 
       .AddParameter("Member", memberEmail); 

      ps.Invoke(); 

      return ps.GetResponse(); 
     } 
    } 
}