Иногда мои переменные окружения 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
.
Что здесь происходит?