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

WinDbg でブレークポイントを設定することでshell32!RegenerateUserEnvironment、発生したときにそれをトラップできますが、なぜexplorer.exe間違った環境変数が読み取られるのかがまだわかりません。

メッセージをブロードキャストすることで、これを一貫して再現できますWM_SETTINGCHANGE(これを行うために 1 行の C++ プログラムを作成しました)。プロセス モニターでアクティビティを監視すると、explorer.exe が を参照すらしていないことがわかりますHKCU\Environment

何が起こっているのか?

答え1

私はこれに遭遇しましたちょうど数週間前にも同じ問題が発生し、気が狂いそうになっています。原因はパス変数が長すぎることだと思います。Web 上で環境変数が「消えた」という報告をいくつか見つけましたが、長いパスに関連しているという意見もありました。

自分のものを調べてみたところ、バグのあるインストーラーがすべてのエントリを重複させていたことが判明しました (一部は複数回)。explorer.exe のどこかにバッファ オーバーランのバグが潜んでいるに違いありません。とにかく、重複を削除して [OK] をクリックすると、エクスプローラーから起動したすべてのアプリで TEMP 変数が突然 (正しい値で) 再表示されました。

答え2

ユーザー プロファイルが破損している可能性があります。Windows C:\Users7 およびC:\Documents and SettingsWindows XP でプロファイルの名前を変更し、再起動して同じ資格情報でログインし、新しいプロファイルが生成されるようにしてみてください。それが機能する場合は、古いプロファイルからファイルを厳選して、新しいプロファイルにコピーできます。

WM_SETTINGCHANGEメッセージを送信しても機能しないというのは奇妙ですね。このWindowsサポートページ動作するはずの C#/VB の例です。また、デスクトップの [マイ コンピューター] アイコンを右クリックし、オプション メニューから [プロパティ] を選択してから [詳細設定] タブをクリックし、[環境変数] ボタンをクリックして、[環境変数] ダイアログ ボックスを開いて [OK] をクリックするだけでも、変数が読み込まれるかどうかを確認してください。これにより、HKCU\Environment私や他の投稿者数名に対して変数が読み込まれます。

HKCU\Volatile Environmentログオン時に変数が生成されているかどうかを確認します。これらにはHOMEPATH、、HOMEDRIVEなどが含まれますUSERNAME。そのキーが完全に欠落していますか?

SETX何も機能しない場合は、スタートメニューの「All Users Programs Startup」フォルダに置かれたバッチファイルを使用するという回避策があります。Windows XPの場合SETXは、Windows XP Service Pack 2 サポート ツール

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

これにより、起動時に変数が読み込まれるようになりますHKCU\Environment。次に、以下のキーをレジストリにマージします。プロファイルを修正するまで、すべてのユーザーに対して静的になりますが、必要に応じてより洗練されたバッチファイルを作成することもできます。ユーザー名ログオンサーバーそしてドメインこの例は Windows XP 用です。.reg ファイルとして保存し、右クリックしてマージを選択します。 を使用してこれらを追加することもできます。これらのコマンドは現在の環境を更新しないため、またはの後に をSETX使用することもできます。REG ADDREGEDITWM_SETTINGCHANGESS64SETXREGおよびのコマンド使用法については、 を参照してください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"=""

関連情報