块控制+ Alt +删除

时间:2009-11-02 08:53:37

标签: c# .net

我正在使用C#进行在线测验项目。测试客户端是在Windows XP上运行的Windows桌面应用程序。我需要阻止 control + alt + delete 组合键,以防止学生最小化/关闭应用程序。

使用PInvoke对我来说没问题。

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

14 个答案:

答案 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 \政策\系统

  • DisableTaskMgr
  • DisableChangePassword
  • DisableLockWorkstation

HKEY_CURRENT_USER \ SOFTWARE \微软\的Windows \ CurrentVersion \政策\探险

  • NoLogoff

如果你这样做,那么当你按 Ctrl - Alt - Del 时,你会得到如下对话(在XP下):

alt text

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

更新:刚才意识到这也会阻止 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)

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

  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();
    }
    

答案 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来发现这一点。