我正在使用C#进行在线测验项目。测试客户端是在Windows XP上运行的Windows桌面应用程序。我需要阻止 control + alt + delete 组合键,以防止学生最小化/关闭应用程序。
使用PInvoke对我来说没问题。
我知道这肯定是可能的,因为我看到有三个应用程序正在这样做。它们都是专有的,所以我无法知道它是如何完成的。
答案 0 :(得分:26)
我发现了一种非常难看的方式(效果很好)。 如果我完全打开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。)
答案 1 :(得分:15)
对于Windows XP,正确的方法是创建自己的图形标识和身份验证动态链接库,或简称gina.dll。 Here's an MSDN article about it。此DLL导出一组与Winlogon进程交互的函数,并为登录请求提供用户界面 - Secure Action Sequence事件。主登录请求是ctrl-alt-delete响应。标准gina.dll调用登录屏幕或任务管理器/注销对话框。创建自己的gina并不困难,但它确实需要C / C ++编码而不是C#,并且很容易使系统无法启动。这并不能阻止人们在启动时按F8并选择安全启动选项,该选项不会加载自定义gina.dll。
编辑:我还应该说你不需要实现gina需要实现的所有功能,你可以动态加载以前的gina.dll并将你不感兴趣的所有调用传递给旧的GINA.DLL。
编辑2:这个对Vista / Win7不起作用,因为他们改变了登录过程的架构。仍然可以在Vista / Win7中禁用ctrl-alt-delete,但它需要一种不同的机制 - 在某处有关于它的MSDN文章。编辑3:Here's a ZIP file containing the source code to make a 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。
答案 2 :(得分:12)
正如其他人提到的那样,很难阻止 Ctrl - Alt - Del ,因为它是Windows安全的基本组成部分。 / p>
但是,您可以通过添加以下注册表项来阻止 Ctrl - Alt - Del 之后可以执行的操作。
HKEY_CURRENT_USER \软件\微软\的Windows \ CurrentVersion \政策\系统
HKEY_CURRENT_USER \ SOFTWARE \微软\的Windows \ CurrentVersion \政策\探险
如果你这样做,那么当你按 Ctrl - Alt - Del 时,你会得到如下对话(在XP下):
这不是万无一失的,但它会阻止用户做一些基本的事情。
更新:刚才意识到这也会阻止 Ctrl - Shift - Esc ,我没有以前意识到。
答案 3 :(得分:6)
您可以预先运行隐藏进程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);
答案 4 :(得分:2)
你真的想做什么? Disable the task manager?
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
答案 5 :(得分:2)
this article中描述了三种方法(注册表,管理模板和挂钩)。
代码是用C ++编写的,但是用P / Invoke将它移植到C#很容易。
答案 6 :(得分:2)
根据Windows内部书籍(第4版),非特权应用程序无法拦截Ctrl-Alt-Del序列。此外,据说此特定序列无法被截获,并且Winlogon进程将始终接收它(第529页)。
然而,我从未尝试过这样做,但我相信这本书:)
答案 7 :(得分:2)
我实现了类似的目标,但是在时间跟踪器工具中采用了不同的策略。这将为您提供一个接管屏幕的表单 - 不允许窗口显示在它上面,如果它已经启动,它将击落任务管理器。
覆盖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();
}
答案 8 :(得分:2)
正如其他答案所指出的那样,没有检查每个学生的计算机就没有安全的方法来完成这项工作,因为他们总是可以运行虚拟机。
作为替代方案,您是否考虑过将应用程序刻录到LiveCD并要求学生启动LiveCD?
这样,只要他们运行您的应用程序,您就可以控制他们的操作系统。完成后,他们可以重新启动,一切都恢复正常。
当然,学生可以在中间重启笔记本电脑,但这可能需要很长时间才能被主管注意到。
虚拟机解决方案仍然可以解决这个问题,因此您需要确保每个人都能从CD中启动;否则我无法想到任何解决方法。
作为奖励,您将与学生笔记本电脑上的任何奇怪的操作系统问题(可能是某些已安装的Linux或OS X ;-)隔离开。)
答案 9 :(得分:0)
替代解决方案:
制作应用程序,这样您就不需要使用alt或ctrl键。
然后,取出Ctrl(或alt)键并将纸张放在联系人上。
多田!
(只需使用其他键盘进行维护)
答案 10 :(得分:0)
一个非常愚蠢的解决方案(假设机器专用于您的软件)是重新映射Alt键(为零)。
缺点:
适用于xp,Vista,W7。
您可以使用SharpKeys重新映射/禁用任何密钥。
For info on what registry key SharpKey changes see this. One can also remap on a per user basis.
警告:如果您禁用Alt键和 登录要求你按 Ctrl + Alt + Del比你无法做到 登录。 :)
答案 11 :(得分:0)
您还希望使用以下内容阻止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);
}
答案 12 :(得分:0)
我想知道你是否可以在键盘驱动程序上安装过滤器?
我知道在USB接口上,您可以在USB数据上安装一个上部或下部过滤器,以便在它到达计算机时拦截它,也许可以采取类似的方法。基本上,只要您的测试应用程序正在运行,您就可以修改来自键盘的组合键。
我找到了为我的键盘定义的'UpperFilters'注册表项...
此USB sniffer附带实现过滤器的源代码。它可以在键盘嗅探器/修改过滤器的上下文中使用。 (Download link)
答案 13 :(得分:0)
我建议其他方法来禁用任务管理器,适用于Windows 7但它只影响任务管理器选项。解决方案是将以下注册表项设置为无关值,例如“C:\”
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\taskmgr.exe\Debugger
您也可以使用此hack来启动您自己的任务管理器,只需将Debugger键设置为应用程序的完整路径即可。我通过分析ProcessExplorer如何取代TaskMgr来发现这一点。