2010-02-26 13 views
13

Jak rozpocząć proces na komputerze zdalnym w języku C#, na przykład nazwa komputera = "someComputer", używając klasy System.Diagnostics.Process?Jak wykonać proces na komputerze zdalnym, w języku C#

Stworzyłem małą aplikację konsolową na tym komputerze zdalnym, która po prostu zapisuje "Hello world" do pliku txt i chciałbym go nazwać zdalnie.

Console app ścieżka: C: \ FolderMojejAplikacji \ MojaAplik.exe

Obecnie mam to:

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

ciśgle "Ścieżka sieciowa nie została znaleziona".

Odpowiedz

17

Czy można używać PsExec z http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx

Albo WMI:

object theProcessToRun() = { "YourFileHere" }; 

ManagementClass theClass = new ManagementClass(@"\\server\root\cimv2:Win32_Process"); 

theClass.InvokeMethod("Create", theProcessToRun); 
+1

Wysłałem odpowiedź CW z podaniem MSDN na temat klasy Proces, którą powinieneś włączyć do swojej odpowiedzi, aby pokryć pytanie dotyczące używania procesu. –

+0

tks za odpowiedź? Przy okazji, czy wiesz, czy SysInternals ma pełne oficjalne wsparcie przez Microsoft? – DJPB

+4

Btw, "YourFileHere" musi być ścieżką lokalną do serwera i można do niej dodać parametry, np. "C: \ \ Cokolwiek \\ Whatever.exe -param1 -param2" i "serwer" w tym łańcuchu musi być rzeczywistą nazwą serwera lub adresem IP, np. "\\ localhost \ root \ cimv2: Win32_Process" –

-4

nie wierzę, można rozpocząć proces poprzez ścieżkę UNC bezpośrednio; to znaczy, jeśli System.Process używa Windows Comspec do uruchomienia aplikacji ... co powiesz na testowanie tej teorii, mapując dysk na "\ someComputer \ somePath", a następnie zmieniając tworzenie ProcessStartInfo na to? Jeśli działa w ten sposób, możesz rozważyć chwilowe mapowanie dysku programowo, uruchomić aplikację, a następnie usunąć mapowanie (podobnie jak działa pushd/popd z okna poleceń).

+2

Myślę, że to po prostu spowodowałoby, że lokalny komputer odtworzy zdalny plik wykonywalny i uruchomi go lokalnie. –

6

Zgodnie z MSDN, obiekt zezwala tylko dostęp do procesów zdalnych nie zdolność do uruchamiania lub zatrzymywania procesów zdalnych. Aby odpowiedzieć na twoje pytanie dotyczące używania tej klasy, nie możesz.

14

Użyj jednej z następujących czynności:

Lub jeśli masz na to ochotę, wstrzyknij własną usługę lub komponent COM. Byłoby to bardzo zbliżone do tego, co robi PsExec.

Ze wszystkich tych metod preferuję harmonogram zadań. Najczystsze API z nich wszystkich, myślę. Połącz się ze zdalnym programem do planowania zadań, utwórz nowe zadanie dla pliku wykonywalnego, uruchom go. Uwaga: nazwa pliku wykonywalnego powinna być lokalna dla maszyny , która to maszyna to. Nie \ nazwa_serwera \ ścieżka \ plik.exe, ale c: \ ścieżka \ plik.exe. Usuń zadanie, jeśli masz na to ochotę.

Wszystkie te metody wymagają administracyjnego dostępu do komputera docelowego.

ProcessStartInfo nie może uruchamiać procesów zdalnych.

+1

Wykonaj Harmonogram zadań dla preferencji. Zobacz tę odpowiedź w celu uzyskania ilustracji: http://stackoverflow.com/questions/6178437/start-remote-process-within-the-context/8818377#8818377 – Ben

+0

Inna opcja, która może być przydatna, jeśli maszyna docelowa jest serwerem SQL, jest xp_CMDShell –

1

Przykład z WMI i innymi danymi uwierzytelniającymi jako bieżącym procesem, domyślnie użył tego samego użytkownika co proces.

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); 
} 
Powiązane problemy