Führen Sie einen Prozess aus einem windows-Dienst, wie der aktuelle Benutzer
Ich habe derzeit einen windows-Dienst, der unter dem Systemkonto ausgeführt. Mein problem ist, das ich brauchen zum starten bestimmter Prozesse innerhalb des service, wie der momentan angemeldete Benutzer. Ich habe alle Codes etc, um die aktuell angemeldeten Benutzer /Aktive Sitzung.
Mein problem ist, dass ich brauche spawn ein Prozess wie der angemeldete Benutzer aber nicht wissen, die Benutzer-Anmeldeinformationen etc.
Den service ist .net kompiliert Dienst und ich erwarte, dass ich einige Pinvoke Methoden in den Griff zu bekommen von einen der aktuellen Benutzer-Prozess, um es zu duplizieren und Mittagessen als Prozess mit dem Griff.
Leider kann ich nicht finden, eine gute Dokumentation /Lösung, wie man das umsetzen?
Wenn jemand in der Lage ist, mir ein paar Anleitungen /B. ich würde mich sehr freuen.
* Aktualisiert *
Ich denke, ich habe erklärt, dies falsch und müssen reajust nach dem, was ich tatsächlich benötigen. Ich glaube nicht unbedingt, dass die Einführung eines neuen Prozesses, ich will einfach nur, um die Identität des angemeldeten Benutzers. Ich war so eingewickelt schauen, CreateProcess usw ich habe führen mich auf einen Weg der erstellen eines neuen Verfahrens wie der aktuelle Benutzer eingeloggt ist (das ist nicht besonders, was ich tun will).
Wiederum ich möchte nur einige code im Kontext des aktuellen Benutzers die Identität des aktuell Angemeldeten Benutzers)?
- Was ist, wenn kein Benutzer angemeldet hat?
- ich denke, Sie versuchen, Windows service als admin-Konto.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie so Häufig mit dieser Art von Fragen über die Windows-Dienste, die Sie in Betrieb sind in der Mentalität von einer single-user-Betriebssystem. Der ganze Grund, warum Sie sich entschieden haben, schreiben Sie Ihre app als ein service war, weil Sie ausgeführt wurden, zu Konflikten zwischen Ihrem mentalen Modell einer single-user-OS, und die Realität einer multi-user-OS. Leider ein Dienst nicht lösen alle Ihre Probleme, und jetzt sind Sie versuchen, herauszufinden, wie das zu erreichen ist Schritt zwei in der letztlich zum scheitern verurteilt gehackt design.
Tatsache ist,, Sie können nicht garantiert werden, dass es ist eine "angemeldete Benutzer". Wenn niemand angemeldet ist, an die Arbeitsstation, es wird niemand angemeldet, aber Ihr service wird noch ausgeführt werden.
Selbst wenn Sie irgendwie in der Vergangenheit dieser, indem sichergestellt wird, dass jemand immer angemeldet sein (unmöglich), dann würden Sie in die situation, wo mehrere Benutzer angemeldet sind. Dann welches sollte Ihren Dienst beginnen, den Prozess, wie? Sollte es nur wählen, eine von Ihnen zufällig?
Und ist es notwendig, in Ihrem Fall zu unterscheiden zwischen Benutzer lokal angemeldet auf der Konsole und diejenigen, die angemeldet sind, aus der Ferne? Denken Sie daran, dass remote-Benutzer nicht über eine lokale Konsole.
Wenn Sie könnte irgendwie bekommen Vergangenheit alle diese Hürden (leider, wohl, indem er den Kopf in den sand und weiter zu behaupten, dass Windows ist ein single-user-OS), nutzen Sie die
Sie wtsgetactiveconsolesessionid
- Funktion, um die aktuelle session-ID, dieWTSQueryUserToken
- Funktion zum abrufen der Benutzer-token für den jeweiligen session-ID, und dann schließlich dieCreateProcessAsUser
Funktion starten Sie Ihren Prozess in den Kontext des Benutzers. Wenn es einen gibt. Und Sie haben die entsprechenden Berechtigungen. Und der physischen Konsole ist nicht an eine dummy-session. Und du bist nicht auf dem eine server-SKU, die es erlaubt, mehrere active-console-Sitzungen. Und...Wenn Sie entscheiden könnten, auf einen bestimmten Benutzer, dessen Konto Sie verwenden möchten, starten Sie die Hilfs-Prozess, könnten Sie sich anmelden, die Benutzer, zu manipulieren, Ihre Benutzer-token, die der Prozess ausführen, und schließlich schließen Sie die Prozess-und log-out der Benutzer. Die
CreateProcessWithLogonUser
- Funktion umschließt eine Menge von dieser Plackerei für Sie, dass der code viel mehr schlank. Aber der Schein kann trügen, und diese noch einige massive Auswirkungen auf die Sicherheit, die Sie wahrscheinlich nicht ganz verstehen, wenn Sie diese Frage in den ersten Platz. Und Sie können wirklich nicht leisten, nicht zu verstehen Sicherheitsrisiken wie diese.Neben Benutzer, die angemeldet sind, mit
LogonUser
(die ist automatisch für Sie erledigt, wenn Sie dieCreateProcessWithLogonUser
Funktion) fehlt, ist die Arbeitsstation und desktop, auf dem Sie starten können interaktive Prozesse. Also, wenn der Prozess, den Sie ausführen möchten, im Kontext des Benutzers wird jede Art von UI, du bist kein Glück. Windows kill your app, sobald es versucht, Zugriff auf einen desktop, für die es fehlen die erforderlichen Berechtigungen. Es gibt keine Möglichkeit, von einem Windows-Dienst, erhalten Sie das handle des desktop, die nützlich für Sie sein wird (das geht einen langen Weg zur Erklärung der Allgemeinen Regel, die Sie wahrscheinlich bereits wissen, dass die Dienstleistungen nicht anzeigen jeder Art von UI).CreateProcessWithLogonW
wird nicht helfen, da er nicht über Benutzer-Anmeldeinformationen.