2017-12-10 4 views
1

Ich habe eine C# -Anwendung erstellt, die Powershell-Dateien ausführt. Das Problem ist, dass es nicht die korrekten/alle Ergebnisse der Powershell-Befehle zu sammeln scheint.C# & Powershell: Ich gebe nicht alle Powershell-Ergebnisse zurück

Der Code unten:

private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     List<string> results = RunScript("Get-ADUser testuser2 -Properties *"); 
     this.ShowMessageAsync("OK",results[0]); 
    } 

    private List<string> RunScript(string comand) 
    { 
     var powerShell = PowerShell.Create(); 
     powerShell.Runspace = runspace; 
     powerShell.AddScript(comand); 

     Collection<PSObject> results = powerShell.Invoke(); 
     List<string> resultsList = new List<string>(); 

     if (powerShell.Streams.Error.Count > 0) 
     { 
      this.ShowMessageAsync("Something went wrong!", "Check error log for details!"); 
      runspaceBox.AppendText(powerShell.Streams.Error[0] + "\r\n"); 
     } 

     else 
     { 
      foreach (PSObject obj in results) 
      { 
       runspaceBox.AppendText(obj.ToString() + "\r\n"); 
       resultsList.Add(obj.ToString()); 
      } 
     } 
     return resultsList; 
    } 


Ergebnisse in:

{CN = testuser2, DC = testdomain, DC = com}


den Befehl Einlochen in Powershell ergibt sich direkt die folgende:

PS C: \ Benutzer \ Ultimative-V1> Get-ADUser testuser2 -Eigenschaften *

[Ein Bündel von zusätzlichen Sachen oben]

Beschreibung:

Displayname: Test Benutzer2

DistinguishedName: Benutzer CN = Test One, = CN, DC = testdomain, DC = com

Liga:

DoesNotRequirePreAuth: False

[Viele Extramaterial unten]


ich viele der Ergebnisse aus dem oben genannten Befehl snipped haben, da es sehr lang ist.

Was ich nicht herausfinden kann ist, warum es nur den Distinguished Name und nicht alle Ergebnisse liefert, dies geschieht mit einigen Befehlen, aber nicht mit anderen. Der Befehl, alle AD-Gruppen für einen Benutzer zurückzugeben, funktioniert beispielsweise gut.

Wenn möglich würde ich es lieben, ALLES zu haben, dass der Befehl zurückgibt, ich werde die resultsList später im Code formatieren.

Jede Hilfe oder Hinweise würden sehr geschätzt werden!

+2

'powerShell.AddScript (comand);' - > 'powerShell.AddScript (Befehl).AddCommand ("Out-String"); ' – PetSerAl

+0

@PetSerAI Huh, das scheint zu einem schönen großen Textblock in Position 0 der resultsList (Zeilen getrennt durch \ r \ n) zu führen, dies wird halb-Arbeit wird aber erfordern viel mehr Zeit, um die Ergebnisse der verschiedenen Powershell-Befehle auszuarbeiten. Ich schätze, ich kann prüfen, ob es in einer großen Zeile steht, und wenn ja, kann ich es korrekt in resultList aufteilen. Sie würden nicht zufällig einen einheitlicheren Weg finden, es zu tun? – Erik

+0

In Übereinstimmung mit was? Wenn Sie die gleichen Ergebnisse erzielen möchten wie PowerShell auf der Konsole, müssen Sie Objekte über das PowerShell-Formatierungssystem übergeben, was etwas komplizierter ist als nur 'obj.ToString()'. 'Out-String' macht genau das und gibt eine Zeichenfolge an Sie zurück. Wenn Sie etwas anderes wollen, dann müssen Sie sagen, was genau Sie wollen. – PetSerAl

Antwort

1

Da Sie das Ergebnis als Zeichenfolge umgewandelt haben, haben Sie eine Zeichenfolgedarstellung des komplexen Objekts erhalten (unabhängig vom Ergebnis der .ToString()-Methode des Objekts).

In PowerShell selbst wird nicht alles in eine Zeichenfolge umgewandelt, um es anzuzeigen; Es gibt verschiedene Regeln zum Anzeigen von Objekten im Allgemeinen (normalerweise ein Tabellen- oder Listenformat), und einige Typen haben spezielle Formatierer.

PetSerAl bereits in den Kommentaren beantwortet, aber die Art und Weise eine String-Darstellung zu bekommen, was Powershell zeigt auf der Konsole ist die Ausgabe durch Out-String zu senden:

powerShell.AddScript(comand).AddCommand("Out-String"); 
Verwandte Themen