Starten Sie das Programm beim Start des Computers, wenn niemand angemeldet ist, und zeigen Sie das Fenster an, wenn sich jemand anmeldet (Betriebssystem: Windows)

19

Ich habe ein Programm, das beim Systemstart mit dem Taskplaner unter Windows Server 2012 gestartet wird. Das Programm muss gestartet werden, auch wenn der Computer automatisch neu gestartet wird.

Administrator ist das Konto, mit dem das Programm gestartet wird. Die Option "Ausführen, ob Benutzer angemeldet ist oder nicht" ist für die Aufgabe aktiviert.

Das Problem dabei ist, dass die Benutzeroberfläche (Programmfenster) ausgeblendet wird, wenn sich jemand über die Remotedesktopverbindung als Administrator anmeldet.

Soweit ich weiß, gibt es keine Möglichkeit, dies mit dem Taskplaner zu lösen.

Wie kann ich das lösen?

Es sollte ein ziemlich häufiges Problem sein, aber ich kann nichts finden, indem ich das Netz durchsuche. Ich bin ziemlich überrascht, dass Microsoft eine solche Einschränkung im Scheduler zulässt. Kann ich ein VBScript oder etwas erstellen, das beim Start ausgeführt wird und das Programm startet, das dann sichtbar wird, wenn sich der Benutzer tatsächlich anmeldet?

Andere Ideen?

(Ich möchte übrigens kein separates GUI-Programm erstellen, das eine Verbindung zum ursprünglichen Programm herstellt. Ich würde es auch vorziehen, wenn ich das bereits ausgeführte Programm nicht bei der Benutzeranmeldung beenden und dann starten muss es wieder.)

Marcus
quelle
2
Firedaemon, installiere die App als Dienst, wenn du mit Firedaemon auf "Session 0" umgestiegen bist. Siehe die App.
TheCleaner
Dies könnte technisch erfolgen, wenn Sie Ihren eigenen Service entwickeln.
Ryan Ries
1
Habe gerade meine eigene Frage beantwortet. Ich kann meine eigene Antwort jedoch zwei Tage lang nicht akzeptieren, da das System hier bei serverfault.com extrem schlecht ist (die meisten Leute würden diese Seite jetzt einfach verlassen, ohne zwei Tage zu warten und die Frage für immer als ungelöst markieren).
Marcus
2
@Marcus: Die Beschränkungen, wer was tun kann und wann bestimmte Missbräuche beenden soll. Leider verursachen sie manchmal Unannehmlichkeiten für echte Versuche, die Dinge richtig zu machen, aber manchmal müssen solche Kompromisse gemacht werden. Wenn Sie einen Vorschlag haben, der die Situation verbessern könnte (zumindest den Schutz der Website, der echte Benutzer jedoch weniger belastet ), ist es besser, den Gedanken über eine relevante "Meta" -Site ( meta.serverfault.com , meta) zu äußern . stackoverflow.com ), anstatt sich in einem Kommentar zu beschweren, den die Site-Läufer sehr unwahrscheinlich sehen.
David Spillett
Wie Sie aus der Abstimmung ersehen können, ist die Antwort, die Sie akzeptieren möchten, nicht die, die die Leute gutheißen, da die Art und Weise, wie Sie dies versuchen, anfangs falsch ist.
James Ryan

Antworten:

28

Fand heraus, wie es mir geht. Es ist eine Art Workaround, aber genau das habe ich erwartet.

Halt! Erschaudere noch nicht. Weiter lesen...

  • Führen Sie es aus und stellen Sie es so ein, dass sich der Administrator automatisch anmeldet.

  • Erstellen Sie eine Aufgabe im Taskplaner. Legen Sie fest, dass es nur ausgeführt wird, wenn der Benutzer (Administrator) angemeldet ist. Der Auslöser lautet "bei Anmeldung" und gibt an, dass dies nur bei der Anmeldung des Administrators der Fall ist.

  • Erstellen Sie eine zweite Aufgabe. Nur ausführen, wenn Benutzer angemeldet ist, bei Administratoranmeldung auslösen. Die Aktion sollte "Programm starten" und "C: \ Windows \ System32 \ rundll32.exe" sein, wobei das Argumentfeld auf "user32.dll, LockWorkStation" gesetzt ist.

