Пул приложений 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.

Помогает мне.

Взято из 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/

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