ich verwende CreateProcessAsUser in C# einen Prozess von einem Dienst mein Dienst muss warten auf den Prozess zu starten, um zu beenden, aber ich weiß nicht, wie ich es tun kann, Ich möchte nicht die Prozess Existenz in Prozessliste verwendenWarten auf Prozess zu beenden, wenn CreateProcessAsUser mit
Antwort
prüfen auf dem Griff warten handhaben würde wickeln aus http://www.pinvoke.net/ für Signaturen. Hier ist ein Beispiel.
const UInt32 INFINITE = 0xFFFFFFFF;
// Declare variables
PROCESS_INFORMATION pi;
STARTUPINFO si;
System.IntPtr hToken;
// Create structs
SECURITY_ATTRIBUTES saThreadAttributes = new SECURITY_ATTRIBUTES();
// Now create the process as the user
if (!CreateProcessAsUser(hToken, String.Empty, commandLine,
null, saThreadAttributes, false, 0, IntPtr.Zero, 0, si, pi))
{
// Throw exception
throw new Exception("Failed to CreateProcessAsUser");
}
WaitForSingleObject(pi.hProcess, (int)INFINITE);
Sie könnten GetExitCodeProcess verwenden, aber beachten Sie, dass diese Funktion sofort zurückkehrt.
Ein anderer Ansatz ist WaitForSingleObject. Dazu muss der Prozess jedoch mit dem Flag SYNCHRONIZE geöffnet werden. Beispiel:
IntPtr hwnd = OpenProcess(SYNCHRONIZE, 0, pid);
if (hwnd != IntPtr.Zero) {
WaitForSingleObject(hwnd, INFINITE);
CloseHandle(hwnd);
}
CreateProcessAsUser
kehrt man eine Struktur PROCESS_INFORMATION
, die hProcess
enthält - Prozess Griff. Dies ist ein gültiger Handle für WaitForSingleObject
/WaitForMultipleObjects
Funktionen.
Die PROCESS_INFORMATION kehrt der Griff in die neu geschaffene Verfahren (hProcess
), die Sie auf dieser Griff warten können, die, wenn der Prozess beendet signalisiert wird geworden.
Sie können SafeWaitHandle kapseln das Handle und dann WaitHandle.WaitOne verwenden, um auf den Prozess zum Beenden warten.
Hier ist, wie man den Prozess
class ProcessWaitHandle : WaitHandle
{
public ProcessWaitHandle(IntPtr processHandle)
{
this.SafeWaitHandle = new SafeWaitHandle(processHandle, false);
}
}
Und dann der folgende Code kann
ProcessWaitHandle waitable = new ProcessWaitHandle(pi.hProcess);
waitable.WaitOne();
- 1. Kill einen Prozess und warten auf den Prozess zu beenden
- 2. Warten auf "1 von vielen Prozess" zu beenden
- 3. Einen Prozess ausführen und beenden, ohne darauf zu warten
- 4. warten Sie einen Prozess in Python-Skript zu beenden
- 5. JavaFX - warten auf Aufgabe zu beenden
- 6. Warten auf alle $ http.get zu beenden
- 7. C# Warten auf mehrere Threads zu beenden
- 8. Warten Sie nicht auf file_get_contents() zu beenden
- 9. jQuery warten auf if-Anweisung zu beenden
- 10. Warten auf Prozess
- 11. Android warten AsyncTask zu beenden
- 12. Warten auf Schleife zum Beenden
- 13. Warten auf Ruby Kind PID zum Beenden
- 14. warten Sie einen Prozess zu beenden und einen anderen Prozess ausführen
- 15. Warten auf Java-Prozess beendet
- 16. Remote-Debugging mit lldb - warten auf Prozess
- 17. Wie Prozess beenden VBScript mit
- 18. Jquery Ajax Anfrage, warten auf die letzte Anfrage zu beenden
- 19. C-Socket: sendet send warten auf recv zu beenden?
- 20. Warten auf .Each zu beenden, bevor Sie fortfahren (Jquery)
- 21. Java - Warten auf Threads von Drittanbietern zu beenden
- 22. Jenkins: Warten Sie auf mehrere Projektabhängigkeiten zu beenden, bevor Sie
- 23. Wie Capybara/Poltergeist warten auf js initiierte Navigation zu beenden?
- 24. Beenden Excel-Prozess
- 25. Implement API zum Warten auf d3d10 Befehle zu beenden
- 26. CreateProcessAsUser vs ShellExecute
- 27. Wie kann ich Reader.ReadString beenden, um auf Benutzereingaben zu warten?
- 28. sp_who2 BlkBy Sleeping Prozess Warten auf Befehl
- 29. CreateProcessAsUser und LogonUser ohne Passwort
- 30. Zombie-Prozess entfernen, ohne zu warten C
Ich habe ein Beispiel hinzugefügt, wie der Prozess behandelt werden kann. –