如何将IIS应用程序池标识用户区域设置为ApplicationPoolIdentity时,如何设置它

时间:2015-03-18 19:51:39

标签: c# asp.net iis

澄清标题。

在IIS中创建应用程序池时,请为其指定名称。然后,您可以将身份设置为ApplicationPoolIdentiy。

然后,Windows会创建您无法看到的魔术用户。假设应用程序池名称是MyTestAppPool,那么最终会得到一个名为MyTestAppPool的用户(IIS AppPool \ MyTestAppPool)

发生这种情况时,Windows使用服务器当前区域设置。我们当时说这是美国。

然后你将它改为英国。虽然有副本,但这并没有复制到我发现的这些魔术用户身上。因此,当您的MyTestAppPool设置为US时,您的服务器将设置为UK。

因此,当一个网站运行并且您需要在正确的区域设置中将某些内容格式化为货币时,由于AppPool而不是英国货币,您最终会使用美国货币。

有没有办法更改AppPool用户的区域设置?

我找到的唯一方法是删除应用程序池并在将服务器区域设置设置为您想要的内容后再次重新创建它。如果我不想这样做会怎么样。

如果我需要在不同的语言环境中运行多个网站,如何在创建apppool之前将AppPoolIdentity用户区域设置设置为其中每一个而不必将服务器更改为我想要的内容该怎么办?

6 个答案:

答案 0 :(得分:8)

创建和使用应用程序池标识时,会创建一个“用户”,并且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设置中的设置进行匹配来确定唯一ID。

除非您需要设置,否则设置setProfileEnvironment="false"可能更简单。

答案 1 :(得分:2)

您可以通过web.config或页面级别设置应用程序的文化。这应该覆盖应用程序池用户的文化。

查看此https://msdn.microsoft.com/en-us/library/bz9tc508(v=vs.140).aspx

答案 2 :(得分:2)

您的网站不应该依赖服务器设置来按照区域设置的方式工作。您应该在Global.asax文件或web.config中设置Thread.CultureThread.UICulture

如果您在项目中执行此操作,则可以保护自己免受环境问题的影响。

这样做也会更容易在不同的网站中使用不同的区域设置。

答案 3 :(得分:0)

解决此问题的最佳方法是创建自己的用户帐户,将此用户分配给应用程序池。然后,您可以通过以用户身份登录来更改此用户区域设置。

确保此用户有权访问网络文件

看一下这个链接

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

答案 4 :(得分:0)

您可以通过在Global.asax中设置此项来以编程方式更改应用的文化:

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

CultureInfo.CurrentCulture将返回您的操作系统文化。

有关此内容的更多信息,请参阅https://support.microsoft.com/pl-pl/kb/306162detect os language from c#

答案 5 :(得分:0)

您不想使用CultureInfo.CurrentCulture(这会返回当前线程的文化),而是使用CultureInfo.InstalledUICulture

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