块控制+ Alt +删除

我正在用C#做一个在线测验项目。 测试客户端是在Windows XP上运行的Windows桌面应用程序。 我需要阻止控制 + alt + 删除组合键以防止学生最小化/关闭应用程序。

使用PInvoke对我来说没问题。

我知道这肯定是可能的,因为我看到有三个应用程序这样做。 它们都是专有的,所以我无法知道它是如何完成的。

对于Windows XP,正确的方法是创建自己的图形标识和身份validation动态链接库,或简称gina.dll。 这是一篇关于它的MSDN文章 。 此DLL导出一组与Winlogon进程交互的函数,并为登录请求提供用户界面 – Secure Action Sequence事件。 主登录请求是ctrl-alt-delete响应。 标准gina.dll调用登录屏幕或任务管理器/注销对话框。 创建自己的gina并不困难,但它确实需要C / C ++编码而不是C#,并且很容易使系统无法启动。 这并不能阻止人们在启动时按F8并选择安全启动选项,该选项不会加载自定义gina.dll。

编辑:我还应该说你不需要实现gina需要实现的所有function,你可以动态加载以前的gina.dll并将你不感兴趣的所有调用传递给旧的gina.dll 。

编辑2:这不适用于Vista / Win7,因为他们改变了登录过程的架构。 仍然可以在Vista / Win7中禁用ctrl-alt-delete,但它需要一种不同的机制 – 有关于它的MSDN文章。

编辑3: 这是一个ZIP文件,其中包含制作gina.dll的源代码。它是使用DevStudio 2005构建的。文件GinaInterface.cpp详细说明了安装新gina.dll库所需的步骤。 这将禁用“欢迎”屏幕并将其替换为“按crtl-alt-del”登录对话框。 就目前而言,这与标准gina.dll没有区别,所有与gina相关的调用都会传递给原始的gina.dll文件(在Windows \ System32文件夹中称为msgina.dll)。 要禁用ctrl-alt-del键,请更新GinaInterface.cpp中的函数WlxLoggedOnSAS。 要在应用程序运行时停止ctrl-alt-del,可以创建一个命名的互斥锁(CreateMutex)并测试它在gina.dll中的存在,如果互斥锁存在则停止ctrl-alt-del。

我找到了一种非常难看的方式(这很有效)。 如果我独占打开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安全系统将弹出,而不是Windows试图打开taskmgr并静默失败。 (→如果计算机位于域中,它也将无法工作,因为在域中会禁用“欢迎”屏幕。)

(当然这不适用于Vista或W7。)

正如其他人提到的那样,阻止CtrlAltDel非常困难,因为它是Windows安全的基本组成部分。

但是,您可以通过添加以下注册表项来阻止CtrlAltDel被推送后可以执行的操作。

HKEY_CURRENT_USER \软件\微软\的Windows \ CurrentVersion \政策\系统

  • DisableTaskMgr
  • DisableChangePassword
  • DisableLockWorkstation

HKEY_CURRENT_USER \ SOFTWARE \微软\的Windows \ CurrentVersion \政策\ Explorer中

  • NoLogoff

如果您这样做,那么当您按下CtrlAltDel时,您将获得如下所示的对话(在XP下):

替代文字

这不是万无一失的,但它阻止用户做一些基本的事情。

更新 :刚刚意识到这也阻止了CtrlShiftEsc ,我之前没有意识到。

您可以预先运行隐藏进程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); 

本文中描述了三种方法(注册表,管理模板和挂钩)。

代码是用C ++编写的,但是用P / Invoke将它移植到C#很容易。

你真的想做什么? 禁用任务管理器 ?

 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 

根据Windows Internal书(第4版),非特权应用程序无法拦截Ctrl-Alt-Del序列。 此外,据说此特定序列无法被截获,并且Winlogon进程将始终接收它(第529页)。

然而,我从未尝试过这样做,但我相信这本书:)

我实现了类似的目标,但在时间跟踪器工具中采用了不同的策略,我掀起了目标。 这将为您提供一个接管屏幕的表单 – 不允许窗口显示在它上面,如果它已启动,它将击落任务管理器。

  1. 设置表单TopMost = True。
  2. 覆盖Form.OnLoad方法,如下所示:

     protected override void OnLoad(EventArgs e) { base.OnLoad(e); this.Location = SystemInformation.VirtualScreen.Location; this.Size = SystemInformation.VirtualScreen.Size; } 
  3. 创建一个间隔为500毫秒的计时器,查找并杀死“taskmgr.exe”和“procexp.exe”。

  4. 覆盖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); } 
  5. 覆盖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(); } 

正如其他答案中所指出的那样,没有检查每个学生的计算机就没有安全的方法来实现这一点,因为他们总是可以运行VM。

作为替代方案,您是否考虑将应用程序刻录到LiveCD并要求学生启动LiveCD?

这样,只要他们运行您的应用程序,您就可以控制他们的操作系统。 完成后,他们可以重启,一切恢复正常。

当然,学生可以在中间重启笔记本电脑,但这可能需要很长时间才能被主管注意到。

VM解决方案仍会欺骗这一点,因此您需要确保每个人都能从CD中启动; 否则我无法想到任何解决方法。

作为奖励,您将与学生的笔记本电脑上的任何奇怪的操作系统问题(可能是某些安装的Linux或OS X ;-))隔离开来。

替代解决方案:

制作应用程序,以便您永远不需要使用alt或ctrl键。

然后,取出Ctrl(或alt)键并将纸张放在联系人上。

田田!

(只需使用其他键盘进行维护)

你还想用这样的东西阻止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); } 

我想知道你是否可以在键盘驱动程序上安装filter?

我知道在USB接口上,您可以在USB数据上安装一个上部或下部filter,以便在它到达计算机时拦截它,也许可以采取类似的方法。 基本上,只要您的测试应用程序正在运行,您就可以修改来自键盘的组合键。

我找到了为我的键盘定义的’UpperFilters’注册表项…

此USB嗅探器附带实现filter的源代码。 它可以在键盘嗅探器/修改filter的上下文中使用。 ( 下载链接 )

我建议其他方法来禁用任务管理器,适用于Windows 7但它只影响任务管理器选项。 解决方案是将以下注册表项设置为无关值,例如“C:\”

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

您也可以使用此hack来启动您自己的任务管理器,只需将Debugger键设置为应用程序的完整路径即可。 我通过分析ProcessExplorer如何替换TaskMgr来发现这一点。

一个非常愚蠢的解决方案(假设机器专用于您的软件)是重新映射Alt键什么都不是 )。

缺点:

  • 永久效果
  • 需要重启/注销才能激活

适用于xp,Vista,W7。

您可以使用SharpKeys重新映射/禁用任何键。

有关SharpKey更改的注册表项的信息,请参阅此内容。 还可以基于每个用户重新映射。

警告 :如果您禁用Alt键并且登录要求您按Ctrl + Alt + Del,那么您将无法登录。 🙂