Variável de ambiente TEMP ocasionalmente definida incorretamente

Variável de ambiente TEMP ocasionalmente definida incorretamente

Ocasionalmente, encontro minhas variáveis ​​de ambiente TEMP e TMP definidas como C:\Windows\TEMP. Eles devem ser definidos como %USERPROFILE%\AppData\Local\Tempe estão configurados corretamente emPropriedades do sistema.

Isso se manifesta como mensagens de erro como as seguintes:

---> System.InvalidOperationException: Unable to generate a temporary class
     (result=1).
error CS2001: Source file 'C:\Windows\TEMP\gb_pz65v.0.cs' could not be found
error CS2008: No inputs specified

...que ocorre em vários aplicativos .NET (em particular Visual Studio 2010 ou SQL Server Management Studio). Como alternativa, o SQL Server Management Studio reportará:

Value cannot be null.
Parameter name: viewInfo (Microsoft.SqlServer.Management.SqlStudio.Explorer)

Se eu executar o PowerShell elevado, ele $env:TEMPestará configurado corretamente. Se eu executar o PowerShell não elevado, não será. Acredito que deve ser configurado corretamente em ambos os casos. Se não, é o contrário.

O mesmo se aplica ao CMD.EXE.

A reinicialização corrige isso, temporariamente, atéalgoquebra novamente. Presumivelmente, algo carregado no Explorer.exe está mexendo com suas variáveis ​​de ambiente, mas o quê?

Os valores no registro estão corretos, mesmo enquanto isso acontece:

  • HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environmenttem TEMP=%SYSTEMROOT%\Temp
  • HKCU\Environmenttem TEMP=%USERPROFILE%\AppData\Local\Temp

Ao definir um ponto de interrupção shell32!RegenerateUserEnvironmentcom o WinDbg, consigo capturá-lo quando isso acontece, mas ainda não sei por que explorer.exeestá lendo as variáveis ​​de ambiente erradas.

Posso reproduzi-lo de forma consistente transmitindo uma WM_SETTINGCHANGEmensagem (escrevi um programa C++ de uma linha para fazer isso). Observar a atividade no Process Monitor mostra que o explorer.exe nem sequer olha para o arquivo HKCU\Environment.

O que está acontecendo?

Responder1

Eu encontrei issoexatomesmo problema há algumas semanas e isso está me deixando maluco. Acho que o que está causando isso é uma variável de caminho excessivamente longa. Encontrei vários outros relatórios de variáveis ​​de ambiente "desaparecidas" na web e algumas sugestões de que isso estava relacionado a um longo caminho.

Dei uma olhada no meu e descobri que alguns instaladores com bugs duplicaram todas as entradas (alguns mais de uma vez). Deve haver um bug de saturação de buffer enterrado em explorer.exe em algum lugar. De qualquer forma, quando removi as duplicatas e cliquei em OK, minha variável TEMP reapareceu repentinamente (com o valor correto) em todos os aplicativos que iniciei no Explorer.

Responder2

Seu perfil de usuário pode estar corrompido. Tente renomear seu perfil no C:\UsersWindows 7 e C:\Documents and Settingsno Windows XP e, em seguida, reinicie e faça login com as mesmas credenciais para que um novo perfil seja gerado. Se funcionar, você pode escolher os arquivos do seu perfil antigo e copiá-los para o seu novo perfil.

Estranho você ter dito que enviar WM_SETTINGCHANGEmensagem não funcionou; veresta página de suporte do Windowspara um exemplo de C#/VB que deve funcionar. Além disso, veja se basta abrir e clicar em OK na caixa de diálogo Variáveis ​​​​de ambiente clicando com o botão direito no ícone Meu computador na área de trabalho, selecionando Propriedades no menu de opções, depois na guia Avançado e clicando no botão Variáveis ​​​​de ambiente. Isso carrega as HKCU\Environmentvariáveis ​​para mim e vários outros postadores.

Verifique se suas HKCU\Volatile Environmentvariáveis ​​estão sendo geradas quando você faz logon. Estes devem incluir HOMEPATH, HOMEDRIVE, USERNAMEetc. Essa chave está completamente faltando?

Se nada funcionar, uma solução alternativa para mim foi usar SETXum arquivo em lote colocado na pasta Inicialização de Todos os Programas de Usuários no Menu Iniciar. Para Windows XP, baixe SETXcomo parte deFerramentas de suporte do Windows XP Service Pack 2.

SET HOME=
SET HOME=%USERPROFILE%
SETX HOME "%HOME%"

Isso fará com que suas HKCU\Environmentvariáveis ​​sejam lidas na inicialização. Em seguida, mescle as chaves abaixo com o seu registro. Eles serão estáticos para todos os usuários até que você corrija seu perfil, embora seja possível criar um arquivo em lote mais sofisticado, se assim desejarem. Substituirnome de usuário,servidor de logonedomínio.Este exemplo é para Windows XP.Salve-o como um arquivo .reg, clique com o botão direito e selecione mesclar. Você também pode adicioná-los usando SETX. Você também pode usar REG ADDou REGEDITseguido, WM_SETTINGCHANGEpois esses comandos não atualizam seu ambiente atual. VerSS64para uso de comando de SETX, REGe REGEDIT.

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Volatile Environment]
"APPDATA"="C:\\Documents and Settings\\<username>\\Application Data"
"HOMEPATH"="\\Documents and Settings\\<username>"
"HOMEDRIVE"="C:"
"LOGONSERVER"="\\\\<logon-server>"
"USERDOMAIN"="<domain>"
"USERNAME"="<username>"
"USERPROFILE"="C:\\Documents and Settings\\<username>"
"USERDNSDOMAIN"="<domain.com>"
"LOCALAPPDATA"="C:\\Documents and Settings\\<username>\\Local Settings\\Application Data"

[HKEY_CURRENT_USER\Volatile Environment\2]
"CLIENTNAME"="Console"
"SESSIONNAME"=""

informação relacionada