none
C#-PowerShell Rückgabewert erhalten RRS feed

  • Frage

  • Hallo Community,

    Ich führe via C# Oberfläche einen Powershell Befehl aus.

    Leider bekomme ich aktuell keinen Rückgabewert.

    var results2 = pipeline2.Invoke();
                foreach (PSObject obj in results2)
                {
                    Textbox2.Text += "obj";
                }

     Was fehlt hier, damit die Rückgabe funktioniert? Der Powershell Befehl gibt auf jedenfall eine Rückgabe, da mit -WhatIf getestet.

    Donnerstag, 3. November 2016 15:06

Antworten

  • Hallo Fabian,

    wie bereits zuvor geschrieben, ich habe kein Exchange hier, und die CmdLets sind in diesem Fall spezifisch, was die Rückgabe angeht.

    Ich würde testen, ob die Auflistung mit einer verwandten Funktion, z. B. Get-DistributionGroupMember funktioniert.

    Gruß Elmar

    • Als Antwort markiert Fabian Hammer Mittwoch, 16. November 2016 14:23
    Montag, 7. November 2016 20:59
    Beantworter

Alle Antworten

  • Hallo Fabian,

    die Zuweisungszeile sollte lauten:

    Textbox2.Text += obj.ToString(); // oder ein cast, wenn die Rückgabe ein String ist.

    Gruß Elmar

    Donnerstag, 3. November 2016 15:16
    Beantworter
  • ok, mit .ToString(); funktioniert es leider nicht, eine Rückgabe bleibt aus.

    Muss ich auf einen StringBuilder zurückgreifen? Wie stelle ich das an?

    Donnerstag, 3. November 2016 15:26
  • Hallo,

    Ein StringBuilder wäre nur bei vielen Elementen besser, am Ergebnis ändert er nichts. Und ToString funktioniert nur, wenn das jeweilige Objekt es implementiert.

    Da PSObject ein generalisiertes Objekt ist, auf welchen Member / Eigenschaft von obj willst Du zugreifen? Dann sollte es etwas sein wie obj.Membername - und ggf. dort ToString().

    Schau Dir ggf. die Objekt Elemente im Debugger an.

    Gruß Elmar

    Donnerstag, 3. November 2016 15:34
    Beantworter
  • Habe mir gerade im DEbugger das ganze etwas genauer angeschaut,

    interessant ist, dass ich gar keinen Rückgabewert erhalte. Wie kann das sein?

    Mein Code sieht folgendermaßen aus:

    Pipeline pipeline = runspace.CreatePipeline(); Command ImportModule2 = new Command("add-pssnapin"); CommandParameter ModuleName2 = new CommandParameter("-Name", "Microsoft.Exchange.Management.PowerShell.E2010"); ImportModule2.Parameters.Add(ModuleName2); pipeline.Commands.Add(ImportModule2); var results = pipeline.Invoke();

    Pipeline pipeline2 = runspace.CreatePipeline(); Command Befehl = new Command("Add-DistributionGroupMember"); CommandParameter BefehlName = new CommandParameter("-Identity", "VL-Test-001"); CommandParameter BefehlMember = new CommandParameter("-Member", "TestUser"); CommandParameter BefehlWhatIf = new CommandParameter("-WhatIf"); Befehl.Parameters.Add(BefehlName); Befehl.Parameters.Add(BefehlMember); Befehl.Parameters.Add(BefehlWhatIf); pipeline2.Commands.Add(Befehl); var results2 = pipeline2.Invoke();

    ....


    Führe ich den Powershellbefehl direkt auf dem Server aus, bekomme ich als Rückgabe, dass der Member zur Verteilerliste hinzugefügt wird.

    Sende ich den Bfehl ohne -WhatIf Parameter, wird dies auch ausgeführt aber es entsteht kein Rückgabewert, was auch in der Powershell direkt der Fall ist.

    Theoretisch sollte dies doch auch entsprechend weitergegeben werden.



    • Bearbeitet Fabian Hammer Donnerstag, 3. November 2016 22:10 Ergänzung
    Donnerstag, 3. November 2016 22:09
  • Hallo Fabian,

    ich habe kein Exchange in Reichweite, so dass ich den Befehl nicht ausführen kann.

    Schaut man sich die Dokumentation zu Add-DistributionGroupMember an, so sollte er eine Rückgabe (ReducedRecipient) haben. Wenn dies durch WhatIf unterbunden wird, dürfte keine Ausgabe erfolgen.

    Als Gegentest würde ich einen Fehler provozieren, z. B. das Hinzufügen eines bereits bestehenden Empfängers.

    Gruß Elmar

    Freitag, 4. November 2016 05:43
    Beantworter
  • Hallo Elmar,

    habe das ganze noch einmal provoziert und konnte leider keine Änderung feststellen. Zusätzlichen habe ich dem Befehl noch den weiteren Befehl Out-String mitgegeben.

    Das ganze sieht aktuell so aus:

                connectTo.ComputerName = "SERVER";
                Runspace runspace = RunspaceFactory.CreateRunspace(connectTo);
                runspace.Open();
                //Powershell Remote aufrufen und das dafür benötigte SnapIn laden
                Pipeline pipeline = runspace.CreatePipeline();
                Command ImportModule2 = new Command("add-pssnapin");
                CommandParameter ModuleName2 = new CommandParameter("-Name", "Microsoft.Exchange.Management.PowerShell.E2010");
                ImportModule2.Parameters.Add(ModuleName2);
                pipeline.Commands.Add(ImportModule2);
                var results = pipeline.Invoke();
                
    
    Pipeline pipeline2 = runspace.CreatePipeline();
                Command Befehl = new Command("Add-DistributionGroupMember");
                CommandParameter BefehlName = new CommandParameter("-Identity", "VL-Test-001");
                CommandParameter BefehlMember = new CommandParameter("-Member", "TestUser");
                //CommandParameter BefehlWhatIf = new CommandParameter("-WhatIf");
                Befehl.Parameters.Add(BefehlName);
                Befehl.Parameters.Add(BefehlMember);
                //Befehl.Parameters.Add(BefehlWhatIf);
                pipeline2.Commands.Add(Befehl);
                pipeline2.Commands.Add("Out-String");
                var results2 = pipeline2.Invoke();
                foreach (PSObject obj in results2)
                {
                    Test_Verteiler_2_Textbox.Text += obj.ToString();
                }
                    
                runspace.Close();
    Leider erhalte ich nach wie vor keine Rückgabe, auch wenn der Anwender bereits mitglied der Verteilerliste ist.


    Sonntag, 6. November 2016 00:41
  • hat keiner dazu einen Ansatz?
    Montag, 7. November 2016 12:06
  • Hallo Fabian,

    wie bereits zuvor geschrieben, ich habe kein Exchange hier, und die CmdLets sind in diesem Fall spezifisch, was die Rückgabe angeht.

    Ich würde testen, ob die Auflistung mit einer verwandten Funktion, z. B. Get-DistributionGroupMember funktioniert.

    Gruß Elmar

    • Als Antwort markiert Fabian Hammer Mittwoch, 16. November 2016 14:23
    Montag, 7. November 2016 20:59
    Beantworter
  • Hallo Elmar,

    danke für deine Unterstützung.

    Tatsächlich funktioniert die Rückgabe mit einem Get- Befehl.

    Ich werde meine Frage wohl etwas umformulieren:

    Wie kann ich es umsetzen, dass eine Ausgabe in Powershell (zB. mittels write-host...) via C# abgefangen wird ?

    Montag, 7. November 2016 23:00