Управление блоком + Alt + Удалить

Я делаю проект онлайн-викторины на С#. Тест-клиент - это настольное приложение Windows, работающее в Windows XP. Мне нужно заблокировать комбинацию клавиш control + alt + delete, чтобы пользователи не могли минимизировать/закрыть приложение.

Использование PInvoke для меня в порядке.

Я знаю, что это определенно возможно, потому что я видел три приложения, которые это делают. Все они проприетарные, поэтому я не знаю, как это было сделано.

Ответ 1

Для Windows XP правильный способ сделать это - создать свою собственную библиотеку динамических ссылок для графической идентификации и аутентификации или gina.dll для краткости. Здесь статья MSDN об этом. Эта DLL экспортирует набор функций, которые взаимодействуют с процессом Winlogon, и предоставляет пользовательский интерфейс для запросов на вход в систему - событие Secure Action Sequence. Основной запрос на вход - ответ ctrl-alt-delete. Стандартный gina.dll вызывает экран входа в систему или диалог диспетчера задач/выхода из системы. Это не слишком сложно создать свою собственную gina, но для этого требуется кодирование C/С++, а не С#, и очень легко заставить систему не загрузиться. Это не мешает людям нажать F8 при загрузке и выбрать опцию "Безопасная загрузка", которая не загрузит пользовательскую gina.dll.

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

EDIT 2: этот не работает с Vista/Win7, поскольку они изменили архитектуру процесса входа в систему. По-прежнему можно отключить ctrl-alt-delete в Vista/Win7, но для этого требуется другой механизм - в нем есть статьи MSDN.

EDIT 3: Здесь ZIP файл, содержащий исходный код для создания gina.dll Он был создан с использованием DevStudio 2005. Файл GinaInterface. cpp подробно описывает шаги, необходимые для установки новой библиотеки gina.dll. Это отключит экран "Добро пожаловать" и заменит его на "нажмите crtl-alt-del" для входа в диалоговое окно. Как бы там ни было, нет никакой разницы между этим и стандартным gina.dll, все связанные с gina вызовы передаются в исходный файл gina.dll(называемый msgina.dll в папке Windows\System32). Чтобы отключить нажатие клавиши ctrl-alt-del, обновите функцию WlxLoggedOnSAS в GinaInterface.cpp. Чтобы остановить ctrl-alt-del во время работы вашего приложения, вы можете создать именованный mutex (CreateMutex) и проверить его наличие в gina.dll, остановив ctrl-alt-del, если существует мьютекс.

Ответ 2

Я нашел очень уродливый способ сделать это (что хорошо работает). Если я открываю taskmgr.exe исключительно, тогда ничего не происходит, когда пользователь нажимает Ctrl + Alt + Del.

FileStream fs = new FileStream(System.IO.Path.Combine(Environment.SystemDirectory, "taskmgr.exe"), FileMode.Open, FileAccess.ReadWrite, FileShare.None);

Что мне больше всего нравится в этом решении, у которого нет постоянных эффектов. Например, если приложение будет убито, тогда Ctrl + Alt + Del снова будет работать.

Недостаток:. Должен быть включен экран приветствия или Windows Security будет отображаться вместо Windows, пытаясь открыть taskmgr и без малейшего сбоя. (→ Он также не будет работать, если машина находится в домене, поскольку в домене отключен экран приветствия.)

(Конечно, это не будет работать на Vista или W7.)

Ответ 3

Как и другие люди, очень сложно заблокировать Ctrl - Alt - Del, поскольку это фундаментальная часть безопасности Windows.

Однако вы можете заблокировать то, что можно сделать после того, как Ctrl - Alt - Del было нажато путем добавления следующих разделов реестра.

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System

  • DisableTaskMgr
  • DisableChangePassword
  • DisableLockWorkstation

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer,

  • NoLogoff

Если вы сделаете это, тогда, когда вы нажмете Ctrl - Alt - Del, вы получите диалог, как показано ниже (под XP):

alt text

Это не безупречно, но это мешает пользователю делать некоторые основные вещи.

Обновление: только что понял, что это также блокирует Ctrl - Shift - Esc, о котором я раньше не знал.

Ответ 4

Вы можете предварительно запустить скрытый процесс taskmgr.exe

ProcessStartInfo psi = new ProcessStartInfo(System.IO.Path.Combine(Environment.SystemDirectory, "taskmgr.exe"));
psi.RedirectStandardOutput = false;
psi.WindowStyle = ProcessWindowStyle.Hidden;
psi.UseShellExecute = true;

processTaskMgr = Process.Start(psi);

Ответ 5

Чего вы действительно хотите сделать? Отключить диспетчер задач?

Hive: HKEY_CURRENT_USER
Key: Software\Microsoft\Windows\CurrentVersion\Policies\System 
Name: DisableTaskMgr
Type: REG_DWORD
Value: 1 disable

Но пользователь все равно может закрыть ваше приложение с помощью диспетчера задач третьей стороны.

Проприетарное приложение может "отключить Ctrl + Alt + Del" с помощью этого раздела реестра:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\taskmgr.exe, Debugger, Hotkey Disabled

Ответ 6

Есть три способа сделать это (реестр, административные шаблоны и перехватчики), описанные в в этой статье.

