我遇到了一个问题,该问题最初是通过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
,但它被设置为false
onsystem.applicationHost/applicationPools/applicationPoolDefaults
。由于没有一个应用程序池覆盖它,因此它们都接收相同的值,因此共享公共环境变量。
我不知道它是如何设置为false
的,也不知道共享USERPROFILE
环境变量是如何设置为一个应用程序池而不是另一个应用程序池的,但将默认值设置回true
解决了这个问题。
正是这个问题/答案帮助我找到了原因,尽管问题不同。