2009-03-16 4 views
0

Ich verwalte eine Vielzahl von verwalteten Benutzerbibliotheken auf einem Universitätsgelände. Auf diesen Rechnern läuft derzeit Windows XP und wir haben einen Windows-Dienst, der dazu dient, einen Computer zu "sperren", indem er jegliche Tastatur- oder Mauseingabe blockiert. Die Sperrung erfolgt während der Installation des Skript-Betriebssystems, sodass Benutzer den Prozess nicht versehentlich anhalten oder unterbrechen können. Es wird auch verwendet, um zu verhindern, dass Benutzer sich an Computern anmelden, bis sie an der Rezeption eines bestimmten Labs ausgecheckt werden. Strg + Alt + Entf ist über einen Tastaturfilter-Treiber blockiert und der Rest der Tasten und Maus sind derzeit mit der Funktion BlockInput() von user32.dll blockiert.Blockieren der Mauseingabe von einem Dienst in Vista

In XP wird der Dienst als lokales System ausgeführt, und das Kontrollkästchen für "Interaktiv mit dem Desktop interagieren" muss vom BlockInput() - Aufruf aus aktiviert werden, um erfolgreich zu sein. Unter Vista funktioniert das nicht mehr ich vermute wegen der Session 0 isolation Änderungen. Der Aufruf ist erfolgreich, aber die Eingabe ist nicht blockiert.

Der Tastaturfiltertreiber funktioniert immer noch gut und wir können das verwenden, um die gesamte Tastatur statt nur Strg + Alt + Entf zu blockieren. Aber ich weiß nicht, wie wir die Maus jetzt blockieren sollen. Ich bin nicht einmal ganz sicher, ob die Isolation in Session 0 schuld ist.

Kann jemand eine Fehlerbehebung oder eine Problemumgehung empfehlen, um die Mauseingabe von einem Dienst in Vista und darüber hinaus zu blockieren? Ich habe nach alternativen Win32-APIs ohne Glück gesucht. Geht man davon aus, dass die Isolation von Sitzung 0 die Schuld trägt, gibt es einen legitimen Weg, die Funktion von Sitzung 1 aus aufzurufen, oder würde dies den Zweck der Isolation vereiteln? Muss ich mich auf eine erweiterte Companion-Exe verlassen, die bei der Benutzeranmeldung ausgeführt wird und mit dem Dienst kommuniziert?

Antwort

0

Von einem Dienst können Sie WTSEnumerateSessions verwenden, um alle angemeldeten Benutzersitzungen abzurufen, WTSQueryUserToken, um das Token des angemeldeten Benutzers abzurufen, und CreateProcessAsUser mit diesem Token verwenden, um Code auf dem Desktop des Benutzers auszuführen. Dies hat den Nachteil, dass der Code als angemeldeter Benutzer ausgeführt wird. Da alle Eingänge deaktiviert sind, ist dies wahrscheinlich sicher genug und mindestens genauso sicher wie die vorhandene XP-Lösung.]

EDIT: BlockInput erfordert eine hohe obligatorische Integritätsstufe. Sie könnten versuchen, diese Gruppe zum Token hinzuzufügen, aber dann haben Sie Code mit höheren Rechten, der auf dem Desktop ausgeführt wird und möglicherweise für Angriffe offen ist.

Eine Alternative könnte darin bestehen, Ihren Dienst nur zum Deaktivieren aller HID-Klasse-Geräte auf dem Computer zu verwenden.

+0

Ich hatte noch keine Chance, dies noch zu testen. Das Problem könnte sein, dass der Konsolenbenutzer kein privilegiertes Konto ist und der BlockInput-Aufruf fehlschlägt. –

+0

BlockInput sollte immer noch funktionieren, ich glaube nicht, dass es Berechtigungen erfordert. – Michael

+0

Ich schrieb eine einfache Konsole App, um den Anruf als eingeschränkter Benutzer in Vista zu testen, und es hat nicht funktioniert. Ich vergesse, ob der Anruf fehlgeschlagen oder erfolgreich war und einfach nicht funktioniert hat. Die App hoch zu laufen hat gut funktioniert. –