Wenn Sie den Computer jetzt neu starten, wird der Administrator automatisch angemeldet, das zu startende Programm gestartet und die Arbeitsstation gesperrt. Wenn ich mich über eine Remotedesktopverbindung anmelde, kann ich das Programmfenster sehen und die GUI verwenden. Ich kann den Computer problemlos sperren / entsperren und die Verbindung nach Belieben trennen / wiederherstellen. Es ist auch kein Problem, wenn ich zum Server gehe und mich an der eigentlichen Workstation anmelde. Da der Administrator bereits angemeldet ist, wird die Aufgabe nicht erneut ausgeführt (es wird keine unendliche Anmeldeschleife erstellt, aus der Sie nicht ausbrechen können).

So einfach ist das. Zugegeben, es dauert eine Sekunde, bis der Computer nach der automatischen Anmeldung gesperrt wird, und ich schätze, ein Profi-Hacker mit physischem Zugriff auf den Computer könnte in diesem Zeitfenster etwas Ungewöhnliches tun, aber in meinem Fall kann ich dieses Sicherheitsrisiko übersehen. Solange ich keine professionellen Hacker in mein Haus lasse und ihnen den Computer zeige, sollte das System relativ sicher sein. Vor allem ist der Wert des Computers, der einen Super-Vault-Schutz benötigt, nicht besonders hoch, daher bin ich mit dieser Lösung sehr zufrieden.

Marcus
quelle
7
Keine Respektlosigkeit (oder Ablehnung), Marcus. Aber wenn dies wirklich die Art von Antwort ist, nach der Sie gesucht haben, wäre diese Frage für SuperUser besser geeignet gewesen .
Ryan Bolger
2
Es war nicht einfach zu entscheiden, welcher Stapelaustausch dies verbuchen soll.
Marcus
Hallo Marcus, ich bin deiner Antwort gefolgt, aber ich habe ein Problem beim Starten von zwei Programmen mit GUI anstelle von nur einem. Ich habe eine Frage in gepostet SuperUser. Wenn Sie es beantworten könnte es wird es eine große Hilfe sein - superuser.com/questions/902386/...
user2162550
1
Eigentlich auch, weil es KEINE Antwort auf die Frage ist. Die Frage definiert explizit, dass der Mittag angemeldet ist - und Ihre "Lösung" führt hier eine automatische Anmeldung durch (also ist jemand angemeldet). Vielleicht keine kluge Formulierung in der Frage, aber die Frage ist so, wie sie ist.
TomTom
1
@TomTom Als Option für einen Endbenutzer kann "Ausführen, ob der Benutzer angemeldet ist oder nicht" bedeuten, dass Sie nicht hier sein müssen, um zu babysitten, um sicherzustellen, dass es startet. "
Aryeh Leib Taurog
16

Ich habe ein Programm, das beim Systemstart mit dem Taskplaner unter Windows Server 2012 gestartet wird. Das Programm muss gestartet werden, auch wenn der Computer automatisch neu gestartet wird.

Warum machen Sie es dann nicht zu einem Systemdienst, wie in den Windows-Spezifikationen definiert?

Wie kann ich das lösen?

Du kannst nicht. Hintergrundprogramme sollen nicht mit der Benutzeroberfläche interagieren. Oder: Die Benutzeroberfläche sollte ein eigenes Programm ausführen, das dann eine Verbindung zum Dienst herstellt. Die Benutzeroberfläche, die im Benutzerbereich des angemeldeten Benutzers ausgeführt wird, übernimmt die Präsentation, der Windows-Dienst die Verarbeitung. So ist das Modell für ungefähr 15 Jahre ausgelegt.

Ich bin ziemlich überrascht, dass Microsoft eine solche Einschränkung im Scheduler zulässt.

Ich bin mehr überrascht, dass Sie sich nie getäuscht haben, um zu fragen, warum.

