Gibt es in Windows eine Möglichkeit, einen Prozess in C ++ zu starten und dann zu lesen, was es in stdout ausgespuckt hat, wenn es fertig ist? Der Prozess muss bei Bedarf mit erhöhten Rechten (unter Vista oder höher) ausgeführt werden.
Ich benutze derzeit ShellExecuteEx (), um den Prozess zu starten und eine while-Schleife auszuführen, bis GetExitCodeProcess () STILL_ACTIVE nicht mehr über den lpExitCode-Parameter zurückgibt (mit einem WaitForSingleObject () -Aufruf, der während jeder Iteration 100 ms wartet).
Es gibt keinen einfachen Weg, dies zu tun.
Aufruf von ShellExecuteEx()
mit dem runas
Verb sendet eine RPC-Nachricht an den AppInfo NT-Dienst , der dann die Anwendung von einer erhöhten Sitzung aus ausführt. Es gibt keine API, um die Eingabe / Ausgabe des erhöhten Prozesses einfach mit Ihrer Anwendung zu verbinden.
Thomas Hruska in seinem Der Code Project-Artikel präsentiert seine Implementierung einer CreateProcessElevated()
-Funktion das löst das.
Anstatt das erweiterte Programm direkt auszuführen, verwendet CreateProcessElevated()
eine andere ausführbare Datei, die den Namen der stdin, stdout, stderr benannten Pipes erhält und ihre Handles in der erhöhten Sitzung vor dem Aufruf von CreateProcess()
erneut erstellt. .
Sie sollten Ihre Verwendung von ShellExecuteEx durch CreateProcess ersetzen. Das lpStartupInfo -Argument lässt das Std-In- und das Std-Out-Handle von der Prozess. Erstellen Sie einfach eine anonyme Pipe mithilfe von CreatePipe , die Sie als Argumente übergeben. Dieser MSDN-Artikel enthält ein Beispiel dafür, wie Sie dies tun können.
Sie müssen eine benannte Pipe für den untergeordneten Prozess erstellen. Dieser MSDN-Artikel wird erläutert und enthält Codebeispiele.
Sie sollten in der Lage sein, daraus zu kommen.