有没有办法为 explorer.exe 设置在 Windows 重新启动时不存在的环境变量?

有没有办法为 explorer.exe 设置在 Windows 重新启动时不存在的环境变量?

有没有办法为 explorer.exe 设置在 Windows 重新启动时不存在的环境变量?

我看了一些评论Windows中查看进程环境变量 他们提出了这个有趣的观点。

他们指出,当您从该窗口/“环境变量”窗口设置环境变量时,会在那里设置系统环境变量。然后它为 explorer.exe 进程设置它们。因此,任何新的 cmd 窗口都会收到它们。因为从父进程 explorer.exe 生成的子 cmd.exe 进程继承了这些变量。当您在 cmd.exe 中使用 SET 命令时,它仅适用于该 cmd 窗口,因为它仅为该特定的 cmd.exe 进程设置它们。因此,那里的注释指出环境变量始终特定于进程。

当 Windows 重新启动时,在“环境变量”窗口中设置的环境变量会保留下来,这样当 Windows 重新启动时,它们仍然存在。而且我知道在那里设置的环境变量被写入注册表。

我想知道,是否可以为 explorer.exe 设置环境变量,而无需将它们进入注册表,并且 Windows 重启后它们就不会再存在?

注意 - 我的问题问的是“不将它们写入注册表”。因此,将它们写入注册表然后删除它们的解决方案不是解决方案。SETX 不是解决方案,因为 SETX 只是在环境变量窗口中设置变量的命令行版本,它会将它们设置在注册表中。REG 命令也可用于从注册表中添加/删除https://stackoverflow.com/questions/1472722/how-to-remove-an-environment-variable-from-the-system-configuration-with-a-batch 或者https://stackoverflow.com/questions/13222724/command-line-to-remove-an-environment-variable-from-the-os-level-configuration 但这不是一个解决方案/不是我所说的。

答案1

“环境变量”窗口实际上并没有直接为 explorer.exe 更改环境变量 - 它只广播“系统设置已更改”公告,explorer.exe 收到该公告后会从注册表重新加载其环境。因此,没有不依赖注册表更改其环境的标准机制。

但是,你可以出口explorer.exe 并从 cmd.exe 窗口重新启动它,这将导致新的 Explorer 进程再次从其父进程继承所有环境变量。(按住 Ctrl 和 Shift 键单击任务栏时钟并选择“退出 Explorer”,然后explorer从 cmd 运行。)

“System Informer”任务管理器应用程序(以前称为“Process Hacker”)可用于在进程的“属性”窗口中使用调试 API 编辑任何进程的环境变量。(忽略它按来源分组变量;它们仍然最终位于单个每个进程的列表中。)

答案2

我看不出有什么好的方法来实现“临时”explorer.exe变量,如果运行不同的工具SETX,这些变量会保留,但不会在注销/重启时保留。

即,您可以使用SETX,手动更新注册表,然后广播“系统设置已更改”,使用调试 API 等,在explorer.exe进程中设置环境变量。然后,您可以手动编辑注册表以不包含新的环境变量,这样下次系统启动时explorer.exe就不会加载环境变量。但我非常有信心,如果另一个工具导致“系统设置已更改”广播,那么 EXPLORER 会忘记您想要的环境变量?


您可以创建一个系统启动工具(即使用shell:startup任务计划程序或服务),在SETX下次重新启动时删除环境变量。但这样就会出现竞争条件,因为其他一些系统启动进程已经在您的工具之前启动了。如果您只关心用户以交互方式启动的进程,那么这种权衡就没问题。

答案3

据我所知,这是不可能的。

从 C# 中可以看出,进程可以设置自己的环境变量Environment.SetEnvironmentVariable("MY_ENV_VARIABLE", "someValue", EnvironmentVariableTarget.Process) https://learn.microsoft.com/en-us/dotnet/api/system.environmentvariabletarget?view=net-7.0

但它不能设置其他进程。(除非能够以某种方式写入与该进程关联的内存块!)。(或者除非进程从文件或注册表读取其环境变量并且其他进程更改该文件或该注册表位置)

一位专家向我指出,explorer.exe 根据两个列表设置其环境变量。这很有道理。

因此,explorer.exe 会查看注册表中所谓的“用户环境变量”和所谓的“机器环境变量”(每个变量都只是一个更高级别的概念)的内容,并根据这些列表设置其环境变量。

所有或大多数进程都是从 explorer.exe 生成的,因此 explorer.exe 是它们的父进程https://stackoverflow.com/questions/51176823/why-most-processes-have-the-explorer-exe-as-their-parent-process 从而从 explorer.exe 继承环境变量

如果你在这里看到 Jamie 的回答https://stackoverflow.com/questions/13222724/command-line-to-remove-an-environment-variable-from-the-os-level-configuration Explorer.exe 有一种方法可以让它从注册表中重新读取环境变量。powershell 脚本可以广播“Windows 消息 (WM_SETTINGCHANGE)”。因此 explorer.exe 可以更新其环境变量,而无需重新启动 explorer.exe。

因此对于标题中的问题是“有没有办法为 explorer.exe 设置在 Windows 重新启动时不存在的环境变量?”

愚蠢的答案是打开环境变量窗口,设置环境变量,然后 explorer.exe 将具有该环境变量。然后,当您不再需要它时,打开环境变量窗口并从那里删除它。然后,当 windows 重新启动时它就不会在那里了。

当然,我在我的问题中提到

“我想知道,是否可以为 explorer.exe 设置环境变量无需进入注册表

有人建议使用 setx。但这只是从命令行执行环境变量窗口添加变量的操作,因此包括写入注册表。并且 setx 目前不提供从注册表中删除的选项,例如可以使用 reg 命令。并且我认为 setx 会发送消息让 explorer.exe 知道从注册表中重新读取,就像环境变量窗口可能做的那样。因此新进程会继承/查看新的环境变量。但就像使用上面提到的方法一样。Reg 命令用于从注册表中添加/删除,以及广播命令。这一切都使用/涉及注册表。因为这是 explorer.exe 为进程设置其环境变量提供的路线。

所以

答案肯定是否定的(除非有人以某种方式破解了 explorer.exe 进程!)

相关内容