Thursday, August 27, 2009

Запуск скрипта на Powershell через GET запрос

Как-то понадобилась нам хитрая штука: передавать через строку браузера некоторое количество параметров в скрипт на Powershell, потом получать от него Exit Code и его выводить.
Я долго читал про разные способы запуска PS из C#, изучил пространства имён
System.Collections.ObjectModel, System.Management.Automation и System.Management.Automation.Runspaces так, что они начали сниться мне по ночам, Firefox ломился от табов вроде такого и такого..
А потом меня, как водится, осенило. От самого скрипта мне не нужно было никакого вывода: только код завершения. Поэтому вполне можно было не заморачиваться с обработкой PS через C#, а сделать намного проще.
Сначала получаем параметры из GET-запроса в строке:
  1. string strParameters = "";
  2. foreach (string strParameter in Request.QueryString)
  3. {
  4. strParameters += " " + strParameter + ":" + Request.QueryString[strParameter];
  5. }
* This source code was highlighted with Source Code Highlighter.

А потом запускаем процесс со скриптом и параметрами. Что самое забавное, этот скрипт довольно универсален: имя скрипта тоже можно передавать в качестве параметра.
  1. Process Powershell = null;
  2. if (File.Exists(strScriptDirectory + strScriptName))
  3. {
  4. Powershell = Process.Start("powershell", @"-noexit -command " + strScriptDirectory + strScriptName + strParameters);
  5. while (!Powershell.WaitForExit(1000)) ;
  6. strExitCode = Powershell.ExitCode.ToString();
  7. }
* This source code was highlighted with Source Code Highlighter.

Как обычно, всё гениальное просто. Надеюсь, кому-нибудь это поможет:)

2 comments:

  1. ))
    Под страхом вечных мук запретил бы такой код на любой странице!!!
    Дыра в безопастности сайта размером с САМОЛЕТ)
    "ЗАХОДИ ДОБРЫЙ МОЛОДЕЦ, ДЕЛАЙ НА МОЕМ СЕРВЕРЕ ВСЕ ЧТО УГОДНО"

    ReplyDelete
  2. Это же не на внешне-доступном сайте делается, а на внутреннем сервере, для запуска вполне определённых штук :)

    ReplyDelete