15 Stimmen

Ausführen eines Prozesses auf einem entfernten Rechner, in C#

Wie kann ich einen Prozess auf einem Remote-Computer in c# starten, sagen Computername = "someComputer", mit System.Diagnostics.Process Klasse?

Ich habe auf dem entfernten Computer eine kleine Konsolenanwendung erstellt, die einfach "Hello world" in eine txt-Datei schreibt, und ich möchte sie aus der Ferne aufrufen.

Pfad der Konsolenanwendung: c: \MyAppFolder\MyApp.exe

Derzeit habe ich dies:

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

Ich erhalte ständig die Meldung "Netzwerkpfad wurde nicht gefunden".

17voto

Ivan G. Punkte 4812

PsExec kann verwendet werden von http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx

Oder WMI:

object theProcessToRun() = { "YourFileHere" };

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

theClass.InvokeMethod("Create", theProcessToRun);

1 Stimmen

Ich habe eine CW-Antwort auf MSDN zur Process-Klasse veröffentlicht, die Sie in Ihre Antwort integrieren sollten, um die Frage zur Verwendung von Process abzudecken.

0 Stimmen

Danke für Ihre Antwort? Übrigens, wissen Sie, ob SysInternals volle offizielle Unterstützung von Microsoft haben?

5 Stimmen

Übrigens muss "YourFileHere" der lokale Pfad zum Server sein, und Sie können Parameter daran anhängen, z. B. " C:\\Whatever\\Whatever.exe -param1 -param2" und "server" in dieser Zeichenfolge muss der tatsächliche Servername oder die IP-Adresse sein, z. B. " \\localhost\root\cimv2 :Win32_Prozess"

15voto

Seva Alekseyev Punkte 57252

Verwenden Sie eine der folgenden Möglichkeiten:

Wenn Sie möchten, können Sie auch Ihren eigenen Dienst oder Ihre eigene COM-Komponente einfügen. Das käme dem, was PsExec tut, sehr nahe.

Von all diesen Methoden bevorzuge ich den Aufgabenplaner. Die sauberste API von allen, denke ich. Verbinden Sie sich mit dem entfernten Taskplaner, erstellen Sie einen neuen Task für die ausführbare Datei und führen Sie ihn aus. Hinweis: Der Name der ausführbaren Datei sollte lokal in dass Maschine. Nicht \servername\path\file.exe , sondern c: \path\file.exe. Löschen Sie die Aufgabe, wenn Sie Lust dazu haben.

Alle diese Methoden setzen voraus, dass Sie administrativen Zugriff auf den Zielcomputer haben.

ProcessStartInfo ist nicht in der Lage, entfernte Prozesse zu starten.

1 Stimmen

Tun Sie Task Scheduler für Präferenz. Siehe diese Antwort für eine Veranschaulichung: stackoverflow.com/questions/6178437/

0 Stimmen

Eine weitere Option, die nützlich sein kann, wenn der Zielcomputer ein SQL-Server ist, ist xp_CMDShell

7voto

Austin Salonen Punkte 47404

Selon MSDN , a Process Objekt erlaubt nur Zugang zu entfernten Prozessen, nicht die Fähigkeit, entfernte Prozesse zu starten oder zu stoppen. Um Ihre Frage in Bezug auf die Verwendung dieser Klasse zu beantworten: Sie können es nicht.

4voto

live2 Punkte 3057

Ein Beispiel mit WMI und anderen Anmeldeinformationen als der aktuelle Prozess, standardmäßig wird derselbe Benutzer verwendet, unter dem der Prozess läuft.

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($@"\\{hostname}\root\cimv2", connection);
wmiScope.Connect();
using (var managementClass = new ManagementClass(wmiScope, new ManagementPath("Win32_Process"), new ObjectGetOptions()))
{
    managementClass.InvokeMethod("Create", theProcessToRun);
}

0 Stimmen

Können Sie mir sagen, ob ich auf diesem Rechner irgendwo eine Bat-Datei gespeichert habe, wie ich diese ausführen kann? Mit dynamischen Parametern.

-5voto

F3. Punkte 19

Ich glaube nicht, dass man einen Prozess direkt über einen UNC-Pfad starten kann; das heißt, wenn System.Process die Windows-Comspec verwendet, um die Anwendung zu starten... wie wäre es, wenn Sie diese Theorie testen, indem Sie ein Laufwerk auf " \someComputer\somePath ", und ändern Sie dann Ihre Erstellung der ProcessStartInfo auf diese Weise? Wenn es auf diese Weise funktioniert, sollten Sie in Erwägung ziehen, ein Laufwerk vorübergehend programmatisch zuzuordnen, Ihre Anwendung zu starten und dann die Zuordnung zu entfernen (ähnlich wie pushd/popd in einem Befehlsfenster funktioniert).

2 Stimmen

Ich denke, das würde nur dazu führen, dass der lokale Rechner die entfernte ausführbare Datei liest und sie lokal ausführt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X