Користувач проти системних змінних середовища: Чи змінюють системні змінні змінні користувачів?


21

Я маю підвищені права на свій ноутбук, але не права адміністратора. Права адміністратора потрібні для зміни змінних системного середовища. Я очікував, що якби я створив змінну середовища користувача з тим самим іменем, що і змінну системного середовища, користувацька змінна змінить системну змінну, але, здається, це не так.

Після додавання змінної користувача з тим самим іменем, що і системна змінна, я відкрив абсолютно нове вікно cmd і використав команду echo для відображення змінної. Він показав мені значення системної змінної замість значення змінної користувача.

Я просто хотів підтвердити цю очікувану поведінку і зрозуміти міркування, що стоять за нею. Я б очікував, що більш конкретна настройка користувача переможе системну.

У мене Windows 7.


При зміні змінних часто доводиться повністю перезавантажувати Windows. Зміна змінної в налаштуваннях не змінить запущені процеси. Нові процеси копіюють середовище із запущених процесів (залежно від способу їх запуску), тому просто запустити процес не означає, що ви отримаєте нове середовище.
Зоредаче

Я перезавантажився, і коли я запускаю "echo% path%" з вікна cmd.exe, він відображає мій системний змінний env, а не значення змінної користувача. Отже, я видалив змінну користувача, o доступ до адміністратора, змінив мінну змінну системного шляху і зробив те саме echo cmd. Оновлене значення env відображалось без перезавантаження. Це говорить мені, що USER vars не перекриває системну vars і що перезавантаження не потрібне. Neitehr - це те, чого я очікував.
Чад

Яка процедура використовується для додавання змінної користувача з тим самим іменем, що і системна змінна ? Щось на кшталт ?
JosefZ

JosefZ: так, я додав дві змінні середовища, одну USER другу SYSTEM, обидві з тим же ім'ям, використовуючи графічний інтерфейс Windows 7, подібний до екранів, показаних у вашому посиланні.
Чад

@Chad Чи не відповідь, яку ви прийняли нижче, точно протилежну вашому досвіду? Як ви пояснюєте розбіжність?
RockPaperLizard

Відповіді:


25

Відповідно до статті MSKB Змінні середовища в Windows NT :

Змінні середовища користувача .... мають перевагу перед змінними системного середовища.

Одне помітне виняток - PATHзмінна, що є комбінованим результатом змінних системи та користувача:

Шлях побудований із системного шляху, який можна переглянути у полі Змінні системного середовища в діалоговому вікні Система. Шлях користувача додається до системного шляху.

У статті також розглядаються ідентичні винятки для розширення змінних LibPathта Os2LibPathзмінних, а також способи autoexec.batповодження із зазначеними в . Ці моменти, ймовірно, знайдуть мало значення у типових умовах сьогодні.

Заслуговуємо на цю відповідь


2
Чи можливо зробити шлях користувача передздалегідь системним шляхом?
Qwerty

3

Все, що сказав у своїй відповіді Twisty Impersonator, є правильним. Ідея про додавання змінної шляху користувача була підкреслена, і я вважаю, що наслідки цієї різниці потребують додаткового лікування.

Шлях =% Шлях% (Система); % Шлях% (Користувач)

При виконанні програми, що виконується (або будь-який виконуваний скрипт, наприклад, .bat, .vbsі т.д.) , ви не повинні надавати повний шлях.

Наприклад, щоб запустити java, ви можете ввести будь-яке з них:

C:/Program Files (x86)/Java/jre6/bin/java -version

java.exe -version

java -version

Перший приклад використовує повністю кваліфікований шлях. Це завжди використовуватиме версію Java у цьому точному шляху.

Другий приклад пройде через кожен із каталогів %Path%змінної оточення, шукаючи виконуваний файл з назвою java.exe. Він запустить перший, який знайдеться, і припинить пошук. Якщо java.exeдесь на ім'я є два файли, то використовується %Path%лише перший знайдений файл .

Третій приклад, як і другий, буде переглядати каталоги, перелічені в %Path%. Крім того, оскільки розширення файлу не було передбачено, до списку файлів, що розширюються, додається до імені файлу у порядку, визначеному в %PATHEXT%змінній середовища. Якщо є кілька файлів з ім'ям java.com, java.exe, java.batі т.д. де - то на %Path%, використовується тільки перший зі знайдених.

Ви можете переглянути список розширень виконавчих шляхів у вашій системі, створивши такий пакетний файл:

@echo off
echo %PATHEXT%
pause

На моїй машині це:

.COM; .EXE; .BAT; .CMD; .VBS; .VBE; .JS; .JSE; .WSF; .WSH; .MSC; .PY

Що все це означає?

На відміну від іншої змінної середовища, шлях користувача не дозволяє перекрити системний шлях. Зовсім навпаки. З наведених вище прикладів є багато випадків, коли ви можете змінити типову версію Java. Однак, якщо в системному шляху вже вказана версія Java, то це ВСЕГДА буде знайдена перша, оскільки шлях шукається в порядку, зліва направо, а шлях користувача додається праворуч -бічна сторона, системний шлях зліва.

Що я можу з цим зробити?

Якщо у вас немає доступу до змінних системного середовища, ви не можете змінити програми за замовчуванням на системному шляху, використовуючи шлях користувача. (Насправді це має бути саме так, інакше деякі програми перестануть працювати належним чином, і це відкриє вашу систему для злому шкідливого програмного забезпечення. Ніхто цього не хоче.)

Натомість ви повинні використовувати повністю кваліфікований шлях, якщо вам потрібно використовувати конкретну версію.


1
Чи можливо зробити шлях користувача передздалегідь системним шляхом?
Qwerty

1
Це було б гарною темою для іншого питання. (Швидкий пошук на цьому веб-сайті не виявив нічого одразу актуального.) Будь ласка, задайте нове запитання та опублікуйте посилання на нього тут, у коментарях!
JonathanDavidArndt
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.