Пул приложений IIS 7.5 использует неверный% APPDATA% для пользовательского пользователя в качестве удостоверения - PullRequest
10 голосов
/ 29 февраля 2012

Я хочу, чтобы мое веб-приложение 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 ]

17 голосов
/ 10 декабря 2012

Откройте свой %WINDIR%\System32\inetsrv\config\applicationHost.config и найдите <applicationPoolDefaults>.Под <processModel> убедитесь, что у вас нет setProfileEnvironment="false".Если вы это сделаете, установите его в true.

3 голосов
/ 11 декабря 2017

Пулы приложений - Ваше приложение Пул - Расширенные настройки ...

Модель процесса - Загрузка профиля пользователя, установленного 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 голосов
/ 12 апреля 2017

Я недавно столкнулся с той же проблемой. Как упомянул Амит, проблема в том, что профиль пользователя не загружен. Этот параметр предназначен для всех пулов приложений и находится в 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"

Надеюсь, это поможет

0 голосов
/ 19 июля 2012

Проблема с настройками IIS.Ответ здесь: Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData) возвращает String.Empty

0 голосов
/ 23 апреля 2012

У меня такая же проблема.Вы случайно установили бета-версию 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( );
}
...