Код находится на С++, но будет легко переносить его на С# с помощью P/Invoke.

Ответ 7

В соответствии с внутренней книгой Windows (4-е издание) последовательность Ctrl-Alt-Del не может быть перехвачена не-привилегированными приложениями. Кроме того, говорится, что эта конкретная последовательность не может быть перехвачена и что процесс Winlogon всегда будет ее получать (стр. 529).

Я никогда не пытался это сделать, но я бы доверял книге:)

Ответ 8

Я достиг той же цели, но с другой тактикой в ​​инструменте Time Tracker, который я взбивал. Это даст вам форму, которая берет экран - не позволяет окна появляться поверх нее и сбрасывает диспетчер задач, если он запущен.

  • Установите форму TopMost = True.
  • переопределить метод Form.OnLoad следующим образом:

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        this.Location = SystemInformation.VirtualScreen.Location;
        this.Size = SystemInformation.VirtualScreen.Size;
    }
    
  • Создайте таймер с интервалом в 500 миллисекунд, который ищет и убивает "taskmgr.exe" и "procexp.exe".

  • Отмените форму Form.OnFormClosing:

    protected override void OnFormClosing(FormClosingEventArgs e)
    {
        if (e.CloseReason == CloseReason.UserClosing || e.CloseReason == CloseReason.FormOwnerClosing)
        {
            MessageBox.Show("Nice try, but I don't think so...");
            e.Cancel = true;
            return;
        }
        base.OnFormClosing(e);
    }
    
  • Переопределить OnSizeChanged:

    protected override void OnSizeChanged(EventArgs e) {
        base.OnSizeChanged(e);
        this.WindowState = FormWindowState.Normal;
        this.Location = SystemInformation.VirtualScreen.Location;
        this.Size = SystemInformation.VirtualScreen.Size;
        this.BringToFront();
    }
    

Ответ 9

Как указано в других ответах, нет безопасного способа выполнить это без проверки каждого компьютера-ученика, поскольку они всегда могут запускать виртуальную машину.

В качестве альтернативы вы рассмотрели возможность сжечь свое приложение в LiveCD и потребовали, чтобы учащиеся загрузили LiveCD?

Таким образом, вы контролируете свою ОС, пока они запускают ваше приложение. После этого они могут перезагрузиться и все вернется в нормальное состояние.

Конечно, студенты могут перезагружать свои ноутбуки между ними, но это, вероятно, займет достаточно много времени, чтобы их заметили руководители.

Решение VM все равно обманет это, поэтому вам нужно убедиться, что все действительно загружаются с компакт-диска; иначе я не могу думать об этом.

В качестве бонуса вы будете изолированы от любых странных проблем с ОС на студенческих ноутбуках (возможно, некоторые установленные Linux или OS X;-)).

Ответ 10

Альтернативное решение:

Сделайте приложение так, чтобы вам никогда не понадобилось использовать клавишу alt или ctrl.

Затем выньте клавишу Ctrl (или alt) и поместите бумагу в контакты.

Тада!

(просто используйте другую клавиатуру для обслуживания)

Ответ 11

Очень тупым решением (которое предполагает, что машина посвящена вашему программному обеспечению) - переназначить клавишу Alt (ни к чему).

Недостатки:

  • Постоянный эффект
  • Требуется перезапуск/выход из системы, чтобы активировать

Работает на xp, Vista, W7.

Вы можете использовать SharpKeys для переназначения/отключения любой клавиши.

Информация о том, какой раздел реестра SharpKey меняет это. Можно также переназначить для каждого пользователя.

Предупреждение. Если вы отключите клавишу Alt и логин требует, чтобы вы нажимали Ctrl + Alt + Del, чем вы не сможете авторизоваться.:)

Ответ 12

Вы также захотите заблокировать alt + F4 примерно следующим образом:

private void form_KeyDown(object sender, KeyEventArgs e) {
    if (e.KeyCode == Keys.F4 && e.Modifiers == Keys.Alt)
        e.Handled = true;
    base.OnKeyDown(e);
}

Ответ 13

Интересно, можно ли установить фильтр на клавиатуре?

Я знаю, что на интерфейсах USB вы можете установить верхний или нижний фильтр на USB-данные, чтобы перехватить его по мере его поступления на компьютер, и, возможно, подобный подход можно было бы сделать. По сути, вы должны изменить комбинации клавиш, поступающие с клавиатуры, пока работает тестовое приложение.

Я нашел ключ реестра "UpperFilters", определенный для моей клавиатуры...

Этот USB-сниффер содержит исходный код, который реализует фильтр. Он может использоваться в контексте фильтров для очистки/модификации клавиатуры. (Ссылка для скачивания)

Ответ 14

Я бы предложил другой способ отключить диспетчер задач, хорошо работает с Windows 7, но он просто влияет на параметр диспетчера задач. Решение состоит в том, чтобы установить следующий раздел реестра на нерелевантное значение, например "C: \"

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\taskmgr.exe\Debugger

Вы также можете использовать этот хак для запуска своего диспетчера задач, просто установив ключ Debugger в полный путь к вашему приложению. Я обнаружил это, проанализировав, как ProcessExplorer заменяет TaskMgr.