5 votes

Comment verrouiller le poste de travail à partir d'un service Windows ?

Je dois verrouiller le poste de travail à partir d'un service Windows écrit en VB.Net. J'écris l'application sur Windows 7 mais elle doit fonctionner sous Vista et XP également.

L'API User32 LockWorkStation ne fonctionne pas car elle nécessite un bureau interactif et j'obtiens une valeur de retour de 0.

J'ai essayé d'appeler %windir% \System32\rundll32.exe user32.dll,LockWorkStation à partir d'un processus et du shell, mais rien ne se passe.

Configurer le service pour qu'il interagisse avec le bureau est impossible car j'exécute le service sous le compte administrateur pour qu'il puisse faire d'autres choses qui nécessitent des droits d'administrateur - comme désactiver le réseau, et vous ne pouvez sélectionner l'option d'interaction avec le bureau que si vous l'exécutez sous le compte système local.

Ce serait la question secondaire - comment exécuter une autre application avec des droits d'administration à partir d'un service fonctionnant sous le compte système local sans gêner l'utilisateur.

Je suis en train d'écrire une application pour contrôler l'accès à l'ordinateur et à l'Internet de mes enfants (que je prévois d'ouvrir une fois terminée) et j'ai donc besoin que tout se passe aussi discrètement que possible.

J'ai une interface utilisateur qui gère les paramètres et les notifications d'état dans la barre des tâches, mais elle est facile à tuer et donc à vaincre le verrouillage. Je pourrais créer une autre application Windows Forms cachée pour gérer le verrouillage, mais cela semble être une solution plutôt inélégante.

De meilleures idées, quelqu'un ?

0voto

Brad Points 61171

Juste par curiosité... quel genre de hack UltraVNC utilise-t-il pour que cela fonctionne ? Je crois comprendre qu'il PEUT fonctionner sous Windows 7 en tant que service sans l'utilisation des pilotes de crochet vidéo. Si c'est le cas, comment son service accède-t-il à la session locale ?

0voto

Hossein Points 1789

Afin d'interagir avec la session de l'utilisateur dans un service, vous devez d'abord utiliser un identifiant de session d'utilisateur. En gros, vous devrez utiliser WTSGetActiveConsoleSessionId , WTSGetActiveConsoleSessionId et CreateEnvironmentBlock avant d'appeler CreateProcessAsUser .
La partie importante est le CreateEnvironmentBlock . Les deux premières méthodes nous permettent de ne pas utiliser un nom d'utilisateur/mot de passe prédéfini, ce qui est souhaitable. Le snippet Python comme preuve de concept pour verrouiller la station de travail à partir d'un service est le suivant :

import win32process
import win32con
import win32ts

console_session_id = win32ts.WTSGetActiveConsoleSessionId()
console_user_token = win32ts.WTSQueryUserToken(console_session_id)
startup = win32process.STARTUPINFO()
priority = win32con.NORMAL_PRIORITY_CLASS
environment = win32profile.CreateEnvironmentBlock(console_user_token, False)
handle, thread_id ,pid, tid = win32process.CreateProcessAsUser(console_user_token, None, "rundll32.exe user32.dll,LockWorkStation", None, None, True, priority, environment, None, startup)

réf.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X