Where do the environment variables for an elevated cmd.exe process come from?
Como todos os processos, ele obtém seu ambiente do processo que gerou a instância do prompt de comando.
Quando um processo gera outro processo, o processo filho herda o ambiente pai. Se o pai foi privilegiado, provavelmente tem mais / diferentes variáveis do que se não for. Quando gera um processo filho, o filho recebe o mesmo conjunto para começar.
The environment variables shown by the SET command can be notably different depending on the privilege level of the command prompt session.
Como o Explorer não gera processos privilegiados, o CSRSS sim. Quando você executa um programa “como admin”, você recebe um prompt do UAC que escurece a tela. Isso ocorre porque o CSRSS é um processo do sistema que manipula prompts do UAC e elevação de processos. Portanto, enquanto o Explorer e seus processos filhos têm um ambiente, um prompt de comando elevado (que é gerado pelo processo do sistema de alto privilégio no comando do Explorer) recebe um conjunto ligeiramente diferente com algum extra / diferente variáveis.
Moreover, it seems that any program run with administrative credentials by the same user can create environment variables that will persist long after that process ends and will be set in any subsequent elevated process launched by that user (and ONLY in those elevated processes).
Não. O comando set
é somente de sessão. Depois de fechar esse prompt de comando, todas as alterações feitas serão feitas. Para fazer alterações persistentes, você deve usar uma ferramenta externa como um utilitário de terceiros ou o programa de ferramentas da Microsoft setx
. Isso é verdade até mesmo em prompts de comando elevados; O comando set
simplesmente não possui funcionalidade para modificar o ambiente no registro.
I have not been able to find those variables in the Environment tab shown by Process Explorer for any process associated with the user login session.
Porque todas as alterações que você fizer com set
serão visíveis apenas no prompt de comando específico e em quaisquer processos que você iniciar a partir desse prompt de comando específico ; as mudanças não se propagam para outros processos.
My Question is where are those values stored, and why is Process Explorer unable to access them (of course, since Process Explorer runs elevated by default those variables appear in its own Environment tab)? Or did I just overlook them?
As variáveis da sessão são armazenadas no ambiente específico do prompt de comando. O Process Explorer pode vê-los para essa instância específica de cmd
, mas eles não estarão em nenhum outro processo. Se você iniciar um programa a partir desse prompt de comando, poderá ver essas mudanças na guia Ambiente do processo filho no Process Explorer porque ele as herdou desse prompt de comando.
Se você usar um programa como setx
para definir uma variável persistente, elas serão armazenadas no registro. Se você definir uma variável no nível do usuário (para o usuário atual), ela será armazenada em HKCU\Environment
(ou HKU\<USER>\Environment
para outros usuários). Se você definir uma variável no nível do sistema, ela será armazenada em HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
.
Lembre-se de que, se você modificar manualmente o ambiente por meio do registro, apenas novos processos selecionarão as alterações. Para obter o processo existente para ver as alterações, você deve reiniciá-las ou transmitir uma mensagem WM_SETTINGCHANGE
. (Ferramentas como setx
transmitem a mensagem para todas as janelas de nível superior.)