Onde as variáveis ​​de ambiente são armazenadas no registro?

190

Preciso acessar uma variável de ambiente remotamente. Para fazer isso, acho que a melhor maneira é lê-lo no registro.

Onde as variáveis ​​de ambiente são armazenadas no registro?

Brian R. Bondy
fonte

Respostas:

282

Aqui é onde eles são armazenados no XP através do Server 2012 R2:

Variáveis ​​de usuário

HKEY_CURRENT_USER\Environment

Variáveis ​​do sistema

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
Steve Scheffler
fonte
7
Lembre-se de reiniciar o sistema para efetivar suas alterações.
0x6B6F77616C74 6/08
22
Você não precisa reiniciar. Basta matar o Explorer.exe e devolvê-lo vivo. É o processo pai para eg cmd.exe (quando iniciado a partir do menu Iniciar)
Cristian Diaconescu
2
Que tal para outros processos - como o IIS? Suponho que o Explorer.exe não seja o pai desses, portanto, seria necessário reiniciar?
Colin
3
Processos lidos nas variáveis ​​de ambiente do sistema no momento em que são iniciados. Portanto, com algo como o IIS, reiniciar esse serviço deve trazer os valores atualizados.
precisa saber é o seguinte
11
Variáveis de caminho de usuário (Meus Documentos, AppData, etc) são armazenados emHKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
mythofechelon
22

Sei que isso é antigo, mas existe uma maneira mais eficiente de fazer isso no Windows 7. O SETX é instalado por padrão e suporta a conexão com outros sistemas.

Para modificar as variáveis ​​de ambiente global de um sistema remoto, você usaria

setx /m /s HOSTNAME-GOES-HERE VariableNameGoesHere VariableValueGoesHere

Isso não requer a reinicialização do explorer.

Jake Nelson
fonte
9
Tenha cuidado com isso, pois o setx trunca tudo após os 1024 caracteres !!! superuser.com/questions/387619/…
WalyKu 24/10
5

cmd:

reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
reg query HKEY_CURRENT_USER\Environment

Powershell:

Get-Item "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
Get-Item HKCU:\Environment

Powershell / .NET: (consulte https://msdn.microsoft.com/en-us/library/system.environmentvariabletarget(v=vs.110).aspx )

[System.Environment]::GetEnvironmentVariables([System.EnvironmentVariableTarget]::Machine)
[System.Environment]::GetEnvironmentVariables([System.EnvironmentVariableTarget]::User)
masterxilo
fonte
3

Sempre tive problemas com isso, fiz um getx.bat:

::getx %envvar% [\m]
::reads envvar from user enviroment variable and stores it in getxvalue variable
::with \m read system enviroment

@SETLOCAL EnableDelayedExpansion
@echo OFF

@set l_regpath="HKEY_CURRENT_USER\Environment"
@if "\m"=="%2" set l_regpath="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"

::REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v PATH /t REG_SZ /f /d "%PATH%"
::@REG QUERY %l_regpath% /v %1 /S

@FOR /F "tokens=*" %%A IN ('REG QUERY %l_regpath% /v %1 /S') DO (
@  set l_a=%%A
@   if NOT "!l_a!"=="!l_a:    =!" set l_line=!l_a! 
)

::delimiter is four spaces change it to tab \t
@set l_line=!l_line!
@set l_line=%l_line:    =   %

@set getxvalue=

@FOR /F "tokens=3* delims=  " %%A IN ("%l_line%") DO (
@   set getxvalue=%%A
)
@set getxvalue=!getxvalue!
@echo %getxvalue% > getxfile.tmp.txt
@ENDLOCAL

::we already used tab as delimiter
@FOR /F "delims=    " %%A IN (getxfile.tmp.txt) DO (
    @set getxvalue=%%A
)
@del getxfile.tmp.txt

@echo ON
fantastory
fonte