SET 命令显示的环境变量可能会因命令提示符会话的权限级别而明显不同。此外,似乎同一用户使用管理凭据运行的任何程序都可以创建环境变量,这些变量在该进程结束后会持续很长时间,并将在该用户启动的任何后续提升进程中设置(并且仅在这些提升进程中设置)。我无法在 Process Explorer 显示的与用户登录会话相关的任何进程的环境选项卡中找到这些变量。我的问题是:这些值存储在哪里,为什么 Process Explorer 无法访问它们(当然,由于 Process Explorer 默认以提升权限运行,因此这些变量出现在其自己的环境选项卡中)?还是我只是忽略了它们?
答案1
提升的 cmd.exe 进程的环境变量来自哪里?
与所有进程一样,它从生成命令提示符实例的进程获取其环境。
当一个进程生成另一个进程时,子进程会继承父进程的环境。如果父进程具有特权,那么它可能比没有特权时拥有更多/不同的变量。当它生成子进程时,子进程会从相同的集合开始。
根据命令提示符会话的权限级别,SET 命令显示的环境变量可能会有明显差异。
因为当 Explorer 不实际生成特权进程时,CSRSS 会生成特权进程。当您“以管理员身份”运行程序时,您会收到 UAC 提示,屏幕会变暗。这是因为 CSRSS 是一个处理 UAC 提示和进程提升的系统进程。因此,虽然 Explorer 及其子进程有一个环境,但提升的命令提示符(由高权限系统进程生成)应要求探险家 (Explorer) 会得到一个略有不同的集合,其中包含一些额外的/不同的变量。
此外,似乎同一用户使用管理员凭据运行的任何程序都可以创建环境变量,这些变量将在该进程结束后很长时间内持续存在,并将在该用户启动的任何后续提升进程中设置(并且仅在那些提升进程中)。
不行。该set
命令仅适用于会话。一旦关闭该命令提示符,您所做的任何更改都将失效。要进行持久更改,您必须使用外部工具,如第三方实用程序或 Microsoft 工具程序setx
。即使是提升的命令提示符也是如此;该set
命令根本没有修改注册表中环境的功能。
我无法在 Process Explorer 显示的“环境”选项卡中找到与用户登录会话相关的任何进程的这些变量。
因为你所做的任何更改都set
只能在那个特定的命令提示符以及您启动的任何进程那个特定的命令提示符;更改不会传播到其他进程。
我的问题是这些值存储在哪里,为什么 Process Explorer 无法访问它们(当然,由于 Process Explorer 默认以提升的权限运行,这些变量会出现在其自己的“环境”选项卡中)?还是我只是忽略了它们?
会话变量存储在该特定命令提示符的环境中。Process Explorer 可以看到该特定实例的会话变量cmd
,但它们不会出现在任何其他进程中。如果您从该命令提示符启动程序,则可以在子进程中看到这些更改'环境选项卡,因为它将从该命令提示符中继承它们。
如果您使用类似程序setx
设置持久变量,则它们将存储在注册表中。如果您设置用户级变量(针对当前用户),则它将存储在HKCU\Environment
(或HKU\<USER>\Environment
其他用户)。如果您设置系统级变量,则它将存储在中HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
。
请注意,如果您通过注册表手动修改环境,则只有新进程才会获取更改。要让现有进程看到更改,您必须重新启动它们或广播消息WM_SETTINGCHANGE
。(类似工具setx
将消息广播到所有顶级窗口。)
答案2
SET
我认为只有当您未以管理员组成员身份登录时,输出才会有所不同。这就是为什么在这种情况下要求您输入用户/密码的原因,您实际上是以管理员身份登录该过程的。
如果您已经是管理员组的成员,那么对我来说,两种情况下 SET 的输出都是相同的。
因此,如果我的假设是正确的,那么提升权限的变量就被定义为管理员的用户变量。
答案3
目前还不清楚如何在新创建的提升权限的进程中设置环境变量,但大多数变量来自当前用户的现有设置(如未提升权限的 cmd.exe SET 命令所示),以及用户 HKCU/Volatile Environment 注册表项中存在的任何变量,这些变量自当前登录会话(或当前 Explorer 实例?)开始以来就已创建,并且未显示在未提升权限的 SET 列表中。我的 Windows 10 中有几个变量出现在非提升权限列表中,但不出现在提升权限列表中。
这个问题的动机是旧版本 Macrium Reflect 的行为,该版本在https://forum.macrium.com/Topic752-1.aspx该程序的当前版本现在在 HKU/.DEFAULT/Volatile Environment(又名 HKU/S-1-5-18/Volatile Environment)而不是 HKCU 键下创建这些有问题的变量。