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

时间:2012-02-28 21:35:14

标签: iis iis-7.5 application-pool appdata applicationpoolidentity

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

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

appdataDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

解析为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上使用相同的主要7.5版本的IIS来解决这个问题。
我使用了与以前相同的过程:创建一个新用户,以该用户身份登录以创建配置文件和APPDATA目录,然后使用此标识添加应用程序池,最后将Web应用程序添加到此池中。

有什么想法吗?

5 个答案:

答案 0 :(得分:16)

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

答案 1 :(得分:3)

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

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

它帮助了我。

取自 https://blogs.msdn.microsoft.com/vijaysk/2009/03/08/iis-7-tip-3-you-can-now-load-the-user-profile-of-the-application-pool-identity/

答案 2 :(得分:2)

我最近遇到了同样的问题。如Amit所述,问题是未加载用户配置文件。该设置适用于所有应用程序池,位于applicationHost.config中(通常为C:\ Windows \ System32 \ inetsrv \ config \ applicationHost.config)。如果您按如下所示更新applicationPoolDefaults元素,它将起作用;

<applicationPoolDefaults managedRuntimeVersion="v4.0">
  <processModel identityType="ApplicationPoolIdentity" loadUserProfile="true" setProfileEnvironment="true" />
</applicationPoolDefaults>

我们已经尝试使用IIS 7.5,并毫无问题地将其用于生产。

如果需要,您可以自动执行此操作;

appcmd set config -section:system.applicationHost/applicationPools /applicationPoolDefaults.processModel.setProfileEnvironment:"true" /commit:apphost

或者您更喜欢powershell

Set-WebConfigurationProperty "/system.applicationHost/applicationPools/applicationPoolDefaults/processModel" -PSPath IIS:\ -Name "setProfileEnvironment" -Value "true"

希望这有帮助

答案 3 :(得分: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( );
}

答案 4 :(得分:0)