Как запретить Ctrl-Alt-Del или Alt-Tab в Windows XP.Компилятор: Visual C++ 6.0 Автор: Paul DiLascia Скачать исходник к статье - 56 Кб Наверное, нет такого программиста, который не догадывается для чего необходимо отключать так называемую "комбинацию из трёх пальцев". В первую очередь это необходимо, чтобы пользователь не смог заметить приложение удалённого управления его компьютером (в простонародье называемым Троянским конём). Однако, есть и масса других случаев, когда необходимо запретить Ctrl+Alt+Del. Так же, справедливости ради, стоит заметить, что очень часто вызов менеджера задач, это единственный способ снять зависшее приложение. В таких операционных системах как Windows 95, Windows 98 и Windows Me можно запретить Ctrl+Alt+Del (а так же любые другие комбинации клавиш для переключения задач), введя операционную систему в заблуждение, заставив её думать, что запущен скринсейвер, следующей командой: BOOL bOldState; SystemParametersInfo(SPI_SETSCREENSAVERRUNNING, TRUE, &bOldState, 0); Однако, такая команда не сработает в Windows NT®, Windows 2000 и Windows XP. Эти версии операционных систем используют Winlogon и GINA (сокращение от Graphical Identification and Authentication). Winlogon это часть Windows, которая обеспечивает интерактивный вход в систему, а GINA, это DLL, которую использует Winlogon, для проведения авторизации. DLL GINA экспортирует некоторые функции, такие как WlxInitialize для инициализации самой себя и WlxActivateUserShell для запуска пользовательского шелла. Для проведения обычной авторизации по имени и паролю в Windows используется msgina.dll, однако, любой разработчик (т.е. Вы) спокойно может заменить msgina.dll своей собственной GINA. Например, это может потребоваться для включения авторизации по смарткартам, retinal-scan, DNA-check, или Divine Awareness и т.д. В Таблице приведён полный список функций GINA. Одна из них WlxLoggedOnSAS, которая вызывается Winlogon-ом когда он получает "secure attention sequence," больше известную как Ctrl+Alt+Del. По умолчанию GINA отображает диалог входа в систему и Вы начинаете авторизоваться.... Один из способов запретить Ctrl+Alt+Del, это написать новую MyGina.dll с заглушками, которые будут вызывать старую msgina.dll и перехватить нужным образом WlxLoggedOnSAS. Второй способ, это написание драйвера клавиатуры. Оба выше перечисленных способа требуют приложить давольно много усилий. Есть конечно и более простые способы. Например, чтобы запретить Ctrl+Alt+Del достаточно установить политики. Для этого идём в меню "Пуск", выбираем Выполнить...(Run), и запускаем Редактор Политики Групп ("gpedit.msc"). Смотрим в User Configuration | Administrative Templates | System и там уже можно найти секцию с именем Ctrl+Alt+Del Options:
"Remove Task Manager" это тот самый ключ, который
запрещает Ctrl+Alt+Del. Программно можно просто
добавить в реестр ключ: HKCU\
Software\
Microsoft\
Windows\
CurrentVersion\
Policies\
System\DisableTaskMgr = dword:1
Теперь, если пользователь нажмёт Ctrl+Alt+Del, то получит сообщение:
Итак, это первая половина ответа в опросе запрета Ctrl+Alt+Del в Windows XP. Я предполагаю, что Вы уже отключили Ctrl+Alt+Del для входа в систему установив "Use the Welcome screen" в Control Panel | User Accounts:
иначе Вы бы не спрашивали про Менеджер задач.
Если же Вы не используете экран Welcome, то установка
DisableTaskMgr запрещает кнопку Менеджера задач в
диалоге входа/выхода из системы. // относятся к данному пользователю HKEY_CURRENT_USER\Software\Policies HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies // относятся к локальной машине HKEY_LOCAL_MACHINE\Software\Policies HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies Второй способ заключается в исследовании административных шаблонов (файлы .adm), которые описаны в политиках. Ниже представлен отрывок из \windows\system32\GroupPolicy\Adm\system.adm, который описывает DisableTaskMgr: CATEGORY !!CADOptions
#if version >= 4
EXPLAIN !!CADOptions_Help
#endif
KEYNAME "Software\Microsoft\Windows\CurrentVersion\Policies\System"
POLICY !!DisableTaskMgr
#if version >= 4
SUPPORTED !!SUPPORTED_Win2k
#endif
EXPLAIN !!DisableTaskMgr_Help
VALUENAME "DisableTaskMgr"
END POLICY
;
; More Ctrl+Alt+Del policies here...
;
END CATEGORY ; Ctrl+Alt+Del options
•••
DisableTaskMgr_Help="Prevents users from starting Task Manager
(Taskmgr.exe).\n\nIf this setting is enabled and users try to start
Task Manager, a message appears explaining that a policy prevents the
action.\n\nTask Manager lets users start and stop programs; monitor the
performance of their computers; view and monitor all programs running
on their computers, including system services; find the executable
names of programs; and change the priority of the process in which
programs run."
DisableTaskMgr="Remove Task Manager"
Для указания ключа в реестре и его значения используются две основные команды KEYNAME и VALUENAME. Вы можете создать свой собственный административный шаблон и политики для своего приложения, но редактировать его нужно редактором, поддерживающим Unicode. Мой любимы Epsilon 11.0, но Notepad и WordPad тоже подойдут. Административные шаблоны позволяют сисадмину конфигурировать системы в масштабах предприятия (вот где сила!). Более подробно см. "Administrative Template File Format" в Platform SDK. Перед тем как двинуться дальше, позвольте заметить, что DisableTaskMgr позволяет запретить Ctrl+Alt+Del, но не перехватить её. Для перехвата Ctrl+Alt+Del, необходима любая из трёх вещей: написать собственную заглушку для GINA, написать драйвер клавиатуры, или заменить TaskMgr.exe собственной программой. Теперь давайте посмотрим, что можно
сделать с комбинацией Alt+Tab и другими клавишами
переключения задач. Например, в Windows 3.1, можно было
обработать WM_SYSKEYDOWN. В Windows 95 и Windows 98 срабатывает
тот же обманный метод SPI_SETSCREENSAVERRUNNING, который я
упоминал в самом начале статьи. Но опять же, в Windows
NT 4.0 (SP3 и позже), Windows 2000, и Windows XP эти штучки не
пройдут. Прийдётся писать низкоуровневую
ловушку для клавиатуры. Уж извиняйте. Впринципе
это не так сложно. В Примере
демонстрируется DLL (TaskKeyHook.dll), которую я написал и,
которая делает всю необходимую работу. TaskKeyHook
экспортирует две функции, DisableTaskKeys и AreTaskKeysDisabled.
Первая устанавливает ловушку WH_KEYBOARD_LL; а вторая
сообщает - установлена ли ловушка. Сама по себе
процедура ловушки перехватывает Alt+Tab, Ctrl+Esc, Alt+Esc,
а так же виндузовык клавиши (VK_LWIN и VK_RWIN, о которых
я расскажу ниже). Как только срабатывает одна из
этих комбинаций клавиш, то управление передаётся
сразу же в вызывающую программу, и не происходит
вызова CallNextHookEx. LRESULT CALLBACK MyTaskKeyHookLL(...)
{
if (/* нужная комбинация клавиш *)
return 1;
return CallNextHookEx(...);
}
Код TaskKeyHook не сложен. Единственная
хитрость заключается в использовании #pragma data_seg
для имени сегмента данных, который содержит
глобальные данные, и #pragma comment (linker...), чтобы
указать линковщику сделать этот сегмент
доступным (расшаренным). HWND hwnd = FindWindow("Shell_traywnd", NULL);
EnableWindow(hwnd, FALSE); // запрещаем его
Здесь присутствует небольшая причуда. Если Вы запретите панель задач, а затем нажмёте клавишу Windows (которая находится на клавиатуре между Ctrl и Alt), то откроется меню Пуск. Упс! Очевидно, панель задач перед нажатием VK_LWIN не проверяет - доступна она или нет. Если окно заблокировано (после вызова EnableWindow(FALSE)), то оно не должно обрабатывать пользовательский ввод. Похоже, что обработка VK_LWIN происходит каким-то другим способом, поэтому мне пришлось добавить обработку таких клавиш в TaskKeyHook. Теперь, если нажать клавишу меню Пуск, то ничего не произойдёт. Чтобы облегчить жизнь, я включил все запрещающие функции в класс CTaskKeyMgr (см. Пример). Все функции статические. Вы можете спокойно использовать этот класс в своих приложениях для блокирования переключения задач, а так же для блокирования самой панели задач. Например, чтобы заблокировать переключение задач или саму панель задач, но не Ctrl+Alt+Del, достаточно вызвать следующий метод: CTaskKeyMgr::Disable(CTaskKeyMgr::TASKKEYS |
CTaskKeyMgr::TASKBAR, TRUE);
Так же в классе присутствуют функции для
определения, что в данный момент заблокировано и
можно даже подать звуковой сигнал, если
пользователь нажмёт одну из ключевых комбинаций
клавиш. При публикации материала ссылка на сайт обязательна!
|