Es gibt mehrere Probleme:

  • Wer erhält die Benutzeroberfläche, wenn mehrere Personen angemeldet sind?
  • Wenn sich der Benutzer abmeldet, beenden Sie das Programm? AUTSCH.
  • Sicherheit. Das Hintergrundprogramm kann mit eingeschränkten Rechten ausgeführt werden. Wenn Sie die Benutzeroberfläche dem Benutzer zur Verfügung stellen, kann der Benutzer dort Code ausführen. Das Windows-Messaging-Modell ist voller Probleme.

Ich möchte übrigens kein separates GUI-Programm erstellen müssen, das eine Verbindung zum ursprünglichen Programm herstellt.

Weder Microsoft noch ich kümmern sich an dieser Stelle darum, was Sie tun möchten. Es gibt ein etabliertes und unterstütztes Modell, um die Hintergrundverarbeitung in eine angemeldete Benutzeroberfläche einzubinden - verwenden Sie es oder nicht. Wenn dies nicht der Fall ist, sollten Sie sich nicht über von Ihnen angesprochene Sicherheitsprobleme beschweren.

TomTom
quelle
3
Amen. Ich wünschte, mehr App-Anbieter hätten dieses Konzept verstanden.
Ryan Bolger
15
Wow, bist du nicht scharfsinnig in deiner Einstellung? Schätze, ich habe Pech. Sofern Sie nicht falsch informiert sind und jemand eine Möglichkeit hat, dies zu lösen, kann nicht jeder alles wissen, sodass Sie möglicherweise mit dem absoluten "Sie können nicht" Teil Ihres Beitrags falsch liegen. Ich möchte die Frage noch eine Weile offen lassen, um weitere Antworten zu erhalten, für den Fall, dass jemand eine ungewöhnliche Problemumgehung hat. Sonst akzeptiere ich deine Antwort.
Marcus
Es wird heutzutage immer schwieriger, einem Dienst eine Benutzeroberfläche zuzuweisen, aber dies ist nicht unmöglich.
MDMoore313
Es ist aktiv nicht erwünscht, da es hauptsächlich Sicherheitsbedenken gibt. Das Hauptproblem hierbei ist, dass ich - und das müssen Sie wirklich - Code in Ihrem Prozess ausführen kann, wenn Sie ein Fenster in meiner Benutzeroberfläche anzeigen. Ich kann Ihnen dann Windows-Nachrichten senden und das hat eine Menge Dinge, die ausgenutzt werden können. Normalerweise kein Problem - denn wenn es sich um eine Benutzer-App handelt, kann ich nur Dinge tun, die ich als Benutzer tun könnte. Dies ist der Grund, warum dies vor vielen, vielen Jahren geschlossen wurde und jeder, der Programmierung gelernt und die Dokumentation gelesen hat, sollte darüber gelesen haben
TomTom
1
Wenn Sie wirklich dorthin gehen möchten, können Sie die Schritte unter coretechnologies.com/WindowsServices/FAQ.html#GUIServices ausführen. Sie sind sich nicht sicher, ob sie in aktuellen Fenstern funktionieren, es gibt jedoch Möglichkeiten, den Zugriff auf die Benutzeroberfläche zu ermöglichen, und Sie können alle Sicherheitsprobleme beheben .
TomTom
0

Es dreht sich alles um das Session, in dem Ihr Programm ausgeführt wird. Wenn niemand angemeldet ist, gibt es keine interaktive Sitzung, unter der es angezeigt werden kann. Ich glaube, sie läuft unter Session 0einer seltsamen Benutzeroberfläche, die nicht wie die anderen angezeigt wird .

Wenn Ihr Programm erkennt, wann es gestartet wird explorer.exe(oder auf eine andere Weise, um die Benutzeranmeldung zu erkennen) und sich auf magische Weise selbst verändert oder einen untergeordneten Prozess auf dieser neuen Sitzungs-ID erzeugt, wird jeder, der sich anmeldet, glücklich sehen, was Sie tun.

MDMoore313
quelle