Gdzie w rejestrze przechowywane są zmienne środowiskowe?

191

Potrzebuję dostępu do zmiennej środowiskowej zdalnie. Aby to zrobić, myślę, że najlepszym sposobem jest odczytanie go z rejestru.

Gdzie w rejestrze przechowywane są zmienne środowiskowe?

Brian R. Bondy
źródło

Odpowiedzi:

283

Oto, gdzie są przechowywane na XP za pośrednictwem Server 2012 R2:

Zmienne użytkownika

HKEY_CURRENT_USER\Environment

Zmienne systemowe

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
Steve Scheffler
źródło
7
Pamiętaj, aby ponownie uruchomić system, aby wprowadzić zmiany w życie.
0x6B6F77616C74,
22
Nie musisz restartować. Po prostu zabij Explorer.exe i przywróć go do życia. Jest to proces nadrzędny dla np. Cmd.exe (po uruchomieniu z menu Start)
Cristian Diaconescu
2
Co powiesz na inne procesy - takie jak IIS? Zgaduję, że Explorer.exe nie jest nadrzędny dla tych, więc czy konieczne byłoby ponowne uruchomienie?
Colin,
3
Procesy odczytywane w zmiennych systemowych env w momencie ich uruchomienia. Tak więc w przypadku IIS ponowne uruchomienie tej usługi powinno przynieść zaktualizowane wartości.
Steve Scheffler,
11
Zmienne ścieżki użytkownika (Moje dokumenty, AppData itp.) Są przechowywane wHKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
mythofechelon
22

Zdaję sobie sprawę, że jest stary, ale istnieje bardziej wydajny sposób na wykonanie tego w Windows 7. SETX jest domyślnie instalowany i obsługuje łączenie się z innymi systemami.

Aby zmodyfikować globalne zmienne środowiskowe systemu zdalnego, którego byś użył

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

Nie wymaga to ponownego uruchomienia eksploratora.

Jake Nelson
źródło
9
Bądź z tym ostrożny, ponieważ setx obcina wszystko po 1024 charachters !!! superuser.com/questions/387619/…
WalyKu
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: (patrz 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
źródło
3

Zawsze miałem z tym problemy, zrobiłem 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
fantastyka
źródło