13

我希望我的 MVC3 Web 应用程序能够访问 %APPDATA%(例如C:\Users\MyUsername\AppData\Roaming在 Windows 7 上),因为我在那里存储了配置文件。因此,我在 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 应用程序添加到此池中。

有任何想法吗?

4

5 回答 5

21

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

于 2012-12-10T17:59:35.523 回答
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-池身份/

于 2017-12-11T14:11:23.870 回答
3

我最近遇到了同样的问题。正如 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"

希望这可以帮助

于 2017-04-12T12:28:31.153 回答
0

问题在于您的 IIS 设置。答案就在这里:Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 返回 String.Empty

于 2012-07-19T13:45:10.017 回答
0

我遇到了同样的问题。您是否偶然安装了 Visual Studio 11 测试版?我最近这样做了,我注意到 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( );
}
于 2012-04-23T12:40:56.070 回答