高架cmd.exe进程的环境变量来自何处?
与所有进程一样,它从生成命令提示符实例的进程中获取其环境。
当进程生成另一个进程时,子进程将继承父进程的环境。如果父级具有特权,那么它可能具有比不存在更多/不同的变量。当它生成子进程时,子进程将获得相同的集合。
根据命令提示会话的权限级别,SET命令显示的环境变量可能会有显着差异。
因为当Explorer实际上没有产生特权进程时,CSRSS会这样做。当您以“管理员”身份运行程序时,会出现UAC提示,使屏幕变暗。这是因为CSRSS是一个处理UAC提示和进程提升的系统进程。因此,虽然资源管理器及其子进程有一个环境,但提升的命令提示符(由资源管理器的命令下的高权限系统进程生成)会得到一个稍微不同的集合,其中包含一些额外/不同的变量。
此外,似乎任何由同一用户使用管理凭据运行的程序都可以创建环境变量,这些变量将在该过程结束后持续很长时间,并将在该用户启动的任何后续升级过程中设置(并且仅在那些提升的过程中)。
不。该set
命令仅限会话。关闭该命令提示符后,您所做的任何更改都会失败。要进行持久更改,必须使用外部工具,如第三方实用程序或Microsoft工具程序setx
。即使是提升的命令提示也是如此; 该set
命令根本没有修改注册表中环境的功能。
对于与用户登录会话关联的任何进程,我无法在Process Explorer显示的Environment选项卡中找到这些变量。
因为您所做的任何更改set
只会在该特定命令提示符和您从该特定命令提示符启动的任何进程中可见; 更改不会传播到其他进程。
我的问题是存储这些值的位置,以及为什么Process Explorer无法访问它们(当然,因为默认情况下Process Explorer运行提升,这些变量出现在它自己的Environment选项卡中)?或者我只是忽略了它们?
会话变量存储在该特定命令提示符的环境中。Process Explorer可以查看它们的特定实例cmd
,但它们不会出现在任何其他进程中。如果从该命令提示符启动程序,则可以在Process Explorer 的子进程“ 环境”选项卡中看到这些更改,因为它将从该命令提示符继承它们。
如果您使用类似setx
设置持久变量的程序,那么它们将存储在注册表中。如果设置用户级变量(对于当前用户),则将其存储在HKCU\Environment
(或HKU\<USER>\Environment
用于其他用户)。如果设置系统级变量,则将其存储在HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
。
请注意,如果通过注册表手动修改环境,则只有新进程才会获取更改。要使现有进程查看更改,您必须重新启动它们或广播WM_SETTINGCHANGE
消息。(像setx
向所有顶级窗口广播消息的工具。)