Я пытаюсь запустить процесс из приложения 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;
}