Пул приложений IIS 7.5 использует неверный%APPDATA% для пользовательского пользователя в качестве удостоверения
Я хочу, чтобы мое веб-приложение MVC3 получало доступ к%APPDATA% (например, C:\Users\MyUsername\AppData\Roaming
на Windows 7) потому что я храню там файлы конфигурации. Поэтому я создал пул приложений в IIS с идентификатором пользователя "MyUsername", создал профиль этого пользователя, войдя в систему с учетной записью, и включил опцию "Загрузить профиль пользователя" (в любом случае было по умолчанию). Олицетворение отключено.
Теперь у меня есть проблема, что%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, и теперь я получаю эту проблему с той же основной версией 7.5 IIS на моем Windows 7.
Я использовал ту же процедуру, что и раньше: создал нового пользователя, вошел в систему под этим пользователем для создания профиля и каталогов APPDATA, затем добавил пул приложений с этим удостоверением и, наконец, добавил веб-приложение в этот пул.
Есть идеи?
5 ответов
Открыть свой %WINDIR%\System32\inetsrv\config\applicationHost.config
и искать <applicationPoolDefaults>
, Под <processModel>
, убедитесь, что у вас нет setProfileEnvironment="false"
, Если вы это сделаете, установите его в true.
Пулы приложений - Ваш пул приложений - Расширенные настройки...
Модель процесса - загрузка профиля пользователя с установленным значением True.
Помогает мне.
Я недавно столкнулся с той же проблемой. Как упомянул Амит, проблема в том, что профиль пользователя не загружен. Этот параметр предназначен для всех пулов приложений и находится в 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"
Надеюсь это поможет
Проблема в настройках IIS. Ответ здесь: Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData) возвращает String.Empty.
Я испытываю ту же проблему. Вы случайно установили бета-версию 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( );
}