Блокировка ввода мышью от службы в Vista - PullRequest
0 голосов
/ 16 марта 2009

Я поддерживаю множество управляемых пользовательских ярлыков в университетском городке. Все эти машины в настоящее время работают под управлением Windows XP, и у нас есть служба Windows, которая используется для «блокировки» машины путем блокировки ввода с клавиатуры или мыши. Блокировка происходит во время установки нашей скриптовой ОС, поэтому пользователи не могут случайно остановить или прервать процесс. Он также используется для предотвращения входа пользователей в компьютеры до тех пор, пока они не будут проверены на стойке регистрации в данной лаборатории. Ctrl + Alt + Del блокируется с помощью драйвера фильтра клавиатуры, а остальные клавиши и мышь в настоящее время блокируются с помощью функции BlockInput () из user32.dll.

В XP служба запускается как локальная система, и для успешного выполнения вызова BlockInput () необходимо включить флажок «Разрешить службе взаимодействовать с рабочим столом». В Vista это больше не работает, я думаю, из-за изменений Session 0 . Вызов успешен, но ввод фактически не заблокирован.

Драйвер фильтра клавиатуры по-прежнему работает просто отлично, и мы можем использовать его для блокировки всей клавиатуры, а не просто Ctrl + Alt + Del. Но я в растерянности относительно того, как мы собираемся блокировать мышь сейчас. Я даже не совсем уверен, что виновата изоляция Сессии 0.

Может ли кто-нибудь порекомендовать исправление или обходной путь, позволяющий нам блокировать ввод мышью из службы в Vista и выше? Я искал альтернативные Win32 API без удачи. Предполагая, что виновата изоляция сеанса 0, существует ли законный способ вызова функции из сеанса 1, или это будет своего рода поражением цели изоляции? Придется ли мне полагаться на расширенный исполняемый файл, который запускается при входе пользователя в систему и взаимодействует со службой?

1 Ответ

0 голосов
/ 16 марта 2009

Из службы вы можете использовать WTSEnumerateSessions, чтобы получить все зарегистрированные пользовательские сеансы, WTSQueryUserToken, чтобы получить зарегистрированный токен пользователя, а затем использовать CreateProcessAsUser с этим токеном, чтобы получить код, выполняемый на рабочем столе пользователя. Это имеет тот недостаток, что код будет работать как зарегистрированный пользователь. Поскольку все входные данные отключены, это, вероятно, достаточно безопасно и, по крайней мере, так же безопасно, как и существующее решение XP.]

EDIT: BlockInput требует высокого уровня обязательной целостности. Вы можете попытаться добавить эту группу в токен, но тогда у вас есть код с более высокими привилегиями, работающий на рабочем столе и потенциально открытый для атак.

Альтернативой может быть использование вашего сервиса только для отключения всех устройств класса HID на машине.

...