2010-09-15 15 views
5

Estoy usando .NET, y me estoy volviendo loca tratando de encontrar cualquier API útil que me permita transferir un archivo a través de una red LAN (a través de credenciales de administrador por supuesto) y luego ejecutarlo en esa máquina..NET - Copia de un ejecutable a través de LAN en otra computadora y ejecutándolo

He leído algo usando WMI, pero buscar en Google ".NET WMI copy files" o ".NET WMI execute files" no me ayuda en absoluto.

Cualquier referencia sería muy apreciada.

EDITAR

no puedo utilizar una herramienta de terceros tales como PsExec (aunque lo hace a la perfección lo que necesito). Esto se debe a la licencia involucrada con PsExec. No puedo distribuirla con mi aplicación.

+0

¿Qué tipo de acceso tiene? ¿Puedes instalar algo en la máquina de destino y en la máquina local? – Rudu

+0

@Rudi: Sí, tengo derechos de administrador en todas las máquinas de la LAN. –

Respuesta

1

No creo que esto se logre fácilmente. Sin embargo, puedes copiar el exe con .net. Y luego (también desde .net, con Process.Start) invoque psExec y haga que ejecute el programa de forma remota.

+0

Lamentablemente no puedo usar herramientas de terceros como PsExec. Necesito hacer esto directamente a través de la API .NET u otros medios nativos. –

+0

También el enlace oficial en microsoft dice esto sobre la clase de proceso: 'Proporciona acceso a procesos locales y remotos y le permite iniciar y detener procesos del sistema local. Así que Process.Start solo funciona para iniciar procesos ** locales **. –

+0

@Luca Matteis, tiene razón, pero estaba hablando de usar Process.Start para invocar a psExec. –

0

En máquinas que no tienen habilitado PowerShell 2.0 remoting, creo que la herramienta de línea de comandos PsExec es muy útil. Requiere permisos de administración en la máquina remota.

3

Sé que han pasado años, pero se toparon con este desafío y se cruzaron con este post (entre otros) por lo que van a compartir la solución en caso de que ayude a alguien a seguir adelante. Se puede usar para mover cualquier archivo que desee sobre WMI.

Solución:

1: Convertir EXE de base 64

byte[] bytes = File.ReadAllBytes(pathToExe); 
String file = Convert.ToBase64String(bytes); 

2: Echo Base 64 a un archivo a través de WMI y decodificar con certutil

ConnectionOptions co = new ConnectionOptions(); 

// isLocal is a variable indicating whether machine name/IP is local  
if (!isLocal) { 
    co.Username = "domainOrMachine\accountName"; 
    co.Password = "password for account"; 
    co.EnablePrivileges = true; 
    co.Impersonation = ImpersonationLevel.Impersonate; 
} 

//ip is a vaiable holding the target endpoint 
ManagementScope s = new ManagementScope(@"\\" + ip + @"\root\cimv2", co); 
s.open(); 

ObjectGetOptions ogo = new ObjectGetOptions(); 
ManagementClass prog = new ManagementClass(s, new 
ManagementPath("Win32_Process"), ogo); 
ManagementBaseObject mbo = prog.GetMethodParameters("Create"); 

mbo["CommandLine"] = @"cmd /c ""echo " + base64String + @" > c:\windows\temp\b64_exec.txt && certutil -decode c:\windows\temp\b64_exec.txt c:\windows\temp\b64_exec.exe && c:\windows\temp\b64_exec.exe"""; 

prog.InvokeMethod("Create", mbo, null); 

Ahora, hay algunos gotcha's que deben ser resaltados

  • Todo el comando pasado no puede tener una longitud mayor a 8191 caracteres, la longitud máxima de un comando
  • Puede dividir el archivo base64 y enviarlo en varios fragmentos, simplemente recuerde que> canaliza a un nuevo archivo o sobrescribe un archivo existente y >> agrega o agrega a un archivo existente.
  • También querrá emitir un comando del para limpiar el archivo base64, dependiendo de la habitación disponible, es posible que deba realizar una segunda llamada WMI para invocarlo.

En mi caso, yo no quería enviar un archivo de 2 MB completo 7000 caracteres a la vez, así que creé un simple descargador de .NET que compila a menos de 6 KB y tengo todo en un solo estado (como se indicó anteriormente.) Descarga mi ejecutable y cuando se completa (cuando veo el archivo que quiero, consultado por WMI) simplemente lo borro sobre WMI.

Cuestiones relacionadas