La variable d'environnement TEMP est parfois réglée incorrectement

Parfois, je trouve mes variables d'environnement TEMP et TMP définies sur C:\Windows\TEMP . Ils doivent être définis sur %USERPROFILE%\AppData\Local\Temp , et sont configurés correctement dans System Properties .

Cela se manifeste par des messages d'erreur comme 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 (notamment Visual Studio 2010 ou SQL Server Management Studio). Alternativement, SQL Server Management Studio rapportera:

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

Si je lance PowerShell élevé, alors $env:TEMP est correctement configuré. Si je lance PowerShell non élevé, alors ce n'est pas le cas. Je crois que cela devrait être réglé correctement dans les deux cas. Sinon, c'est la mauvaise façon.

La même chose est vraie pour CMD.EXE.

Le redémarrage le corrige, temporairement, jusqu'à ce que quelque chose le casse à nouveau. On peut supposer que quelque chose est chargé dans Explorer.exe est en train de déranger avec ses variables d'environnement, mais quoi?

Les valeurs dans le registre sont correctes, même si cela se produit:

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

En définissant un point d'arrêt sur shell32!RegenerateUserEnvironment avec WinDbg, je peux le piéger quand il arrive, 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 un message WM_SETTINGCHANGE (j'ai écrit un programme C ++ en une ligne pour le faire). Regarder l'activité dans Process Monitor montre que explorer.exe ne regarde même pas HKCU\Environment .

Que se passe-t-il?

J'ai rencontré exactement le même problème il y a quelques semaines et cela m'a rendu difficile. Je pense que ce qui l'entraîne, c'est une variable de chemin excessivement longue. J'ai trouvé plusieurs autres rapports sur les variables d'environnement "en train de disparaître" dans le web et j'estime qu'il était lié à un long chemin.

J'ai regardé le mien, et il s'est avéré que certains installateurs de buggy avaient dupliqué toutes les entrées (plus d'une fois). Il doit y avoir un bug de dépassement de tampon enterré dans explorer.exe quelque part. Quoi qu'il en soit, lorsque j'ai supprimé les doublons et que j'ai appuyé sur OK, ma variable TEMP a soudainement réapparu (avec la valeur correcte) dans toutes les applications que j'ai lancées depuis l'explorateur.

Votre profil d'utilisateur peut être corrompu. Essayez de renommer votre profil dans C:\Users sur Windows 7 et C:\Documents and Settings sur Windows XP, puis redémarrez et connectez-vous avec les mêmes informations d'identification afin qu'un nouveau profil soit généré. Si cela fonctionne, vous pouvez choisir vos fichiers à partir de votre ancien profil et les copier dans votre nouveau profil.

C'est étrange que vous avez dit que l'envoi d'un message WM_SETTINGCHANGE ne fonctionnait pas; Consultez cette page de support de Windows pour un exemple C # / VB qui devrait fonctionner. Aussi, voir si simplement ouvrir et cliquer sur OK dans la boîte de dialogue Variables d'environnement en cliquant avec le bouton droit de la souris sur l'icône Poste de travail sur votre bureau, en sélectionnant Propriétés dans le menu des options, puis sur l'onglet Avancé et en cliquant sur le bouton Variables d'environnement. Cela charge les variables HKCU\Environment pour moi et plusieurs autres affiches.

Vérifiez si vos HKCU\Volatile Environment sont générées lorsque vous vous connectez. Ceux-ci devraient inclure HOMEPATH , HOMEDRIVE , USERNAME etc. Est-ce que cette clé est complètement manquante?

Si rien ne fonctionne, une solution de contournement pour moi a été d'utiliser SETX dans un fichier de commandes placé dans le dossier de démarrage Tous les programmes d'utilisateurs dans le menu Démarrer. Pour Windows XP, téléchargez SETX dans le cadre des outils de support Windows XP Service Pack 2 .

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

Cela déclenchera vos variables HKCU\Environment à lire au démarrage. Ensuite, fusionnez les clés ci-dessous avec votre base de registre. Ils seront statiques pour tous les utilisateurs jusqu'à ce que vous corrigez votre profil, bien que l'on puisse concocter un fichier batch plus sophistiqué s'ils étaient si enclins. Remplacez le nom d'utilisateur , le serveur d'ouverture de session et le domaine . Cet exemple est pour Windows XP. Enregistrez-le en tant que fichier .reg, faites un clic droit et sélectionnez fusionner. Vous pouvez également les ajouter en utilisant SETX . Vous pouvez également utiliser REG ADD ou REGEDIT suivi de WM_SETTINGCHANGE car ces commandes ne mettent pas à jour votre environnement actuel. Voir SS64 pour l'utilisation de la commande de SETX , REG et 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"=""