Запуск процесса из ASP.NET - PullRequest
       5

Запуск процесса из ASP.NET

1 голос
/ 08 декабря 2011

Я запускаю ASP веб-приложение, которое должно запустить Powershell script на сервере. Для запуска Powershell script необходимо много прав Домена. Поэтому я запускаю apppool под пользователем, у которого есть все права. Но когда я запускаю сценарий powershellscript, я всегда получаю сообщение о том, что доступ запрещен.

Кто-нибудь знает, как решить проблему?

Когда я запускаю процесс, как описано, выполняется ли этот процесс под usercontext пула приложений или под usercontext пользователя, который вошел в веб-приложение ASP.NET?

Я пробовал два метода 1.

string cmdArg = "C:\\Scripts\\test.ps1 " + username;
            Runspace runspace = RunspaceFactory.CreateRunspace();
            runspace.Open();
            Pipeline pipeline = runspace.CreatePipeline();

            pipeline.Commands.AddScript(cmdArg);
            pipeline.Commands[0].MergeMyResults(PipelineResultTypes.Error, PipelineResultTypes.Output);
            Collection<PSObject> results = pipeline.Invoke();
            runspace.Close();

            StringBuilder stringBuilder = new StringBuilder();
            foreach (PSObject obj in results)
            {
                stringBuilder.AppendLine(obj.ToString());
              string test =  Environment.UserName;
            }
            return results[0].ToString();

2

string cmdArg = "C:\\Scripts\\test.ps1 " + username;
Process myProcess = new Process();
          ProcessStartInfo myProcessStartInfo = new ProcessStartInfo("powershell.exe",cmdArg);

            myProcessStartInfo.UseShellExecute = false;
            myProcessStartInfo.RedirectStandardOutput = true;
            myProcess.StartInfo = myProcessStartInfo;

            myProcess.Start();
            StreamReader myStreamReader = myProcess.StandardOutput;
            myProcess.WaitForExit();
            string myString = myStreamReader.ReadLine();

            return myString;

Хорошо, вы думаете, что запускать Apppool с этими большими правами не лучшая практика.

Как насчет размещения веб-службы между? Веб-сервис находится в домене приложения, доступном только с localhost?

Обновление Хорошо, я написал веб-сервис asp.net. Веб-сервис работает в пуле приложений со всеми правами, но доступен только с localhost. Веб-сервис содержит код для запуска скрипта. Веб-приложение ASP MVC3 работает в пуле приложений практически без прав. Но когда выполняется веб-метод, я всегда получаю ошибку, которая говорит мне, что у меня нет прав. Я пытался установить в роли webconfig «заменитель» false, но безуспешно.

Кто-нибудь знает, как решить эту проблему?

Обновление:

Я прочитал текущего пользователя, который запускает PowerShell, когда я запускаю его из веб-службы. Я говорю, что у пользователя есть все права. Но ps выдает ошибки типа: вы не можете запустить метод со значением null.

Тогда я попытался запустить ps с runas как пользователь низкого уровня. Я получаю те же ошибки.

Тогда я попытался запустить ps с тем же пользователем, что и в веб-сервисе, и все заработало!

Есть ли кто-нибудь, кто мог бы объяснить это явление? А чем отличается мой код выше от рун? (тот же пользовательский контекст)

спасибо большое!

Ответы [ 2 ]

0 голосов
/ 14 декабря 2011

Запуск нового процесса в HTTP-запросе не очень хорош для производительности, а также может представлять угрозу безопасности.Однако до того, как ASP.NET и другие современные веб-серверы стали доступны, единственным способом обслуживания контента (помимо статических файлов) было выполнение программы в отдельном процессе.

API для этого, называемый Общий интерфейс шлюза (CGI) и все еще поддерживается IIS.При правильной настройке вы можете запускать программу для каждого запроса.

Я не уверен, что вы можете использовать CGI для выполнения сценария, но затем вы можете создать фильтр ISAPI, который будет выполнять PowerShell для файлов с расширением * 1007.*.Это в основном то, как, например, php.exe выполняется в новом процессе, когда запрашивается файл с расширением .php.

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

Если вы хотите иметь возможность удаленного запуска сценариев PowerShell и ничего другого, вам также должно быть легко написать небольшой HTTP-сервер в PowerShell.полностью удаляя IIS и ASP.NET из уравнения.

0 голосов
/ 08 декабря 2011

Полагаю, это зависит только от настроек олицетворения. Если олицетворение включено, то используется текущий зарегистрированный пользователь, в противном случае пользователь пула приложений

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