Не удается запустить процесс удаленно с помощью psexec.exe - PullRequest
0 голосов
/ 26 апреля 2018

У меня проблема с удаленным запуском процесса с помощью psexec.exe.Мое решение выглядит так, у меня на сервере есть сценарий cmd, который запускает мое консольное приложение.Задача приложения - запустить тестовый запуск с помощью vstest.console.exe с помощью следующего кода:

  var config = LoadConfigFromFile<DeploymentStorage>(configFile);

  var currentDateTime = DateTime.Now;
  var resultFileName = String.Format("testresults{0}{1}{2}{3}{4}{5}.trx",
      currentDateTime.Year, currentDateTime.Month, currentDateTime.Day, currentDateTime.Hour, currentDateTime.Minute, currentDateTime.Second);

  ProcessStartInfo processInfo =
      new ProcessStartInfo(config.TestSettings.First(x => x.Key == "MSTestLocation").Value,
      "\"" + config.TestSettings.First(x => x.Key == "TestContainer").Value + "\" /logger:trx;LogFileName=\"" + 
      config.TestSettings.First(x => x.Key == "TestResultLocation").Value + resultFileName + "\"");
  processInfo.CreateNoWindow = true;
  processInfo.UseShellExecute = false;
  processInfo.RedirectStandardError = true;
  processInfo.RedirectStandardOutput = true;

  var process = Process.Start(processInfo);

  process.OutputDataReceived += (object sender, DataReceivedEventArgs e) =>
      Console.WriteLine("output>>" + e.Data);
  process.BeginOutputReadLine();

  process.ErrorDataReceived += (object sender, DataReceivedEventArgs e) =>
      Console.WriteLine("error>>" + e.Data);
  process.BeginErrorReadLine();

  process.WaitForExit();

  var exitCode = process.ExitCode;

  Console.WriteLine("ExitCode: {0}", exitCode);
  process.Close();

Если я запускаю этот скрипт локально на сервере, все работает нормально, запускается тестовый запуск.Но если я запускаю этот скрипт удаленно через мой локальный компьютер с помощью psexec.exe, я получаю следующую ошибку:

Не удалось поставить в очередь тестовый запуск '[Servername] 2018-04-24 15:17: 20 ': Невозможно запустить процесс агента.

Это не проблема psexec.exe, с помощью этого инструмента я могу запускать другие программы и сценарии cmd, я могу напрямую запустить vstest.console.exe с ним тоже, но мне нужно запустить тесты через мое консольное приложение.

Почему psexec.exe не запускает мое приложение?Я что-то упускаю при настройке процесса?

РЕДАКТИРОВАТЬ: я запускаю psexec.exe с помощью следующей команды на моем локальном компьютере:

C:\Programs\PSTools\psexec.exe \\my-server -h C:\TestApp\MyTestTool.exe TEST C:\TestApp\base.config.xml

Где TEST и путь к base.config.xml - это аргументы, передаваемые консольному приложению.

EDIT2: Кажется, я неправильно истолковал свою проблему.Я запускаю команду psexec.exe из командной строки на моем локальном компьютере.Он должен запустить мое консольное приложение под названием TestApp на сервере.Это консольное приложение на сервере должно запускать vstest.console.exe с помощью приведенного выше кода, а не psexec.exe, и оно не может этого сделать.Надеюсь, что это немного понятнее.

EDIT3: Хорошо, теперь я знаю, в чем заключается проблема, я не могу запускать тесты удаленно, если мой тестовый контейнер представляет собой файл * .orderedtest.Если я попытаюсь запустить тест, установив dll в качестве тестового контейнера, все будет нормально.

1 Ответ

0 голосов
/ 26 апреля 2018

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

1) Возможно, вам потребуется выполнить ваше приложение с правами администратора

См. Ответы здесь, чтобы узнать, как это сделать: Предоставление приложения с повышенными правами UAC

2) Убедитесь, что у вас включены правильные аргументы для PSEXEC. Вы должны убедиться, что пользователь, под которым вы пытаетесь выполнить на удаленном компьютере, имеет правильные права доступа.

Я предлагаю попробовать выполнить PSEXEC в точности так, как вам требуется из расширенного локального приглашения CMD, чтобы убедиться, что это правильно.

Полные аргументы можно найти здесь: https://docs.microsoft.com/en-us/sysinternals/downloads/psexec

Затем в своем коде убедитесь, что PSEXEC указан как FileName, а все остальное указано в качестве аргументов.
Убедитесь, что пути заключены в двойные кавычки

Вот пример, который я использовал;

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.UseShellExecute = false;
startInfo.FileName = "C:\Data\Utils\psexec.exe";
startInfo.Arguments = "-u xxxx -p xxxx -accepteula" + " " + "\\\\remotemachine" + " " + "\"c:\\full\\path\\on\\remote\\machine\\myexecuteable.exe\"" + " " + " - other - agrs";
Process nProc = Process.Start(startInfo);
nProc.WaitForExit();
...