Microsoft имеет статья базы знаний, последний раз рассмотрено в июне 2007 г. и гласит:
Если вы обновляете переменные среды или добавляете новые переменные среды, необходимо перезагрузить компьютер, прежде чем внесенные вами изменения повлияют на службы, запускаемые под учетной записью локальной системы.
Мне неясно, верно ли это для Windows Server 2008 R2. Кто-нибудь может посоветовать?
Я заметил, что есть исправление для Windows 2003 это решает эту проблему. Следовательно, мне интересно, добавлено ли это исправление в 2008 R2. Я не могу найти никаких доказательств того, что проблема с Windows 2008 R2 все еще существует, но отсутствие доказательств менее утешительно, чем конкретное утверждение об обратном.
А связанный вопрос охватывает аналогичную тему, но не обсуждает Windows 2008.
Перезапуск службы приведет к изменению системных переменных среды.
Чтобы проверить: используйте SysInternals Обозреватель процессов для проверки среды процесса службы до и после изменения / добавления переменной среды System и перезапуска службы. Примечание. Используйте команду «Запуск от имени администратора» в файле procxp.exe, чтобы просмотреть все свойства системных процессов.
Конечно. Любой процесс видит переменные среды ТАК КАК ОНИ НАЧИНАЮТ ПРОЦЕСС. Фактически он получает копию.
Так что если вам нужно, чтобы их подхватили сервисы - перезапустите сервисы. Если вам нужно, чтобы их подхватили окна, перезапустите окна.
Тем более, что учетная запись локальной системы хранит эту копию;) Так что - нет. Это все еще актуально. В целом я бы сказал, что изменение этого пункта - это пункт с «почти нулевым приоритетом», поскольку такого рода изменения довольно редки.
Ответ @Brian не охватывает все варианты использования. В моем случае я обновил Java на машине Windows 7 x64 с версии 7 до 8. После этого служба, которая зависит от Java, не запустилась («net start SymmetricDS»), потому что система не смогла найти исполняемый файл Java.
Т.е. services.exe (родительский процесс всех служб LocalSystem) сам не принимает изменения переменных среды. Он просто делает это для новых порожденных дочерних процессов. Я подтвердил это, просмотрев его с помощью SysInternals Process Explorer. Доказательство: http://workblog.pilin.name/2013/03/service-environment-variables.html. Здесь не сказано, к каким версиям Windows это применимо, но дата публикации довольно новая, поэтому я думаю, что это применимо к Windows 7 и Windows Server 2008.
Решил проблему, создав символические ссылки на исполняемые файлы Java в одной из папок старого PATH, содержащегося в services.exe.
Возможно с помощью неприятного взлома во время работы. В противном случае только перезапуском.
Просто проверил, что переменные среды можно изменить с помощью Cygwin GDB. Пробовал с x86 Cygwin и x86 Winword. Проверено с помощью ProcExp.exe.
Команды GDB можно найти здесь: https://stackoverflow.com/questions/205064/is-there-a-way-to-change-another-processs-environment-variables
Microsoft говорит, что это не обычный способ сделать это: http://msdn.microsoft.com/en-us/library/windows/desktop/ms682009(v=vs.85).aspx
Изменение переменных среды дочернего процесса во время создания процесса - единственный способ, которым один процесс может напрямую изменить переменные среды другого процесса. Процесс никогда не может напрямую изменять переменные среды другого процесса, который не является его потомком.
Мое предыдущее редактирование:
Мое лучшее предположение: необходимо перезапустить службу. По крайней мере.
При создании процесс наследует переменные окружения от своего родителя. (http://msdn.microsoft.com/en-us/library/windows/desktop/ms682653(v=vs.85).aspx)
Итак: процесс должен быть перезапущен, И должно быть что-то для наследования.
Как проверить
Убедитесь сами, используя ProcExp.exe. (http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx ) Дважды щелкните интересующий процесс и выберите вкладку «Среда».
Чтобы найти родителя, дважды щелкните дочерний элемент, выберите вкладку «Изображение» и прочтите строку «Родитель:».
Повторите до конца линии наследия.