Управление процессами на локальной машине с использованием ASP .Net - PullRequest
0 голосов
/ 05 января 2012

Я пытаюсь выполнить процесс на удаленном сервере из веб-приложения ASP .Net (обратите внимание, что веб-приложение находится на том же сервере, что и процессы). Код, который я запускаю, выглядит следующим образом:

 ConnectionOptions conO = new ConnectionOptions();
          //  conO.Username = txtUser.Text;
          // conO.Password = txtPassword.Text;

            ManagementPath path = new ManagementPath(@"\\" + txtRemoteComputer.Text + @"\root\cimv2");

            System.Management.ManagementScope oMs = new System.Management.ManagementScope(path, conO);
            oMs.Connect();

            ObjectGetOptions opt = new ObjectGetOptions();
            ManagementClass classInstance = new ManagementClass(oMs, path, opt);
            ManagementBaseObject inParams = classInstance.GetMethodParameters("Create");
            inParams["CommandLine"] = txtPath.Text;
            ManagementBaseObject outParams = classInstance.InvokeMethod("Create", inParams, null);
            lblInfo.Text = outParams["returnValue"].ToString() + " Process ID: {0}" + outParams["processId"].ToString();

Однако я получаю следующую ошибку:

Операция недопустима из-за текущего состояния объекта.

У кого-нибудь есть лучшее решение этой проблемы?

Кстати, у меня есть следующий сценарий:

Мой клиент запускает сервер, на котором у него есть несколько приложений, которые делают много разных вещей (ведение журнала, вычисления ...). Он хочет иметь возможность отслеживать и при необходимости перезапускать эти приложения с веб-клиента (даже с его мобильного телефона).

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

1 Ответ

0 голосов
/ 05 января 2012

Когда вы имеете дело с WMI и получаете сообщение об ошибке, которое вы перечислили, как правило, это означает, что не было данных для возврата из вашего запроса.Глядя на ваш код, кажется, что вы никогда не обращаетесь к тому месту, где хранятся данные процесса.Вам нужно вызвать Win32_Process где-то в вашем коде.Код для получения информации о процессах выглядит следующим образом:

ManagementPath path = new ManagementPath(@"\\" + txtRemoteComputer.Text + @"\root\cimv2");
System.Management.ManagementScope oMs = new System.Management.ManagementScope(path, conO);
oMs.Connect();
ObjectQuery query = new ObjectQuery(
                "SELECT * FROM Win32_Process");
ManagementObjectSearcher searcher =
                new ManagementObjectSearcher(oMs, query);
foreach (ManagementObject queryObj in searcher.Get())
{

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

...