Cómo ejecutar el proceso en máquina remota, en C #

¿Cómo puedo iniciar un proceso en una computadora remota en c #, por ejemplo computer name = “someComputer”, usando System.Diagnostics.Process class?

Creé una pequeña aplicación de consola en esa computadora remota que simplemente escribe “Hola mundo” a un archivo txt, y me gustaría llamarlo de forma remota.

Ruta de la aplicación de consola: c: \ MyAppFolder \ MyApp.exe

Actualmente tengo esto:

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); 

Sigo recibiendo “No se encontró la ruta de red”.

Puede usar PsExec desde http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx

O WMI:

 object theProcessToRun() = { "YourFileHere" }; ManagementClass theClass = new ManagementClass(@"\\server\root\cimv2:Win32_Process"); theClass.InvokeMethod("Create", theProcessToRun); 

Use uno de los siguientes:

O si tiene ganas, inyecte su propio servicio o componente COM. Eso sería muy parecido a lo que hace PsExec.

De todos estos métodos, prefiero el progtwigdor de tareas. La API más limpia de todas, creo. Conéctese al progtwigdor de tareas remotas, cree una nueva tarea para el ejecutable, ejecútelo. Nota: el nombre del ejecutable debe ser local para esa máquina. Not \ servername \ path \ file.exe, pero c: \ path \ file.exe. Borre la tarea si lo desea.

Todos esos métodos requieren que tenga acceso administrativo a la máquina de destino.

ProcessStartInfo no es capaz de iniciar procesos remotos.

Según MSDN , un objeto de Process solo permite el acceso a procesos remotos, no la capacidad de iniciar o detener procesos remotos. Entonces, para responder a su pregunta con respecto al uso de esta clase, no puede.

Un ejemplo con WMI y otras credenciales como el proceso actual, en forma predeterminada usaba el mismo usuario que se ejecuta el proceso.

 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($@"\\{hostname}\root\cimv2", connection); wmiScope.Connect(); using (var managementClass = new ManagementClass(wmiScope, new ManagementPath("Win32_Process"), new ObjectGetOptions())) { managementClass.InvokeMethod("Create", theProcessToRun); } 

No creo que pueda iniciar un proceso directamente a través de una ruta UNC; es decir, si System.Process usa el comspec de Windows para iniciar la aplicación … ¿qué le parece probar esta teoría asignando un disco a “\ someComputer \ somePath”, y luego cambiando su creación de ProcessStartInfo a eso? Si funciona de esa manera, entonces puede considerar mapear temporalmente un disco de forma programática, iniciar su aplicación y luego eliminar el mapeo (al igual que pushd / popd funciona desde una ventana de comandos).