块控制+ 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。)
正如其他人提到的那样,阻止Ctrl – Alt – Del非常困难,因为它是Windows安全的基本组成部分。
但是,您可以通过添加以下注册表项来阻止Ctrl – Alt – Del被推送后可以执行的操作。
HKEY_CURRENT_USER \软件\微软\的Windows \ CurrentVersion \政策\系统
- DisableTaskMgr
- DisableChangePassword
- DisableLockWorkstation
HKEY_CURRENT_USER \ SOFTWARE \微软\的Windows \ CurrentVersion \政策\ Explorer中
- NoLogoff
如果您这样做,那么当您按下Ctrl – Alt – Del时,您将获得如下所示的对话(在XP下):
这不是万无一失的,但它阻止用户做一些基本的事情。
更新 :刚刚意识到这也阻止了Ctrl – Shift – Esc ,我之前没有意识到。
您可以预先运行隐藏进程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页)。
然而,我从未尝试过这样做,但我相信这本书:)
我实现了类似的目标,但在时间跟踪器工具中采用了不同的策略,我掀起了目标。 这将为您提供一个接管屏幕的表单 – 不允许窗口显示在它上面,如果它已启动,它将击落任务管理器。
- 设置表单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(); }
正如其他答案中所指出的那样,没有检查每个学生的计算机就没有安全的方法来实现这一点,因为他们总是可以运行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,那么您将无法登录。 🙂