【问题标题】:Block Control+Alt+Delete块 Control+Alt+Delete
【发布时间】:2009-11-02 08:53:37
【问题描述】:

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

我可以使用 PInvoke。

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

【问题讨论】:

  • 您能告诉我们哪些专有应用程序可以做到这一点吗?
  • 当用户在任务栏 > 任务管理器上执行 Ctrl+Shift+Esc 或右键单击时,您的专有应用程序是什么?
  • 在你不拥有的机器上限制这么多的控​​制权感觉不对。我的意思是,什么样的测验如此重要以至于如果应用程序崩溃,恢复计算机的唯一方法就是重新启动它(甚至将其送去维护)?
  • @evans: 如果他们有两台电脑,你会怎么做?如果他们有纸质书,你会怎么做?您希望您的应用程序阻止他们阅读论文吗?阻止他们在他们的个人计算机上做任何事情是一个非常糟糕的主意。他们拥有它,他们统治着它。我会讨厌任何强迫我安装应用程序试图接管我的计算机的人,你问我们如何构建恶意软件。
  • 阅读这些 cmets,似乎停止 Ctrl-Atl-Del 的整个想法是徒劳的。您无法阻止某人从远程位置进行测试:a) 在 VM 中运行,b) 使用书籍,c) 拥有多台 PC,d) 使用 linux 和 Mono。

标签: c# .net


【解决方案1】:

我发现了一种非常丑陋的方法(效果很好)。 如果我以独占方式打开 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+Shift+Esc 的功能。
  • 这有点疯狂,但我猜TaskMgr只是一个普通的.exe。
【解决方案2】:

对于 Windows XP,正确的做法是创建自己的图形识别和身份验证动态链接库,或简称 gina.dll。 Here's an MSDN article about it。此 DLL 导出一组与 Winlogon 进程交互的函数,并为登录请求(安全操作序列事件)提供用户界面。主要的登录请求是 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。

【讨论】:

  • 我不想实际替换任何 dll - 基本上,我不想进行任何永久性更改 - 即使是最严重的崩溃也应该通过重新启动来修复。
  • 我读过这篇文章,但它有点超出我的想象。你能提供更多帮助吗?也许是一个工作样本的链接?谢谢。
  • 工作样本?这可不是一件快事!我手头确实有 gina.dll 替换的源代码,但是它太大了,无法直接在此处发布,并且需要进行一些编辑才能将其精简为您需要的内容。我会看看我能做什么。
  • ZIP 文件链接已损坏 :-(
  • @ThomasWeller:这是 12 年前的事了!我已经搬了几次家,也升级了我的虚拟主机几次。我仍然有一些原始代码,但我不知道它是否与我发布的代码相同,我可能已经剥离了特定于应用程序的代码来制作一个简单的实现,所以我不会发布我刚刚发布的代码为了安全起见(版权律师是邪恶的!)。此外,它适用于 WinXP,在 Win7 或更高版本上根本无法使用。
【解决方案3】:

正如其他人所提到的,很难阻止 Ctrl-Alt-Del,因为它是 Windows 安全性的基本组成部分。

但是,您可以通过添加以下注册表项来阻止在 Ctrl-Alt-Del 之后可以执行的操作。 p>

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

  • DisableTaskMgr
  • 禁用更改密码
  • 禁用LockWorkstation

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

  • 不注销

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

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

更新:刚刚意识到这也阻止了 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】:

我实现了类似的目标,但我在 Time Tracker 工具中采用了不同的策略。这将为您提供一个占据屏幕的表单 - 不允许窗口出现在其顶部,并且如果启动,则会关闭任务管理器。

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

【讨论】:

  • 谢谢。我的代码已经包含您所说的所有内容(任务管理器杀戮除外)。计算机可能位于域中,在这种情况下任务管理器甚至不会出现。知道我可以为此做些什么吗?
  • 为什么打开 Windows 安全中心的能力有问题?他们所能做的就是“锁定计算机”、“注销”、“关闭”、“更改密码”和打开“任务管理器”(此代码阻止其正常运行)......
  • 这是迄今为止唯一不需要管理员权限的解决方案。
  • 这是一个可行的解决方案,但没有什么能阻止将 taskmgr.exe 重命名为 1337taskmgr.exe 并在应用程序之前执行的学生 :) 如果这适用于计算机科学专业的学生,​​那么 OP 将很难无论哪种方式,都要花时间强化他的应用程序。
