IIS 应用程序池用户具有不正确的 USERPROFILE / TEMP 值



我遇到了一个问题,该问题最初是通过Microsoft.CSharp.CSharpCodeGenerator抛出UnauthorizedAccessException: Access to c:Users[wrong-user]AppDataLocalTemp而收到"访问被拒绝"错误而暴露的,试图写入不同的IIS AppPool用户的临时目录。

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

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

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

  • 路径 - C:\Users\[wrong-user]\AppData\Local\Microsoft\WindowsApps;
  • TEMP - C:\Users\[wrong-user]\AppData\Local\Temp
  • TMP - C:\Users\[wrong-user]\AppData\Local\Temp

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

  • 路径 - %USERPROFILE%\AppData\Local\Microsoft\WindowsApps;
  • TEMP - %USERPROFILE%\AppData\Local\Temp
  • TMP - %USERPROFILE%\AppData\Local\Temp

问题最终是,setProfileEnvironment隔离每个应用程序池的工作进程的环境变量,尽管根据文档,它的默认值为true,但它被设置为falseonsystem.applicationHost/applicationPools/applicationPoolDefaults。由于没有一个应用程序池覆盖它,因此它们都接收相同的值,因此共享公共环境变量。

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

正是这个问题/答案帮助我找到了原因,尽管问题不同。

最新更新