6 Stimmen

Hilfe benötigt, um Prozess-ID für PsExec.exe in C# zu erhalten?

Ich verwende den folgenden Code, um PsExec.exe aufzurufen, der meine Konsolenanwendung auf zwei Servern aufruft. Ich bin nicht in der Lage, die ProcessId der aufgerufenen Prozesse (meine Konsolenanwendungen) zu erfassen.

process.StandardOutput.ReadToEnd()); liefert mir nur die Servernamen, aber nicht den vollständigen Inhalt.

Können Sie mir bitte helfen, die von PsExec.exe generierten Prozess-IDs auf den Remote-Servern zu erhalten?

        Process process = new Process();
        ProcessStartInfo psi = new ProcessStartInfo(@"PsExec.exe");
        psi.UseShellExecute = false;
        psi.RedirectStandardOutput = true;
        psi.RedirectStandardError = true;
        psi.RedirectStandardInput = true;
        psi.WindowStyle = ProcessWindowStyle.Minimized;
        psi.CreateNoWindow = true;
        psi.Arguments = @"-i -u Username -p xxxxxx \\server1,server2 C:\data\GridWorker\GridWorker.exe 100000";
        process.StartInfo = psi;
        process.Start();

        Console.WriteLine(process.StandardOutput.ReadToEnd());

5voto

Yannick Motton Punkte 32662

Versuchen Sie, die -d Parameter in der PsExec-Befehlszeile.

Warten Sie nicht, bis die Anwendung beendet wird. Verwenden Sie diese Option nur für nicht interaktive Anwendungen.

Dies sollte die Prozess-ID korrekt an StandardError zurückgeben.

Das Beispiel:

ProcessStartInfo psi = new ProcessStartInfo(
    @"PsExec.exe",
    @"-d -i -u user -p password \\server C:\WINDOWS\system32\mspaint.exe")
                           {
                               UseShellExecute = false,
                               RedirectStandardOutput = true,
                               RedirectStandardError = true,
                               RedirectStandardInput = true,
                               WindowStyle = ProcessWindowStyle.Minimized,
                               CreateNoWindow = true
                           };
Process process = Process.Start(psi);

Console.WriteLine(process.StandardError.ReadToEnd());

Ausgabe:

PsExec v1.94 - Execute processes remotely
Copyright (C) 2001-2008 Mark Russinovich
Sysinternals - www.sysinternals.com

C:\WINDOWS\system32\mspaint.exe started with process ID 5896.

0voto

Rob Levine Punkte 38688

Ich glaube nicht, dass Sie PsExec dazu bringen können, die pid so zurückzugeben, wie Sie es wollen.

Sie können jedoch Ihren eigenen Anwendungsstarter-Wrapper als Konsolenanwendung schreiben und diesen die pid zurückgeben lassen. Sie können dann PsExec veranlassen, immer Anwendungen zu starten, indem Sie diesen "AppStarter" aufrufen und so Ihre pid zurückgeben.

Etwas in der Art von:

namespace AppStarter
{
    class Program
    {
        static void Main(string[] args)
        {
            Process process = new Process();
            ProcessStartInfo psi = new ProcessStartInfo(args[0]);
            psi.UseShellExecute = false;
            psi.RedirectStandardOutput = true;
            psi.RedirectStandardError = true;
            psi.RedirectStandardInput = true;
            psi.Arguments = string.Join(" ", args, 1, args.Length - 1);
            process.StartInfo = psi;
            process.Start();
            Console.WriteLine("Process started with PID {0}", process.Id);
        }
    }
}

(dies ist ein grobes und fertiges Beispiel, ohne Ausnahmebehandlung usw. - nur zur Veranschaulichung)

Ihr obiger Code wird nun zu etwas anderem wie

 Process process = new Process();
    ProcessStartInfo psi = new ProcessStartInfo(@"AppStarter.exe");
    psi.UseShellExecute = false;
    psi.RedirectStandardOutput = true;
    psi.RedirectStandardError = true;
    psi.RedirectStandardInput = true;
    psi.WindowStyle = ProcessWindowStyle.Minimized;
    psi.CreateNoWindow = true;
    psi.Arguments = @"PsExec.exe -i -u Username -p 26.06.08 \\server1,server2 C:\data\GridWorker\GridWorker.exe 100000";
    process.StartInfo = psi;
    process.Start();

    Console.WriteLine(process.StandardOutput.ReadToEnd());

0voto

mabra Punkte 383

Soweit ich die ursprüngliche Frage verstanden habe, bestand die Aufgabe darin, die PID der neu gestarteten Prozesse auf den entfernten Rechnern zu ermitteln. Stimmt das so? In diesem Fall ist keine der Antworten wirklich hilfreich.

Sie müssen WMI-Abfragen für jeden Ihrer Remote-Computer erstellen, um die gestarteten Prozesse abzurufen. Dies kann mit Hilfe der "Win32_ProcessStartTrace"-Klassen geschehen.

Wenn Sie weitere Hilfe benötigen, lassen Sie es mich wissen.

br--mabra

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