Как выполнить процесс на удаленном компьютере, в С#
Как я могу запустить процесс на удаленном компьютере в С#, скажем, имя компьютера = "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 работает из окна команд).