De temps en temps, je trouve mes variables d'environnement TEMP et TMP réglées sur C:\Windows\TEMP
. Ils doivent être réglés sur %USERPROFILE%\AppData\Local\Temp
et sont configurés correctement dans Propriétés du système .
Cela se manifeste par des messages d'erreur tels que les suivants :
---> 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
...qui se produit dans diverses applications .NET (en particulier Visual Studio 2010 ou SQL Server Management Studio). Alternativement, SQL Server Management Studio signalera :
Value cannot be null.
Parameter name: viewInfo (Microsoft.SqlServer.Management.SqlStudio.Explorer)
Si je lance PowerShell en position élevée, alors $env:TEMP
est correctement réglé. Si j'exécute PowerShell sans élévation, il ne l'est pas. Je pense qu'il devrait être défini correctement dans les deux cas. Si ce n'est pas le cas, c'est qu'il s'agit d'une erreur.
Il en va de même pour CMD.EXE.
Le redémarrage résout le problème, temporairement, jusqu'à ce que quelque chose le casse encore. On peut supposer que quelque chose chargé dans Explorer.exe modifie ses variables d'environnement, mais quoi ?
Les valeurs du registre sont correctes, même lorsque cela se produit :
-
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
tieneTEMP
=%SYSTEMROOT%\Temp
-
HKCU\Environment
tieneTEMP
=%USERPROFILE%\AppData\Local\Temp
En fixant un point d'arrêt sur shell32!RegenerateUserEnvironment
avec WinDbg, je suis capable de le piéger quand il se produit, mais je ne sais toujours pas pourquoi explorer.exe
lit les mauvaises variables d'environnement.
Je peux le reproduire de manière cohérente en diffusant une WM_SETTINGCHANGE
(j'ai écrit un programme C++ d'une ligne pour faire cela). L'observation de l'activité dans Process Monitor montre que explorer.exe ne regarde même pas HKCU\Environment
.
Que se passe-t-il ?