以编程方式更改Windows Shell

15
我正在开发一个将被“嵌入”到Windows 7系统中的项目,这将通过禁用任务管理器并将Windows shell更改为应用程序来实现,以及其他一些事情。
我想要做的是在应用程序和explorer.exe之间以编程方式更改Windows shell,并想知道是否有任何在C#中实现此目的的方法。
目前,我有几行代码试图更改Windows Shell的注册表项,但在刷新注册表编辑器后似乎没有任何变化,代码如下:
    regKey = Registry.LocalMachine.OpenSubKey("SOFTWARE", true).OpenSubKey("Microsoft", true).OpenSubKey("Windows NT", true).OpenSubKey("CurrentVersion", true).OpenSubKey("Winlogon", true);
    regKey.DeleteValue("Shell");
    regKey.SetValue("Shell", shell);
    regKey.Close();

我已经尝试重新启动Windows,以查看是否允许shell更改完成,但是没有效果。

如果有人能告诉我是否有可能通过编程方式实现,并且我在哪里出错了,我将不胜感激。

此外,我很感谢知道是否有一种方法可以编写程序,使其始终具有管理员权限,以便注册表编辑正常工作。

非常感谢,

理查德


1
有谁会脑子正常地安装一个禁用任务管理器的应用程序? - Security Hound
1
@Ramhound 这个问题不是关于禁用任务管理器的,因为这个应用程序不会销售给普通公众,因为普通公众对它没有用处。这是为了专业应用程序,其中包含敏感数据,而且需要保护应用程序本身免受盗窃和篡改的影响。 - Richard Benn
@RichardBenn:我认为你应该问一下这个问题。通常为了防止敏感数据/盗窃,我们使用密码和加密。为什么你忽略了这些标准路径?没有安全专家会建议通过更改Windows shell来增强安全性。 - tenfour
@tenfour 为什么你认为密码和加密还没有被使用?文件中的数据已经被加密,但是需要对数据进行更多的保护。替换shell是为了防止人们使用Windows资源管理器复制可执行文件并尝试反向工程化,这也是禁用任务管理器的原因。 - Richard Benn
1
因为我无法想象你的解决方案在加密之上能够增加什么“数据保护”。听起来你想要基本实现一个亭子模式,在这种模式下没有其他应用程序在运行(不仅仅是TM和Explorer)。否则,用户不会只是打开命令提示符来复制文件吗?或者更有可能:将其发送到自己的电子邮件中?肯定已经存在针对此目的的亭子解决方案。 - tenfour
1个回答

15

在网上搜索了很久后,我终于让Shell切换到正在构建的应用程序的可执行文件。

"嵌入"过程是一个三步骤的过程,在我正在开发的软件中,我们首先禁用任务管理器,然后在本地机器注册表中设置shell可执行文件,最后在当前用户注册表中重复这个过程。

以下是实现此操作的代码:

public void embedSoftware()
{
    try
    {
        // Disable Task Manager
        regKey = Registry.CurrentUser.OpenSubKey(subKey, true).CreateSubKey("System");
        regKey.SetValue("DisableTaskMgr", 1);
        regKey.Close();
        // Change the Local Machine shell executable
        regKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon", true);
        regKey.SetValue("Shell", shell, RegistryValueKind.String);
        regKey.Close();
        // Create the Shell executable Registry entry for Current User
        regKey = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows NT\CurrentVersion\Winlogon", true);
        regKey.SetValue("Shell", shell);
        regKey.Close();
        MessageBox.Show("Embedding Complete");

    }
    catch (Exception e)
    {
        MessageBox.Show(e.Message);
    }
}
在这个例子中,变量"shell"是一个字符串,包含要用作新Windows Shell的可执行文件路径。
此外,还有一种方法可以“取消嵌入”软件,这种方法只需从当前用户注册表中删除“DisableTaskMgr”和“Shell”值,并将本地计算机注册表中的“Shell”值重置为“explorer.exe”。
我希望这能帮助那些在程序中遇到更改Windows Shell困难的人。
敬礼,
理查德

2
抱歉,我在这里发布问题和回答方面还很新手。我编辑了答案,使其只是一个答案。 - Richard Benn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接