¿Qué clase de Windows usar cuando deseo iniciar un proceso de forma remota?

Quiero usar c # y WMI para iniciar un proceso de forma remota en otra computadora. Hice una investigación inicial y descubrí que, en última instancia, tengo que usar una clase de proceso. El “Win32_Process” fue lo primero que pareció obvio usar, sin embargo, parece estar limitado a representar solo procesos locales. ¿Qué otras clases de proceso de Windows puedo usar?

Aquí está lo que el código al usar la clase Win32_ScheduledJob:

static public String RemoteConnect() { try { ConnectionOptions conn = new ConnectionOptions(); conn.Username = @"JV"; conn.Password = @"Nazpal6180"; conn.EnablePrivileges = true; conn.Impersonation = System.Management.ImpersonationLevel.Impersonate; ManagementScope scope = new ManagementScope("\\\\phsd194-JV\\root\\cimv2", conn); //scope.Options.Impersonation = System.Management.ImpersonationLevel.Impersonate; //scope.Options.EnablePrivileges = true; scope.Connect(); ManagementPath managementPath = new ManagementPath("Win32_ScheduledJob"); ObjectGetOptions objectGetOptions = new ObjectGetOptions(); ManagementClass classInstance = new ManagementClass(scope, managementPath, objectGetOptions); object[] objectsIn = new object[7]; objectsIn[0] = "calc.exe"; objectsIn[1] = "********140000.000000+480"; objectsIn[5] = true; object outParams = classInstance.InvokeMethod("Create", objectsIn); String response = "Creation of the process returned: " + outParams; return response; } catch (ManagementException err) { String response = "An error occurred while trying to execute the WMI method: " + err.Message; //Console.WriteLine("An error occurred while trying to execute the WMI method: " + err.Message); return response; } } 

A medida que señala sus comentarios, el método Win32_Process.Create no se puede usar para iniciar un proceso interactivo de forma remota, por lo que, como solución alternativa, puede usar la clase Win32_ScheduledJob con el Create method .

Verifique esta aplicación de muestra, que inicia el bloc de notas en una máquina remota en un minuto, (asumiendo que la hora de la máquina remota es la misma de la máquina local, si no puede obtener la hora local usando Win32_LocalTime o Win32_UtcTime desde la máquina remota y luego convertir a UTC).

 using System; using System.Collections.Generic; using System.Text; using System.Management; namespace ConsoleApplication11 { class Program { private static string DateTimetoUTC(DateTime dateParam) { string buffer = dateParam.ToString("********HHmmss.ffffff"); TimeSpan tickOffset = TimeZone.CurrentTimeZone.GetUtcOffset(dateParam); buffer += (tickOffset.Ticks >= 0) ? '+' : '-'; buffer += (Math.Abs(tickOffset.Ticks) / System.TimeSpan.TicksPerMinute).ToString("d3"); return buffer; } static void Main(string[] args) { try { ConnectionOptions conn = new ConnectionOptions(); conn.Username = "theusername"; conn.Password = "password"; //connectoptions.Authority = "ntlmdomain:"; conn.EnablePrivileges = true; ManagementScope scope = new ManagementScope(@"\\192.168.52.128\root\cimv2", conn); scope.Connect(); Console.WriteLine("Connected"); ObjectGetOptions objectGetOptions = new ObjectGetOptions(); ManagementPath managementPath = new ManagementPath("Win32_ScheduledJob"); ManagementClass classInstance = new ManagementClass(scope, managementPath, objectGetOptions); ManagementBaseObject inParams = classInstance.GetMethodParameters("Create"); inParams["Command"] = @"notepad.exe"; //the itme must be in UTC format string StartTime = DateTimetoUTC(DateTime.Now.AddMinutes(1)); Console.WriteLine(StartTime); inParams["StartTime"] = StartTime; ManagementBaseObject outParams = classInstance.InvokeMethod("Create", inParams, null); Console.WriteLine("JobId: " + outParams["JobId"]); Console.ReadKey(); } catch(ManagementException err) { Console.WriteLine("An error occurred while trying to execute the WMI method: " + err.Message); Console.ReadKey(); } } } } 

Creo que C # tiene solo una clase de Process . Lo he usado para iniciar procesos remotos antes.

Me gustaría una architecture de servidor / cliente donde el servidor pueda iniciar procesos basados ​​en algún tipo de llamada de red.