Запуск процесса из ASP.NET - Почему процесс немедленно умирает? - PullRequest
1 голос
/ 09 ноября 2011

Я пытаюсь запустить процесс из приложения ASP.NET C #. Мое приложение связывается с этим процессом через собственный API-интерфейс процесса (это сторонняя программа). Мне нужно запускать этот процесс только при определенных обстоятельствах, поэтому я не вижу необходимости постоянно запускать его на сервере, следовательно, необходимо запускать процесс из моего приложения.

Процесс, который я использую, настроен на запуск в «безликом» режиме через аргументы командной строки, и поэтому ему не нужен GUI для отображения где-либо. Не отдавая слишком много, он выполняет сложные вычисления с конкретными данными (данные извлекаются из внешнего источника изнутри процесса, и эти данные постоянно обновляются) и предоставляет результаты через API. Мое приложение связывается с этим API, передавая запросы в формате xml и получая ответы в аналогичном формате.

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

Вот мой код, который не работает должным образом:

public static bool ProcessActive() {
    return Process.GetProcesses().Any(p => p.ProcessName.Equals("Process", StringComparison.InvariantCultureIgnoreCase));
}

public static void  StopProcess() {
    List<Process> processExists = Process.GetProcesses().Where(p => p.ProcessName.Equals("Process", StringComparison.InvariantCultureIgnoreCase)).ToList();

    foreach (Process p in processExists) {
        p.Kill();
    }
}

public static bool StartProcess(bool stopIfStarted = false) {
    bool retVal = false;
    using (System.Security.SecureString password = new System.Security.SecureString()) {

        // Set up the variables required to run the process
        ProcessStartInfo pInfo = new ProcessStartInfo(@"C:\Program Files\Program\Program.exe");
        pInfo.Arguments = @"-arg1 -arg2";
        pInfo.WorkingDirectory = @"C:\Program Files\Program";
        pInfo.UserName = "username";
        pInfo.Domain = "DOMAIN";
        password.AppendChar('p');
        /* repeat for other password chars */
        pInfo.Password = password;
        pInfo.UseShellExecute = false;

        if (System.IO.File.Exists(pInfo.FileName)) {

            //Check if the process is already running
            bool processExists = ProcessActive();
            if (stopIfStarted && processExists) {
                StopProcess();
                processExists = ProcessActive();
            }

            //if not, start it.
            if (!processExists) {
                StatusHelper.Log("Process isn't running. Starting process...");
                using (Process realProcess = Process.Start(pInfo)) {
                    processExists = ProcessActive();
                    System.Threading.Thread.Sleep(1000);
                    processExists = ProcessActive();
                    if (realProcess.HasExited) {
                        // Always gets here
                    }
                    retVal = processExists;
                }
            }
        }
    }
    return retVal;
}

Ответы [ 3 ]

2 голосов
/ 09 ноября 2011

Мой способ запустить процесс из ASP .Net 4.0:1. Удаленный класс, который фактически запускает процесс (он запускает Adobe Reader в командной строке для печати PDF)2. Приложение Systray в качестве хоста для удаленного объекта3. Веб-сервис, работающий под .Net 2.0 и под конкретным пользователем, в качестве клиента для удаленного объекта.4. Веб-сайт ASP .Net 4.0 вызывает метод веб-сервиса

Когда процесс запускается из ASP .Net, он "зависает".Я вижу это в диспетчере задач, но он ничего не делает, так что это было единственное решение, которое я нашел.Вы можете разместить удаленный объект в консольном приложении или службе Windows.WCF был бы еще одним хорошим вариантом для удаленного взаимодействия, но я еще не пробовал.

1 голос
/ 09 ноября 2011

Это может не ответить на ваш вопрос, но достаточно надежный способ сделать это, например, установить службу Windows, которая работает с правильными учетными данными и обеспечивает некоторую связь между веб-сервером и службой, например, через личную очередь сообщений или даже некоторыеВеб API.

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

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

0 голосов
/ 09 ноября 2011

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

ИспользованиеStartInfo для получения выходных потоков процесса:

pInfo.StartInfo.RedirectStandardInput = true;
pInfo.StartInfo.RedirectStandardOutput = true;
pInfo.StartInfo.RedirectStandardError = true;
pInfo.StartInfo.ErrorDialog = false;

После запуска процесса вы можете прочитать его так:

StreamReader sOut = pInfo.StandardOutput;
StreamReader sError = pInfo.StandardError;
string standardResult = sOut.ReadToEnd();
string standardError = sError.ReadToEnd();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...