Ausführen eines Prozesses auf dem Windows 7-Begrüßungsbildschirm

8

Also hier ist der Scoop:

Vor einiger Zeit habe ich eine kleine C # -App geschrieben, die den Hostnamen, die IP-Adresse, das Bilddatum, den Taupunktstatus (wir benutzen DeepFreeze), die aktuelle Domain und das aktuelle Datum / Uhrzeit auf dem Begrüßungsbildschirm von Windows anzeigt 7 Laborgeräte. Dies sollte unseren vorherigen Informationsblock ersetzen, der statisch beim Start gesetzt wurde und tatsächlich Text in den Hintergrund einbrachte, mit etwas etwas Dynamischerem und Funktionalem. Die App verwendet einen Timer, um die IP-Adresse, den Deepfreeze-Status und die Uhr jede Sekunde zu aktualisieren. Außerdem prüft sie, ob sich ein Benutzer angemeldet hat und sich selbst tötet, wenn er eine solche Bedingung feststellt.

Wenn wir es einfach über unser Startskript (das über die Gruppenrichtlinie eingestellt wurde) ausführen, hält es das Skript offen und der Computer wird nie zur Anmeldeaufforderung. Wenn wir etwas wie die Befehle start oder cmd verwenden, um es in einer separaten Shell / einem separaten Prozess zu starten, wird es ausgeführt, bis das Startskript beendet ist. An diesem Punkt scheint Windows alle untergeordneten Prozesse des Skripts zu bereinigen. Momentan können wir das umgehen, indem wir psexec -s -d -i -x verwenden, um es auszulöschen, wodurch es nach dem Start des Skripts erhalten bleibt. Es kann aber unglaublich langsam sein und zwischen 5 Sekunden und mehr als eine Minute zu unserer Startzeit hinzufügen.

Wir haben mit der Verwendung einer anderen C # -App experimentiert, um den Prozess über die Process-Klasse mit WMI-Aufrufen (Win32_Process und Win32_ProcessStartup) mit verschiedenen Startflags usw. zu starten, aber alle enden mit dem gleichen Ergebnis der Skriptbearbeitung und der Info Blockprozess wird getötet. Ich habe versucht, die App als Dienst neu zu schreiben, aber die Dienste waren nie darauf ausgelegt, mit dem Desktop zu interagieren, geschweige denn mit dem Anmeldefenster, und es schien nie richtig zu funktionieren, Dinge im richtigen Kontext zu betreiben.

Also für die Frage: Hat jemand einen guten Weg, dies zu erreichen? Eine Aufgabe starten, damit sie unabhängig vom Startskript ist und oben auf dem Begrüßungsbildschirm ausgeführt wird?

    
peelman 18.06.2010, 13:50
quelle

4 Antworten

10

Dies kann über viele Win32-API-Aufrufe erfolgen. Ich habe es geschafft, ein Programm mit einer GUI auf den Winlogon-Desktop zu bekommen (bevor jemand fragt, es ist keine interaktive GUI). Grundsätzlich müssen Sie einen Ladeprozess als SYSTEM ausführen, der dann den neuen Prozess erzeugt. Da Sie höchstwahrscheinlich möchten, dass dieser Prozess beim Start ausgeführt wird, können Sie entweder den Taskplaner verwenden, um den Loader als SYSTEM auszuführen, oder Sie können einen Dienst verwenden, um dasselbe zu tun. Ich benutze gerade einen Dienst, aber ich habe versucht, den Taskplaner zu verwenden, und es hat gut funktioniert.

Kurze Zusammenfassung:

  1. Besorgen Sie sich den Prozess Winlogon.exe (als Prozess)
  2. Nimm das Token von winlogon mit OpenProcessToken unter Verwendung des .handle des Prozesses
  3. Erstellen Sie ein neues Token und duplizieren Sie das Winlogon-Token dazu
  4. Erhöhen Sie die Berechtigungen des Token
  5. Erstellen Sie den Prozess mit CreateProcessAsUser und stellen Sie sicher, dass Sie lpDesktop auf "Winsta0 \ Winlogon" setzen und das von Ihnen erstellte Token verwenden.

Codebeispiel:

%Vor%     
Jon 29.06.2010, 17:11
quelle
6

Dies ist einer dieser "Sie wirklich brauchen einen guten Grund, dies zu tun" Fragen. Microsoft versucht sehr hart, Anwendungen zu blockieren, die auf dem Startbildschirm ausgeführt werden - jeder Code in Windows, der mit dem Anmeldebildschirm interagiert, wird sehr sorgfältig überprüft, da die Sicherheitskonsequenzen eines Programmfehlers auf dem Anmeldebildschirm sehr gravierend sind - wenn Sie es vermasseln Selbst wenn Sie nur geringfügig vorgehen, können Sie Malware auf den Computer gelangen lassen.

Warum möchten Sie Ihr Programm auf dem Anmeldebildschirm ausführen? Vielleicht gibt es eine dokumentierte Vorgehensweise, die nicht so riskant ist.

    
Larry Osterman 19.06.2010 02:03
quelle
6

Ich habe den obigen Code in C ++ übersetzt, wenn jemand anders es braucht ... Beachten Sie, dass es Referenzen zu Teilen meines Codes gibt, aber es kann trotzdem helfen:

%Vor%     
Simon 23.07.2014 20:11
quelle
1

Ich denke, Sie können es schaffen, aber es ist ziemlich involviert. Interaktive Apps dürfen normalerweise nicht auf dem Willkommensbildschirm laufen. Auf einer hohen Ebene müssen Sie:

  • Erstellen Sie einen Windows-Dienst, der automatisch gestartet wird
  • Verwenden Sie den Windows-Dienst, um einen anderen Prozess für die aktuelle Sitzung und den aktuellen Desktop zu erstellen (mit den Win32-Methoden WTSGetActiveConsoleSessionId und OpenInputDesktop )

Ich habe eine App geschrieben, die etwas mit dem Anmeldebildschirm interagieren kann, aber keine Benutzeroberfläche anzeigt. Es kann wahrscheinlich getan werden, aber es kann noch mehr beteiligt sein.

Hinweis: Ich habe festgestellt, dass ich keine Ergebnisse von OpenInputDesktop von meinem Windows-Dienst abrufen konnte. Ich musste stattdessen den anderen Prozess aufrufen und den Dienst benachrichtigen, um den Prozess auf dem richtigen Desktop neu zu starten.

Ich hoffe, dass Sie damit wenigstens beginnen können. Viel Glück!

    
dcstraw 18.06.2010 16:40
quelle

Tags und Links