【解决方案6】:

this article 中描述了三种方法(注册表、管理模板和挂钩)。

代码在 C++ 中,但使用 P/Invoke 很容易将其移植到 C#。

【讨论】:

  • 我以前看过这个页面。我已经下载了示例,但即使这样也不起作用。除 Control+Alt+Del 之外的所有其他选项都有效,但选中“Block Control+Alt+Del”选项会使应用程序崩溃。 - 我正在运行已经编译的二进制文件,所以编译等没有问题。
【解决方案7】:

你真正想做的是什么? 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

【讨论】:

  • “图像文件执行选项”是邪恶的(嗯......不是真的)。好主意!我能看到的唯一缺点是,如果应用程序以不寻常的方式终止,taskmgr 仍将被禁用(因为应用程序没有机会删除该密钥)。
  • hmm... 您的解决方案也存在与我的问题相同的问题... 如果禁用欢迎屏幕而不是 taskmgr,则在按下 Ctrl-Alt-Del 时会打开 Windows 安全性窗口。哪个没有被这个阻止。
  • 我无法进行任何永久性更改,例如更改注册表,因为 1. 我不能真正假设我的程序将具有管理员权限 - 实际上管理员权限是例外。 2.如果我的程序由于某种原因崩溃了,这将是学院工作人员额外的故障排除工作
  • 计算机也可能是域的一部分,因此单独阻止任务管理器无济于事。实际上,阻止任务管理器不会那么麻烦 - 我可以搜索窗口标题并关闭它或遵循一些描述的 Hackish 方法。
【解决方案8】:

根据 Windows Internal book (4th edition),Ctrl-Alt-Del 序列不能被非特权应用程序拦截。此外,据说这个特定的序列不能被截获,Winlogon 进程将始终接收它(第 529 页)。

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

【讨论】:

  • 不会相信它。 Siemens Syngo(医学图像)阻止 Ctrl+Alt+Del。
【解决方案9】:

正如其他答案中所指出的,如果不检查每个学生的计算机,就没有安全的方法来完成此任务,因为他们总是可以运行虚拟机。

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

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

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

VM 解决方案仍然会欺骗这一点,因此您需要确保每个人都真正从 CD 引导;否则我想不出任何办法。

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

【讨论】:

  • 谢谢。这是我已经得出的解决方案——作为唯一合理的万无一失的解决方案。当我试图阻止密钥时,大多数防病毒软件都不喜欢它:(
  • @blackholeearth0_gmail:是的,我的回答中提到了这一点:“VM 解决方案仍然会欺骗这一点,因此您需要确保每个人都真正从 CD 启动”。
【解决方案10】:

替代解决方案:

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

然后,取出 Ctrl(或 alt)键,将纸放在触点上。

多田!

(只需使用另一个键盘进行维护)

【讨论】:

  • 你试过了吗?在发表评论之前,我在我的系统中进行了尝试。不能 Ctrl-Alt-Del 使用 OSK 或 OSK 和实际键盘的组合。还是我的系统坏了?
  • moogs,看看我的“第二个”解决方案...有点像你的:)
【解决方案11】:

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

【讨论】:

  • 如果在 OnFormClosing 事件中 CloseReason 是 CloseReason.UserClosing 或 CloseReason.FormOwnerClosing,您也可以只将 Cancel 设置为 true。
  • @Philip:太棒了,我不知道这也会抓住 alt+F4。谢谢!
  • 我已经有一个解决方案可以阻止所有键..除了万能的 Control+alt+del。
【解决方案12】:

我想知道你是否可以在键盘驱动程序上安装一个过滤器?

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

我确实找到了为我的键盘定义的“UpperFilters”注册表项...

这个USB sniffer 附带实现过滤器的源代码。它可以在键盘嗅探器/修改过滤器的上下文中使用。 (Download link)

【讨论】:

    【解决方案13】:

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

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

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

    【讨论】:

      【解决方案14】:

      一个非常愚蠢的解决方案(假设机器专用于您的软件)是重新映射 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 比你做不到 登录。 :)

      【讨论】:

      • 这有点像 moogs 的解决方案。 :D
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-23
      • 2015-10-30
      • 1970-01-01
      • 2016-09-30
      相关资源
      最近更新 更多