IIS 7.5应用程序池使用错误的%APPDATA%作为自定义用户身份

And*_*Dog 11 iis application-pool appdata iis-7.5 applicationpoolidentity

我希望我的MVC3 Web应用程序访问%APPDATA%(例如C:\Users\MyUsername\AppData\Roaming在Windows 7上),因为我在那里存储配置文件.因此,我在IIS中创建了一个具有用户"MyUsername"标识的应用程序池,通过使用该帐户登录创建了该用户的配置文件,并打开了"加载用户配置文件"选项(默认情况下仍为true).模拟被关闭.

现在我遇到%APPDATA%(在C#中)的问题:

appdataDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
Run Code Online (Sandbox Code Playgroud)

解决c:\windows\system32\inetsrv而不是C:\Users\MyUsername\AppData\Roaming.

更新:更确切地说,上面的C#代码返回一个空字符串,以便Path.GetFullPath(Path.Combine(appdataDir, "MyAppName"))将当前路径预先设置为我的应用程序名称,从而产生c:\windows\system32\inetsrv\MyAppName.

我知道我之前使用Windows Server 2008 R2上的相同Web应用程序完成了这项工作,现在我在Windows 7上
使用与IIS相同的主要版本7.5来解决此问题.我使用了与以前相同的过程:创建了一个新用户,以该用户身份登录以创建配置文件和APPDATA目录,然后添加具有此标识的应用程序池,最后将Web应用程序添加到此池中.

有任何想法吗?

Ami*_*ple 17

打开你的%WINDIR%\System32\inetsrv\config\applicationHost.config,寻找<applicationPoolDefaults>.在<processModel>,确保你没有setProfileEnvironment="false".如果这样做,请将其设置为true.

  • 这个答案是为我解决问题的答案. (2认同)
  • 为什么 LoadUserProfile 是 IIS 管理器中的一个选项,而 SetProfileEnvironment 不是? (2认同)

小智 5

应用程序池 - 您的应用程序池 - 高级设置...

流程模型 - 加载用户配置文件设置为 True。

它帮助到我。

摘自 https://blogs.msdn.microsoft.com/vijaysk/2009/03/08/iis-7-tip-3-you-can-now-load-the-user-profile-of-the-application-池标识/


Bri*_*ugh 0

我遇到了同样的问题。您是否偶然安装了 Visual Studio 11 beta?我最近这样做了,我注意到 4.0 兼容 .dll 在如何与我们的代码配合使用方面存在一些差异。我仍在尝试确定问题所在,但在此之前我没有遇到过这个问题。

编辑:

比较 GetFolderPath(及相关)4.0 和 4.5 的反编译源后,发现存在差异。它们是否是问题的根源......我还不确定。

编辑2:以下是相关更改。我正在努力尝试两者,看看是否会得到不同的结果。[代码已删除]

编辑3:

我现在尝试直接调用 SHGetFolderPath,无论如何,这就是 .NET Framework 最终所做的事情。它返回 E_ACCESSDENIED (-2147024891 / 0x80070005)。我不知道在某些特定情况下我得到的结果发生了什么变化,但在其他情况下却没有。

编辑4:

由于您得到的是空字符串,因此您可能需要将代码切换为使用 SHGetFolderPath,以便可以获得 HResult 并至少知道到底发生了什么。

void Main() {
    Console.WriteLine( GetFolderPath( Environment.SpecialFolder.ApplicationData ) );
}

[System.Runtime.InteropServices.DllImport("shell32.dll")]
static extern int SHGetFolderPath(IntPtr hwndOwner, int nFolder, IntPtr hToken, uint dwFlags, StringBuilder pszPath);

private string GetFolderPath( Environment.SpecialFolder folder ) {
    var path = new StringBuilder( 260 );
    var hresult = SHGetFolderPath( IntPtr.Zero, (int) folder, IntPtr.Zero, 0, path );
    Console.WriteLine( hresult.ToString( "X" ) );

    return ( (object) path ).ToString( );
}
Run Code Online (Sandbox Code Playgroud)