Переменная среды TEMP иногда устанавливается неправильно

Переменная среды TEMP иногда устанавливается неправильно

Иногда я обнаруживаю, что мои переменные среды TEMP и TMP установлены на C:\Windows\TEMP. Они должны быть установлены на %USERPROFILE%\AppData\Local\Temp, и настроены правильно вСвойства системы.

Это проявляется в виде сообщений об ошибках, подобных следующим:

---> 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

...которая происходит в различных приложениях .NET (в частности Visual Studio 2010 или SQL Server Management Studio). В качестве альтернативы SQL Server Management Studio выдаст сообщение:

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

Если я запускаю PowerShell с повышенными правами, то $env:TEMPон установлен правильно. Если я запускаю PowerShell без повышенных прав, то он не установлен. Я считаю, что он должен быть установлен правильно в обоих случаях. Если нет, то он установлен неправильно.

То же самое относится и к CMD.EXE.

Перезагрузка исправляет это временно, покачто-нибудьснова ломает его. Вероятно, что-то загруженное в Explorer.exe портит его переменные окружения, но что?

Значения в реестре верны, даже когда это происходит:

  • HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environmentимеет TEMP=%SYSTEMROOT%\Temp
  • HKCU\Environmentимеет TEMP=%USERPROFILE%\AppData\Local\Temp

Установив точку останова shell32!RegenerateUserEnvironmentс помощью WinDbg, я могу перехватить ее, когда она происходит, но я все еще не знаю, почему explorer.exeсчитываются неправильные переменные среды.

Я могу воспроизводить это последовательно, передавая WM_SETTINGCHANGEсообщение (я написал однострочную программу на C++, чтобы сделать это). Наблюдение за активностью в Process Monitor показывает, что explorer.exe даже не смотрит на HKCU\Environment.

Что происходит?

решение1

Я столкнулся с этимточныйТа же проблема была несколько недель назад, и она сводит меня с ума. Я думаю, что причиной является слишком длинная переменная пути. Я нашел несколько других сообщений об «исчезающих» переменных окружения в Интернете и некоторые предположения, что это связано с длинным путем.

Я посмотрел на свой, и оказалось, что некоторые глючные установщики дублировали все записи (некоторые более одного раза). Должно быть, где-то в explorer.exe зарыта ошибка переполнения буфера. В любом случае, когда я удалил дубликаты и нажал OK, моя переменная TEMP внезапно снова появилась (с правильным значением) во всех приложениях, которые я запускал из проводника.

решение2

Ваш профиль пользователя может быть поврежден. Попробуйте переименовать свой профиль в C:\UsersWindows 7 и C:\Documents and SettingsWindows XP, затем перезапустите и войдите в систему с теми же учетными данными, чтобы сгенерировать новый профиль. Если это сработает, вы можете выбрать файлы из старого профиля и скопировать их в новый профиль.

Странно, вы сказали, что отправка WM_SETTINGCHANGEсообщения не сработала; см.эта страница поддержки Windowsдля примера C#/VB, который должен работать. Также посмотрите, можно ли просто открыть и нажать OK в диалоговом окне «Переменные среды», щелкнув правой кнопкой мыши значок «Мой компьютер» на рабочем столе, выбрать «Свойства» в меню параметров, затем вкладку «Дополнительно» и нажать кнопку «Переменные среды». Это загрузит переменные HKCU\Environmentдля меня и нескольких других авторов.

HKCU\Volatile EnvironmentПроверьте , генерируются ли ваши переменные при входе в систему. Они должны включать HOMEPATH, HOMEDRIVE, USERNAMEи т. д. Этот ключ полностью отсутствует?

Если ничего не помогает, для меня обходным путем было использование SETXпакетного файла, помещенного в папку «Все пользователи Программы» в меню «Пуск». Для Windows XP загрузите SETXкак частьСредства поддержки Windows XP Service Pack 2.

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

Это запустит HKCU\Environmentчтение ваших переменных при запуске. Затем объедините ключи ниже с вашим реестром. Они будут статичны для всех пользователей, пока вы не исправите свой профиль, хотя можно было бы придумать более сложный пакетный файл, если бы они были к этому склонны. Заменитьимя пользователя,сервер входа в системуидомен.Этот пример относится к Windows XP.Сохраните его как файл .reg, щелкните правой кнопкой мыши и выберите merge. Вы также можете добавить их с помощью SETX. Вы также можете использовать REG ADDили REGEDITс последующим, WM_SETTINGCHANGEтак как эти команды не обновляют вашу текущую среду. СмотритеСС64для использования команд SETX, REGи 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"=""

Связанный контент