2

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

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

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

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

  • 路径 - C:\Users\[错误用户]\AppData\Local\Microsoft\WindowsApps;
  • TEMP - C:\Users\[错误用户]\AppData\Local\Temp
  • TMP - C:\Users\[错误用户]\AppData\Local\Temp

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

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

1 回答 1

1

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

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

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

于 2017-01-23T01:20:12.910 回答