2010-02-26 42 views
13

¿Cómo puedo iniciar un proceso en una computadora remota en C#, por ejemplo nombre de la computadora = "alguna Computadora", usando System.Diagnostics.Process class?Cómo ejecutar el proceso en una máquina remota, en C#

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

consola ruta aplicación: C: \ MyAppFolder \ MyApp.exe

Actualmente tengo unas pocas cosas:

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

Me pone "no se encontró la ruta de red".

Respuesta

17

puede puede utilizar PsExec de 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); 
+1

Publiqué una respuesta CW citando MSDN en la clase de proceso que debe incorporar en su respuesta para cubrir la pregunta sobre el uso de proceso. –

+0

tks para su respuesta? Por cierto, ¿sabes si SysInternals tiene soporte oficial completo por microsoft? – DJPB

+4

Por cierto, "YourFileHere" debe ser la ruta local al servidor, y puede agregarle parámetros, p. Ej. "C: \\ Lo que sea \\ Whatever.exe -param1 -param2" y "servidor" en esa cadena debe ser el nombre real del servidor o IP, p. "\\ localhost \ root \ cimv2: Win32_Process" –

-4

No creo que se puede iniciar un proceso a través de una ruta UNC directamente; 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).

+2

Creo que eso solo daría como resultado que la máquina local lea el archivo ejecutable remoto y lo ejecute localmente. –

6

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

14

Use uno de los siguientes:

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

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

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

ProcessStartInfo no es capaz de iniciar procesos remotos.

+1

Haga el programador de tareas para preferencia. Vea esta respuesta para una ilustración: http://stackoverflow.com/questions/6178437/start-remote-process-within-thetext/8818377#8818377 – Ben

+0

Otra opción que puede ser útil si la máquina de destino es un servidor SQL, es xp_CMDShell –

1

Un ejemplo con WMI y otras credenciales como el proceso actual, en forma predeterminada usaba el mismo usuario que 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([email protected]"\\{hostName}\root\cimv2", connection); 
wmiScope.Connect(); 
using (var managementClass = new ManagementClass(wmiScope, new ManagementPath("Win32_Process"), new ObjectGetOptions())) 
{ 
    managementClass.InvokeMethod("Create", theProcessToRun); 
} 
Cuestiones relacionadas