Как установить идентификатор пользователя идентификатора пула приложений IIS, когда он установлен на ApplicationPoolIdentity

Чтобы прояснить заголовок.

При создании пула приложений в IIS вы даете ему имя. Затем вы можете установить идентификатор ApplicationPoolIdentiy.

Затем Windows создает этого волшебного пользователя, которого вы не видите. Предположим, что имя пула приложений - это MyTestAppPool, поэтому в итоге вы получите имя пользователя MyTestAppPool (IIS AppPool\MyTestAppPool)

Когда это произойдет, Windows использует серверную текущую локаль. Скажем, в то время это были США.

Затем вы перейдете в Великобританию. Пока есть копия, это не копирует этих волшебных пользователей, которых я нашел. Таким образом, ваш сервер настроен на Великобританию, а ваш MyTestAppPool установлен в США.

Итак, когда веб-сайт работает, и вам нужно сказать, что нужно форматировать что-то в валюте в правильной локали, вы получаете валюту США из-за AppPool вместо валюты Великобритании.

Есть ли способ изменить языковой стандарт пользователя AppPool?

Единственный способ, который я нашел, - удалить пул приложений и снова заново создать его после того, как вы установите локаль сервера на то, что вы хотите. Что делать, если я не хочу этого делать.

Что делать, если мне нужно иметь несколько веб-сайтов, работающих в разных локалиях, как бы я установил локаль пользователя AppPoolIdentity для каждого из них без необходимости менять сервер до того, что я хочу, прежде чем создавать приложение?

Ответ 1

При создании и использовании идентификатора пула приложений создается "пользователь", и есть папка с C:\Users\AppPoolName.

В C:\Windows\System32\inetsrv\config\applicationHost.config есть элемент, который на моей машине выглядит так:

<applicationPoolDefaults managedRuntimeVersion="v4.0">
  <processModel identityType="ApplicationPoolIdentity" loadUserProfile="true" setProfileEnvironment="false" />
</applicationPoolDefaults>

Комбинация этих двух параметров определяет настройки среды (и, следовательно, локали), которые выполняются как идентификатор пула приложений.

Вы можете определить уникальный идентификатор, проверив HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\hivelist для пользователя, который загружает ..\Users\AppPoolName\NTUSER.DAT, а затем сопоставляет его с настройками в настройках HKEY_USERS\UnqiueId\ControlPanel\International\Locale.

Может быть проще установить setProfileEnvironment="false", если вам не нужны настройки.

Ответ 2

Вы можете настроить культуру своего приложения через web.config или на уровне страницы. Это должно переопределить культуру пользователей пула приложений.

посмотрите на https://msdn.microsoft.com/en-us/library/bz9tc508(v=vs.140).aspx

Ответ 3

Ваш веб-сайт не должен полагаться на настройку сервера для работы в соответствии с языком. Вы должны установить Thread.Culture и Thread.UICulture в файле Global.asax или в файле web.config.

Если вы делаете это в своем проекте, вы защищаете себя от проблем с окружающей средой.

Выполнение этого способа также будет проще использовать разные локали на разных сайтах.

Ответ 4

Лучший способ решить эту проблему - создать собственную учетную запись пользователя, назначить этого пользователя пулу приложений. Затем вы можете изменить этот локали пользователей, войдя в систему как пользователь.

Убедитесь, что у этого пользователя есть доступ к веб файлам

Посмотрите на эту ссылку

https://www.bluevalleytech.com/techtalk/blog/assigning-ntfs-folder-permission-to-iis7-application-pools.aspx

Ответ 5

Вы можете программно изменить культуру своего приложения, установив это в свой файл Global.asax:

protected void Application_BeginRequest(Object sender, EventArgs e)
{
    Thread.CurrentThread.CurrentCulture = CultureInfo.CurrentCulture;
}

где CultureInfo.CurrentCulture вернет вашу культуру ОС.

Подробнее об этом вы можете найти в https://support.microsoft.com/pl-pl/kb/306162, определить язык os из С#.

Ответ 6

Вы не хотите использовать CultureInfo.CurrentCulture(это возвращает культуру текущего потока), но вместо этого используйте CultureInfo.InstalledUICulture

protected void Application_BeginRequest(Object sender, EventArgs e)
{
    Thread.CurrentThread.CurrentCulture = CultureInfo.InstalledUICulture;
    //sets the thread culture to OS language.
}