6 votes

La variable d'environnement TEMP est parfois mal définie

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 tiene TEMP = %SYSTEMROOT%\Temp
  • HKCU\Environment tiene TEMP = %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 ?

1voto

Peter Ruderman Points 111

J'ai rencontré ceci exact même problème il y a quelques semaines et ça me rend dingue. Je pense que la cause en est une variable de chemin d'accès excessivement longue. J'ai trouvé plusieurs autres rapports sur la "disparition" de variables d'environnement sur le Web et certains ont suggéré que cela était lié à un long chemin.

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

0voto

jimyi Points 13032

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

Bizarre que vous ayez dit qu'envoyer un WM_SETTINGCHANGE n'a pas fonctionné ; voir cette page d'assistance Windows pour un exemple en C#/VB qui devrait fonctionner. Essayez également d'ouvrir et de 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 l'onglet Avancé et le bouton Variables d'environnement. Cela permet de charger les HKCU\Environment des variables pour moi et plusieurs autres posters.

Vérifiez si votre HKCU\Volatile Environment Les variables sont générées lorsque vous vous connectez. Celles-ci doivent inclure HOMEPATH , HOMEDRIVE , USERNAME etc. Cette clé est-elle complètement absente ?

Si rien ne fonctionne, une solution de contournement pour moi a été d'utiliser SETX dans un fichier batch placé dans le dossier All Users Programs Startup du menu Démarrer. Pour Windows XP, téléchargez SETX dans le cadre de Outils d'assistance pour Windows XP Service Pack 2 .

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

Cela déclenchera votre HKCU\Environment variables à lire au démarrage. Ensuite, fusionnez les clés ci-dessous avec votre registre. Elles seront statiques pour tous les utilisateurs jusqu'à ce que vous répariez votre profil, bien que l'on puisse concocter un fichier batch plus sophistiqué si l'on en a envie. Remplacer nom d'utilisateur , serveur de connexion y 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 o REGEDIT suivi par WM_SETTINGCHANGE puisque ces commandes ne mettent pas à jour votre environnement actuel. Voir SS64 pour l'utilisation des commandes de SETX , REG y 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"=""

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X