8

我希望我的MVC3 Web应用程序来访问%APPDATA%(例如C:\Users\MyUsername\AppData\Roaming在Windows 7),因为我存储配置文件存在。因此,我创建了一个应用程序池在IIS中对用户“MyUserName输入”的身份,创建用户的配置文件用的帐户登录,并打开选项“加载用户配置文件”(默认情况下是真的反正)。模拟关闭。IIS 7.5应用程序池使用错误的%APPDATA%自定义用户身份

现在我有问题,即%APPDATA%(在C#):

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

解析为c:\windows\system32\inetsrv,而不是C:\Users\MyUsername\AppData\Roaming

UPDATE:更精确地说,上面的C#代码返回一个空字符串,从而使Path.GetFullPath(Path.Combine(appdataDir, "MyAppName"))把当前路径到我的应用程序的名称,导致c:\windows\system32\inetsrv\MyAppName

我知道我在Windows Server 2008 R2的同一Web应用程序之前进行这项工作,现在我在我的Windows 7获得此问题与IIS的同一主要版本7.5
我用相同的程序之前:创建一个新用户,登录的用户创建配置文件和目录APPDATA,然后添加应用程序池用这个身份,并最终加入的web应用到这个池中。

任何想法?

+0

采取的是您的应用程序池配置为经典或集成模式? – Kev 2012-02-29 01:56:27

+0

@Kev:集成模式。 – AndiDog 2012-02-29 05:48:28

+0

我有同样的问题。特别奇怪的是Environment.SpecialFolder.UserProfile的路径工作正常,如果我从那里建立到AppData文件夹的路径,它的工作原理。 – Jason 2012-04-20 20:58:29

回答

0

我遇到了同样的问题。您是否偶然安装了Visual Studio 11测试版?我最近做了,而且我注意到了4.0版兼容.dll文件与我们的代码的区别。我仍然试图找出这个问题,但在此之前我没有遇到过这个问题。

编辑:

比较来自4.0和4.5 GetFolderPath(以及相关的)反编译源之后,也有不同之处。无论他们是问题的根源......我还不确定。

编辑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(); 
} 
+1

不,我安装了Visual Studio 2010,没有其他beta版。有哪些差异? – AndiDog 2012-04-23 12:51:05

+0

我也得到0x80070005(E_ACCESSDENIED)。将尝试调查更多。 – AndiDog 2012-05-08 14:50:06

0
+0

我有用户配置文件加载并得到相同的问题(我认为这个问题只发生在Windows 7上)。 – AndiDog 2012-07-19 14:36:55

+0

根据您在原始问题中描述的内容,您确实创建了配置文件文件夹,但未采取必要步骤来加载IIS配置文件。如果您确实采取了这一步骤,请将其添加到您的描述中。如果您没有阅读我给出的链接并按照说明操作。 – grahamesd 2012-07-23 17:16:30

+0

我在我的问题中说我打开了这个选项,所以这个解决方案似乎不适合我,对不起。必须与Windows 7有关。当我有时间时,我会尝试在Windows 8(不是服务器变体)上看看会发生什么。 – AndiDog 2012-07-23 20:02:22

14

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

+0

值为''。 – AndiDog 2012-12-10 21:19:46

+0

将它设置为'' – 2012-12-12 02:07:32

+2

这个答案是为我解决问题的那个。 – 2014-06-18 09:03:15

0

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

希望这有助于

相关问题