2011-01-06 14 views
0

Ich bin neu in der Kombination von C# und Powershell, hoffe aber, eine Webseite zu erstellen, die Powershell im Backend nutzt. Mir ist klar, dass das, was ich mache, nur mit C# erledigt werden kann, aber ich möchte das für andere Anwendungen herausfinden.Powershell in C# Return-Befehlsausgabe

Im Wesentlichen nehme ich den Namen einer neuen Webanwendung aus einem Webformular und erhalte den Benutzernamen des authentifizierten Benutzers für die physische Pfadzuordnung.

Mein Powershell-Code funktioniert korrekt (auch wenn ich ihn direkt von Pipeline.Commands [0] kopiere), aber er scheint nichts zu tun, wenn ich ihn ausführe. Ich erhalte Parameterfehler in der Ergebnisvariablen, wenn ich eine erzwinge (zB: make -physicalpath ein nicht existierender Pfad), aber wenn alle Parameter korrekt sind, enthält das variable Ergebnis nur ein leeres Element.

Ich sehe viele ähnliche Fragen zu diesem, sehe aber keine definitive Antwort.

Scheint das wie ein C# - oder IIS Powershell-Modul Problem? Irgendwelche Ideen, wie ich mehr Informationen bekomme, kamen von meinem Befehl zurück?

protected void Button1_Click(object sender, System.EventArgs e) 
{ 
    String username = getUser(); 
    String physicalPath = "S:\\WebSites\\" + username + "\\public_html\\" + TextBox1.Text; 

    // Create Powershell Runspace 
    Runspace runspace = RunspaceFactory.CreateRunspace(); 

    runspace.Open(); 

    // Create pipeline and add commands 
    Pipeline pipeline = runspace.CreatePipeline(); 
    pipeline.Commands.AddScript(
    "Import-Module WebAdministration; set-psdebug -trace 1; " + 

    "New-WebApplication -Site MySite" + 
    " -Name " + TextBox1.Text + 
    " -PhysicalPath " + physicalPath + 
    " -ApplicationPool WebSites -Verbose -force"); 

    pipeline.Commands.Add("Out-String"); 

    // Execute Script 
    Collection<PSObject> results = new Collection<PSObject>(); 
    try 
    { 
    results = pipeline.Invoke(); 
    } 
    catch (Exception ex) 
    { 
    results.Add(new PSObject((object)ex.Message)); 
    } 

    // Close runspace 
    runspace.Close(); 

    //Script results to string 
    StringBuilder stringBuilder = new StringBuilder(); 
    foreach (PSObject obj in results) 
    { 
    stringBuilder.AppendLine(obj.ToString()); 
    } 

} 

Vielen Dank!

Antwort

0

Das sieht aus wie es funktionieren sollte. Sie sollten den Fehler-Stream überprüfen und sehen, ob dort Nachrichten vorhanden sind (zB: "Zielelement existiert bereits").

Ich würde auch vorschlagen, dass Sie betrachten die Powershell 2 APIs wie in diesem Blog-Eintrag mit:

http://huddledmasses.org/how-to-invoke-powershell-and-use-the-results-from-csharp/

Wenn Sie mit, dass, können Sie die ps.Streams.Error überprüfen, um sicherzustellen, es ist leer ...

+0

Danke Jaykul - ich werde das versuchen, wenn ich eine Chance bekomme und poste zurück. – user566175

+0

@Jykul, Link funktioniert nicht. Ich brauche es jetzt nicht, aber andere Benutzer können von Informationen innerhalb der Antwort oder des aktualisierten Links profitieren. –

+0

Ugh. Du würdest denken, dass die Verbindung zu meinem eigenen Blog sicher wäre, denn warum würde ich das hinnehmen? (lange Geschichte) ... jetzt ist der erste Absatz die Antwort. Der Link war nur ein zusätzlicher Hinweis (und etwas veraltet, weil PowerShell 4 und 5 die APIs weiter verbessert haben). – Jaykul