A Microsoft tem um artigo da base de conhecimento , revisado pela última vez em junho de 2007, que afirma:
Se você atualizar variáveis de ambiente ou adicionar novas variáveis de ambiente, deverá reiniciar o computador antes que as alterações feitas afetem os serviços executados na conta Sistema Local.
Não está claro para mim se isso vale para o Windows Server 2008 R2. Alguém pode aconselhar?
Percebi que há um hotfix para o Windows 2003 que resolve esse problema. Consequentemente, eu me pergunto se o 2008 R2 rolou nessa correção. Não consigo encontrar nenhuma evidência para sugerir que ainda há um problema com o Windows 2008 R2, mas a falta de evidência é menos reconfortante do que uma declaração concreta do contrário.
Uma questão relacionada cobre um terreno semelhante, mas não discute o Windows 2008.
Reiniciar um serviço coletará as alterações nas variáveis de ambiente do sistema.
Para verificar: Use o SysInternals Process Explorer para inspecionar o ambiente de um processo de serviço antes e depois de alterar/adicionar uma variável de ambiente do sistema e reiniciar o serviço. Observação: use "Executar como administrador" no procexp.exe para ver todas as propriedades dos processos do sistema.
Claro. Qualquer processo vê as variáveis de ambiente COMO ESTÃO QUANDO O PROCESSO COMEÇA. Basicamente, obtém uma cópia.
Portanto, se você precisar que eles sejam apanhados pelos serviços - reinicie os serviços. Se você precisar que eles sejam apanhados pelo Windows, reinicie o Windows.
Especialmente porque a conta do sistema local está mantendo esta cópia ;) Então - não. Isso ainda é verdade. Eu geralmente diria que mudar isso é um item de "prioridade quase zero", pois esse tipo de mudança é bastante raro.
A resposta @Brian não cobre todos os casos de uso. No meu caso, atualizei o Java na máquina Windows 7 x64 da versão 7 para 8. Depois disso, o serviço que depende do Java falhou ao iniciar ("net start SymmetricDS") porque o sistema não conseguiu encontrar o executável Java.
Ou seja, services.exe (processo pai de todos os serviços LocalSystem) não capta as alterações das variáveis de ambiente. Ele apenas faz isso para novos processos filho gerados. Eu confirmei olhando para ele com o SysInternals Process Explorer. Prova: http://workblog.pilin.name/2013/03/service-environment-variables.html . Não diz a quais versões do Windows se aplica, mas a data de publicação é bastante nova, então acho que se aplica ao Windows 7 e Windows Server 2008.
Resolvido o problema criando links simbólicos para executáveis Java em uma das pastas no antigo PATH contido em services.exe.
Possível via hack desagradável durante a execução. Caso contrário, apenas por reinicialização.
Apenas verifiquei que as variáveis de ambiente podem ser alteradas com o Cygwin GDB. Tentei com x86 Cygwin e x86 Winword. Verificado com ProcExp.exe.
Comandos GDB encontrados aqui: https://stackoverflow.com/questions/205064/is-there-a-way-to-change-another-processs-environment-variables
A Microsoft diz que esta não é a maneira normal de fazer isso: http://msdn.microsoft.com/en-us/library/windows/desktop/ms682009(v=vs.85).aspx
Minha edição anterior:
Meu melhor palpite: o serviço precisa ser reiniciado. Pelo menos.
Após a criação, um processo herdará as variáveis de ambiente de seu pai. ( http://msdn.microsoft.com/en-us/library/windows/desktop/ms682653(v=vs.85).aspx )
Então: O processo deve ser reiniciado E deve haver algo para herdar.
Como verificar
Verifique você mesmo usando ProcExp.exe. ( http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx ) Clique duas vezes no processo de seu interesse e selecione a guia "Ambiente".
Para localizar o pai, clique duas vezes no filho, selecione a guia "Imagem" e leia a linha "Pai:".
Repita todo o caminho até a linha de herança.