如何在 Windows 10 中用另一个进程替换系统 shell(explorer.exe)?

如何在 Windows 10 中用另一个进程替换系统 shell(explorer.exe)?

这是适用于 Windows 10 的。

有没有办法用 powershell 脚本等替换 explorer.exe?

我希望启动自定义 shell 应用程序,而不必让 explorer.exe 在后台运行或处理这些项目的启动。

编辑:因为我被否决了……我能够在 Windows Embedded 7 Standard 中做类似的事情。我添加了一个名为

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

此处添加的密钥包含 Powershell.exe,它带有命令行选项,可以静默执行脚本。在那里,我可以执行我的自定义 shell。

这不适用于 Windows 10。

答案1

这存储在密钥中:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell

将其替换为您想要的任何内容,但它加载的软件将需要提供一种注销/关闭/重新启动机器的方法,或者您需要使用任务管理器来执行此操作。

答案2

多年来我一直都是这样做的,从 Windows NT4 到 Windows 10 和 Server 2019。

最好更改 Windows 资源管理器的设置以显示文件扩展名,这样您就不会选择“ntuser.dat.log”或“ntuser.ini”或下面的另一个错误文件。

  1. 创建一个新用户,比如说“测试”。
  2. 以该用户身份登录,这样将执行第一个登录代理,创建配置文件目录和注册表配置单元。
    再次注销,然后重新登录到您的正常帐户(或属于管理员组的任何帐户)。
  3. 确保您刚刚注销的用户帐户未登录 - 在本过程的剩余过程中,无论是在控制台、远程桌面,还是在该帐户下可能处于活动状态的任何计划任务。
  4. 打开 regedit,然后选择 HKEY_USERS。
  5. 菜单文件/加载配置单元。
    导航到 C:\Users\{新用户名} -- 在我的示例中为 C:\Users\Test
    选择文件“NTUSER.DAT”并加载它。
  6. 系统将提示您输入一个键名。只需输入一个键名,用户的注册表配置单元将以该名称作为 HKEY_USERS 中的新分支加载。我在这里使用了“Test”。
  7. 转到 HKEY_USERS\Test\Software\Microsoft\Windows NT\CurrentVersion\Winlogon
    创建一个名为 Shell 的新字符串值。
    将其设置为要启动的应用程序,而不是普通的 Windows shell。
    指定完整路径,不要对 PATH 环境变量等做任何假设,据我所知,当 Windows 读取此键时还没有环境。
    我在下面的示例中使用了“C:\Windows\system32\cmd.exe”。
    这适用于没有路径的 explorer.exe,所以我认为 Windows 会搜索 C:\Windows 目录 - 但我不确定,因为如果您将设置留空或指定不存在的文件,它也会启动 explorer.exe。
  8. 重要的
    现在返回 HKEY_USERS\Test,卸载该配置单元(菜单文件/卸载配置单元,然后确认)。
    如果您跳过此步骤并保持加载,则下次您以该用户身份登录时,整个用户配置文件(包括其注册表配置单元)将以新名称(C:\Users\Test.1 或类似名称)重新创建,并且您的更改将丢失。Windows
    10 及更高版本的服务器系统似乎比旧版本更宽容,但我不会冒险。
  9. 现在只需注销,然后以测试身份登录。

这是在 VMWare 下的 Server 2019 VM 中看到的结果,我刚刚运行了此过程以确保没有跳过任何步骤: 结果截图

