Powershell в C # Возвращает вывод команды - PullRequest
0 голосов
/ 07 января 2011

Я новичок в объединении C # и Powershell, но надеюсь создать веб-страницу, которая использует Powershell в бэк-энде. Я понимаю, что то, что я делаю, может быть сделано исключительно с C #, но хотел бы выяснить это для других приложений.

По сути, я беру имя нового веб-приложения из веб-формы и получаю имя пользователя, прошедшего проверку подлинности, для сопоставления физических путей.

Мой код Powershell работает правильно (даже при прямом копировании из Pipeline.Commands [0]), но, похоже, он ничего не делает при запуске. Я получаю ошибки параметров в результирующей переменной, если форсирую один (например, сделать -physicalpath несуществующим путем), но при всех правильных параметрах, результат переменной содержит только один пустой элемент.

Я вижу много похожих на этот вопрос вопросов, но не вижу окончательного ответа.

Похоже ли это на проблему с модулем C # или IIS Powershell? Любые идеи, как я могу получить больше информации от моей команды?

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());
  }

}

Спасибо!

1 Ответ

0 голосов
/ 07 января 2011

Похоже, это должно работать.Вы должны проверить поток ошибок и посмотреть, есть ли там сообщения (то есть: «Элемент назначения уже существует»).

Я бы также предложил вам рассмотреть возможность использования API-интерфейсов PowerShell 2, как в этом сообщении в блоге:*

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

Если вы используете это, вы можете проверить ps.Streams.Error, чтобы убедиться, что оно пустое ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...