Как выполнить процесс на удаленном компьютере, в С#

Как я могу запустить процесс на удаленном компьютере в С#, скажем, имя компьютера = "someComputer", используя класс System.Diagnostics.Process?

Я создал небольшое консольное приложение на этом удаленном компьютере, которое просто пишет "Hello world" в txt файл, и я хотел бы назвать его удаленно.

Путь к консоли: c:\MyAppFolder\MyApp.exe

В настоящее время у меня есть это:

ProcessStartInfo startInfo = new ProcessStartInfo(string.Format(@"\\{0}\{1}", someComputer, somePath);

            startInfo.UserName = "MyUserName";
            SecureString sec = new SecureString();
            string pwd = "MyPassword";
            foreach (char item in pwd)
            {
                sec.AppendChar(item);
            }
            sec.MakeReadOnly();
            startInfo.Password = sec;
            startInfo.UseShellExecute = false;

            Process.Start(startInfo);

Я продолжаю получать "Сетевой путь не найден".

Ответы

Ответ 1

Может использовать PsExec из http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx

Или WMI:

object theProcessToRun() = { "YourFileHere" };

ManagementClass theClass = new ManagementClass(@"\\server\root\cimv2:Win32_Process");

theClass.InvokeMethod("Create", theProcessToRun);

Ответ 2

Используйте одно из следующих действий:

Или, если вам так хочется, введите свой собственный сервис или компонент COM. Это было бы очень близко к тому, что делает PsExec.

Из всех этих методов я предпочитаю планировщик задач. По-моему, самый чистый API из них. Подключитесь к удаленному планировщику задач, создайте новую задачу для исполняемого файла, запустите его. Примечание: исполняемое имя должно быть локальным для этого устройства. Не \servername\path\file.exe, но c:\path\file.exe. Удалите задачу, если вам это нравится.

Все эти методы требуют наличия административного доступа к целевой машине.

ProcessStartInfo не может запускать удаленные процессы.

Ответ 3

Согласно MSDN, объект Process разрешает доступ к удаленным процессам, а не возможность запуска или остановки удаленных процессов. Поэтому, чтобы ответить на ваш вопрос относительно использования этого класса, вы не можете.

Ответ 4

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

var hostname = "server"; //hostname or a IpAddress

var connection = new ConnectionOptions();
//The '.\' is for a local user on the remote machine
//Or 'mydomain\user' for a domain user
connection.Username = @".\Administrator";
connection.Password = "passwordOfAdministrator";

object[] theProcessToRun = { "YourFileHere" }; //for example notepad.exe

var wmiScope = new ManagementScope([email protected]"\\{hostName}\root\cimv2", connection);
wmiScope.Connect();
using (var managementClass = new ManagementClass(wmiScope, new ManagementPath("Win32_Process"), new ObjectGetOptions()))
{
    managementClass.InvokeMethod("Create", theProcessToRun);
}

Ответ 5

Я не верю, что вы можете начать процесс через UNC-путь напрямую; то есть, если System.Process использует windows comspec для запуска приложения... как насчет того, чтобы вы протестировали эту теорию, сопоставив диск с "\ someComputer\somePath", а затем изменив ваше создание ProcessStartInfo на это? Если это так, то вы можете захотеть временно отобразить диск программно, запустить приложение, а затем удалить сопоставление (так же, как pushd/popd работает из окна команд).