创建 shell 程序时需要记住以下几点:

  • 即使您的 exe 位于其他位置,您的自定义 shell 也会在 C:\Windows\system32\ 中作为工作目录启动。
    如果您创建了一个普通用户帐户(非管理员),它将没有写入权限,因此如果您希望您的应用在其工作目录中写入日志文件等,最好尽早“cd”到其他地方。
  • 当您的应用程序退出(或崩溃)时,它不会将您注销 - 您将看到一个空白的黑屏。
    例如,在 cmd.exe 中,通过发出“logoff”命令(C:\Windows\system32'\logoff.exe)注销。
  • 您可能希望在用 C# 等编写的自定义应用中使用某些功能,但由于它是由 explorer.exe 提供的,因此无法使用。
    它可能无法工作,只会给出错误,或者可能会启动 explorer.exe。
  • 如果您启动 explorer.exe(例如,在示例中的命令提示符下键入“explorer”),则第一个实例将不会显示您期望的资源管理器窗口。而是会显示正常的 Windows 桌面、任务栏等。
  • 不要以为用户永远也不会发现回到经典桌面的方法,即使你阻止 ctrl+alt+del 或删除任务管理器可执行文件。
    我的自助服务终端应用程序的用户在 20 多年前就发现了一个技巧,那是在 Windows NT4 下:从打印机中取出所有纸张,然后从我的应用程序内开始打印作业。(HP)打印机驱动程序发出的“缺纸”错误消息包含一个帮助按钮。在打开的帮助文件中,其中一个页面包含一个打开打印机控制面板的链接。控制面板只是 explorer.exe 的另一个实例。过了一会儿,商店服务员正在自助服务终端上浏览网页。

答案3

在我的 Windows 10 Embedded Enterprise 框中,我拥有具有管理员权限(受密码保护)的主用户和具有普通用户权限且无密码的“操作员”用户。

此步骤是可选的,仅当您想自动登录时才需要:

开始-运行(或 Win-R)并启动netplwiz,取消选中Users must enter a username and password...复选框并点击Apply:会弹出一个新窗口,要求输入默认用户名和密码。就我而言,我使用 Operator 和空白密码。按OK,在另一个窗口中也按OK以接受更改并关闭窗口。

即使用户必须使用密码登录,以下操作仍有效,因此上述操作实际上是可选的,仅当需要老式 Kiosk 模式时(对于非 UWP 应用程序)。

微软文档对你的问题有一个答案,简而言之:

  1. 在管理员用户下,打开注册表编辑器:regedit
  2. 转到HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\IniFileMapping\system.ini\boot\并将字符串的值Shell从默认值更改SYS:Microsoft\Windows NT\CurrentVersion\WinlogonUSR:Software\Microsoft\Windows NT\CurrentVersion\Winlogon
  3. (可选)转到并将字符串从默认HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon更改为其他内容。这通常是在找不到基于用户的 shell 的情况下的备份。此设置适用于所有用户,因此我更喜欢将其保留为启用状态。Shellexplorer.exeexplorer.exe
  4. 如果您按照上述步骤创建了默认用户,则可以选择以默认用户身份登录。转到HKEY_Current_User\Software\Microsoft\Windows NT\CurrentVersion\Winlogon创建/更改字符串的值Shell,以指向要作为给定用户的自定义 shell 运行的可执行文件或批处理文件。

在此设置中,当计算机启动时,操作员用户会自动登录,并启动我的自定义应用程序。需要时,我将网络电缆连接到计算机并使用 VNC 进行连接(可选,我只需插入键盘),按 Ctrl-Alt-Del 并锁定或注销操作员用户。然后我以管理员用户身份登录,并启动“正常”的 Windows 资源管理器。我进行任何必要的更改,然后重新启动计算机或注销并再次以操作员身份登录。

请记住,错误的注册表设置可能会导致系统无法启动。虽然我尝试准确地表示步骤,但请参考实际文档,在尝试任何更改之前至少完整阅读一次,以便您全面了解需要做什么...希望这能有所帮助。

答案4

作为@nurchi 答案的补充:

我试了很多次,看起来你只能使用一些程序作为Windows 10 shell,例如:cmd。

但当我尝试使用其他程序(如任务管理器(system32 中的 taskmgr.exe))时,它不起作用。登录后 Taskmgr 不会启动。

解决此问题的方法是:使用 cmd 启动其他程序。

例如:您可以输入C:\windows\system32\cmd.exe /c notepad钥匙Shell

如果您想在记事本退出后启动资源管理器,您可以输入C:\windows\system32\cmd.exe /c notepad & explorer密钥Shell

相关内容