variável de ambiente TEMP ocasionalmente configurada incorretamente

6

Ocasionalmente, encontro minhas variáveis de ambiente TEMP e TMP definidas como C:\Windows\TEMP . Eles devem ser definidos como %USERPROFILE%\AppData\Local\Temp e configurados corretamente em Propriedades 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 (especialmente no Visual Studio 2010 ou no 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, $env:TEMP está definido corretamente. Se eu executar o PowerShell não elevado, não é. Acredito que deva ser configurado corretamente em ambos os casos. Se não, é o caminho errado.

O mesmo é verdadeiro para o CMD.EXE.

A reinicialização corrige temporariamente, até que algo a separe novamente. Presumivelmente algo carregado no Explorer.exe está mexendo com suas variáveis de ambiente, mas o que?

Os valores no registro estão corretos, mesmo quando isso está acontecendo:

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

Ao definir um ponto de interrupção em shell32!RegenerateUserEnvironment com o WinDbg, posso prendê-lo quando isso acontece, mas ainda não sei por que explorer.exe está lendo as variáveis de ambiente erradas.

Eu posso reproduzi-lo consistentemente transmitindo uma mensagem WM_SETTINGCHANGE (escrevi um programa C ++ de uma linha para fazer isso). Assistir a atividade no Process Monitor mostra que o explorer.exe nem sequer olha para HKCU\Environment .

O que está acontecendo?

    
por Roger Lipscombe 19.04.2012 / 16:45

2 respostas

1

Eu encontrei este exato mesmo problema algumas semanas atrás e isso tem me deixado maluco. Eu acho que o que está causando isso é uma variável de caminho excessivamente longa. Eu encontrei vários outros relatórios de "desaparecimento" de variáveis de ambiente ao redor da web e alguma sugestão de que isso estava relacionado a um longo caminho.

Eu dei uma olhada no meu, e alguns instaladores com bugs duplicaram todas as entradas (algumas mais de uma vez). Deve haver um bug de sobrecarga do buffer enterrado no explorer.exe em algum lugar. De qualquer forma, quando eu 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.

    
por 10.02.2017 / 23:25
0

Seu perfil de usuário pode estar corrompido. Tente renomear seu perfil em C:\Users no Windows 7 e C:\Documents and Settings no Windows XP, em seguida, reinicie e efetue login com as mesmas credenciais para que um novo perfil seja gerado. Se isso funcionar, você pode selecionar seus arquivos do seu perfil antigo e copiá-los para o novo perfil.

Estranho você disse que enviar uma mensagem WM_SETTINGCHANGE não funcionou; veja esta página de Suporte do Windows para um exemplo C # / VB que deve funcionar. Além disso, veja se apenas abrindo e clicando em OK na caixa de diálogo Environment Variables clicando com o botão direito do mouse no ícone My Computer na área de trabalho, selecionando Properties no menu de opções, depois na guia Advanced e clicando no botão Environment Variables. Isso carrega as variáveis HKCU\Environment para mim e vários outros pôsteres.

Verifique se suas variáveis HKCU\Volatile Environment estão sendo geradas quando você faz logon. Estes devem incluir HOMEPATH , HOMEDRIVE , USERNAME etc. Essa chave está completamente ausente?

Se nada funcionar, uma solução para mim foi usar SETX em um arquivo de lote colocado na pasta Inicialização de Todos os Usuários no Menu Iniciar. Para o Windows XP, faça o download de SETX como parte das Ferramentas de suporte do Windows XP Service Pack 2 .

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

Isso acionará as variáveis HKCU\Environment a serem 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 um possa inventar um arquivo de lote mais sofisticado se eles estivessem inclinados. Substitua nome de usuário , logon-server e domínio . Este exemplo é para o Windows XP. Salve-o como um arquivo .reg, clique com o botão direito e selecione mesclar. Você também pode adicionar esses usando SETX . Você também pode usar REG ADD ou REGEDIT seguido por WM_SETTINGCHANGE , pois esses comandos não atualizam seu ambiente atual. Consulte SS64 para uso de comando de SETX , REG e 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]
"CLIENTNAME"="Console"
"SESSIONNAME"=""
    
por 19.11.2012 / 20:21