Come eseguire il processo sulla macchina remota, in C #

Come posso avviare un processo su un computer remoto in c #, ad esempio nome computer = “someComputer”, utilizzando la class System.Diagnostics.Process?

Ho creato una piccola app per console su quel computer remoto che scrive “Hello world” in un file txt, e vorrei chiamarlo da remoto.

Percorso app della console: c: \ MyAppFolder \ MyApp.exe

Attualmente ho questo:

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

Continuo a ricevere “Percorso di rete non trovato”.

    Può usare PsExec da 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); 

    Utilizzare uno dei seguenti:

    Oppure, se ne hai voglia, inserisci il tuo servizio o componente COM. Sarebbe molto vicino a ciò che fa PsExec.

    Di tutti questi metodi, preferisco l’utilità di pianificazione. L’API più pulita di tutti, penso. Connettersi all’utilità di pianificazione remota, creare una nuova attività per l’eseguibile, eseguirla. Nota: il nome dell’eseguibile deve essere locale per quella macchina. Non \ servername \ path \ file.exe, ma c: \ path \ file.exe. Elimina l’attività se ne hai voglia.

    Tutti questi metodi richiedono l’accesso amministrativo al computer di destinazione.

    ProcessStartInfo non è in grado di avviare processi remoti.

    Secondo MSDN , un object Process consente solo l’ accesso ai processi remoti e non la possibilità di avviare o arrestare processi remoti. Quindi per rispondere alla tua domanda riguardo all’uso di questa class, non puoi.

    Un esempio con WMI e altre credenziali come processo corrente, in base all’impostazione predefinita utilizzava lo stesso utente dell’esecuzione del processo.

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

    Non credo che tu possa avviare direttamente un processo attraverso un percorso UNC; cioè, se System.Process usa il comando windows per avviare l’applicazione … che ne dici di testare questa teoria mappando un’unità a “\ someComputer \ somePath”, quindi modificando la tua creazione di ProcessStartInfo? Se funziona in questo modo, puoi prendere in considerazione l’ipotesi di mappare temporaneamente un’unità in modo programmatico, avviare la tua app, quindi rimuovere la mapping (proprio come pushd / popd funziona da una finestra di comando).