IIS ApplicationPool 用户的 USERPROFILE / TEMP 值不正确

IIS ApplicationPool user has incorrect USERPROFILE / TEMP value

我 运行 遇到了最初由 Microsoft.CSharp.CSharpCodeGenerator 抛出一个 UnauthorizedAccessException: Access to c:\Users\[wrong-user]\AppData\Local\Temp 试图写入 收到 "access denied" 错误所暴露的问题]different IIS AppPool 用户的临时目录。

我有另一个应用程序实际上 运行 作为 [wrong-user] AppPool,并且该应用程序 确实 工作。然而,这是有道理的,因为它对自己的用户目录具有写访问权限。

我已将错误缩小到 %USERPROFILE% 正在返回不同 IIS APPPOOL 用户的路径这一事实,即使 Environment.GetFolderPath(SpecialFolder.UserProfile) returns 正确 路径。

如果我枚举 Environment.GetEnvironmentVariables(User),我得到:

此外,通过 HKEY_USERS/[SID]/Environment 手动访问用户的环境变量确认这只是 %USERPROFILE% 不正确:

问题最终是 setProfileEnvironment,它为每个应用程序池的工作进程隔离了环境变量,在 system.applicationHost/applicationPools/applicationPoolDefaults 上被设置为 false 尽管 having a default value of true according to the documentation .由于 none 个应用程序池覆盖了它,它们都收到相同的值,因此共享公共环境变量。

我不知道它是如何设置为 false,也不知道共享的 USERPROFILE 环境变量是如何设置为一个应用程序池而不是另一个,而是将默认值设置回 true 解决了问题。

正是这个 question/answer 帮助我找到了原因,尽管问题有所不同。