当它设置为 ApplicationPoolIdentity 时,如何设置 IIS 应用程序池标识用户区域设置
Posted
技术标签:
【中文标题】当它设置为 ApplicationPoolIdentity 时,如何设置 IIS 应用程序池标识用户区域设置【英文标题】:How do you set the IIS Application Pool Identity User Locale when it's set to ApplicationPoolIdentity 【发布时间】:2015-05-21 18:59:27 【问题描述】:澄清标题。
当您在 IIS 中创建应用程序池时,您需要为其命名。然后,您可以将身份设置为 ApplicationPoolIdentiy。
Windows 然后创建这个你看不到的神奇用户。假设应用程序池名称为 MyTestAppPool,因此您最终会得到一个名为 MyTestAppPool (IIS AppPool\MyTestAppPool) 的用户
当这种情况发生时,Windows 使用服务器的当前区域设置。假设当时是美国。
然后您将其更改为英国。虽然有一个副本,但它不会复制给我发现的这些神奇用户。因此,您的服务器设置为英国,而您的 MyTestAppPool 设置为美国。
因此,当网站运行并且您需要在正确的语言环境中将某些内容格式化为货币时,由于 AppPool 而不是英国货币,您最终会使用美国货币。
有没有办法更改 AppPool 用户的区域设置?
我发现的唯一方法是删除应用程序池并在将服务器区域设置设置为所需内容后重新创建它。如果我不想那样做怎么办。
如果我需要在不同的语言环境中运行多个网站,我该如何将 AppPoolIdentity 用户语言环境设置为其中的每一个,而不必在创建应用程序池之前将服务器更改为我想要的?
【问题讨论】:
你不能用 HKEY_USERS\\Control Panel\International 中的注册表来更改它,如***.com/questions/1202515/… 中所述吗? 1) 区域设置属于用户。当您说客户要求它使用系统的本地时,您是什么意思? 2) 在服务器上创建一些本地用户用于应用程序池标识有什么问题? 这并不能解决问题,但是,如果您在应用程序启动时设置 CurrentThread.Culture="en-GB" 并且对于每个请求,则本地化例程将在该语言环境中运行。 【参考方案1】:当您创建和使用 App Pool Identity 时,会创建一个“用户”,并且在 C:\Users\AppPoolName
处有一个文件夹。
在C:\Windows\System32\inetsrv\config\applicationHost.config
中有一个元素在我的机器上看起来像这样:
<applicationPoolDefaults managedRuntimeVersion="v4.0">
<processModel identityType="ApplicationPoolIdentity" loadUserProfile="true" setProfileEnvironment="false" />
</applicationPoolDefaults>
这两个设置的组合决定了应用程序池标识运行的环境(以及区域设置)设置。
您应该能够通过检查加载..\Users\AppPoolName\NTUSER.DAT
的用户的HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\hivelist
找出唯一ID,然后将其与HKEY_USERS\UnqiueId\ControlPanel\International\Locale
设置中的设置相匹配。
除非您需要设置,否则设置 setProfileEnvironment="false"
可能会更简单。
【讨论】:
setProfileEnvironment="false" 设置时,从哪里获取环境值?哪个用户的环境? @pm_2 这是一个非常好的问题——我通过谷歌搜索找不到答案。我猜它要么不加载它们,要么使用当前的服务器设置。很抱歉不能提供更多帮助。 嗯...我已经关闭了setProfileEnvironment
,但它仍在使用比服务器默认值晚一小时的时区。而且它是针对供应商应用程序的,所以我不能只修复代码。
奇怪的夏令时问题?【参考方案2】:
您可以通过 web.config 或在页面级别设置应用程序的文化。这应该覆盖应用程序池用户的文化。
看看这个https://msdn.microsoft.com/en-us/library/bz9tc508(v=vs.140).aspx
【讨论】:
问题是客户要求它使用系统的本地,因此如果他们决定更改本地,则在页面或 web.config 中设置它将不起作用。是否可以根据系统语言环境而不是运行 AppPool 的用户的语言环境来设置语言环境?【参考方案3】:您的网站不应依赖服务器设置来按预期的语言环境工作。您应该在 Global.asax 文件或 web.config 中设置 Thread.Culture
和 Thread.UICulture
。
如果您在项目中这样做,您可以保护自己免受环境问题的影响。
这样做也将更容易在不同站点中使用不同的语言环境。
【讨论】:
【参考方案4】:解决此问题的最佳方法是创建您自己的用户帐户,将此用户分配到应用程序池。然后,您可以通过以用户身份登录来更改此用户的区域设置。
确保此用户有权访问网络文件
看看这个链接
https://www.bluevalleytech.com/techtalk/blog/assigning-ntfs-folder-permission-to-iis7-application-pools.aspx
【讨论】:
不幸的是,我们的客户不允许我们在他们的网络上创建和登录用户,所以这不是我们的选择。 那么你需要在你的网络应用程序中设置文化看看这个msdn.microsoft.com/en-us/library/bz9tc508(v=vs.140).aspx 问题是客户要求它使用系统的本地,因此如果他们决定更改本地,则在页面或 web.config 中设置它将不起作用。是否可以根据系统区域设置而不是运行 AppPool 的用户的区域设置?【参考方案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、detect os language from c# 找到有关此的更多信息。
【讨论】:
但这不是重点,手动处理代码中的文化。上面的 global.asx 解决方案是要走的路。设置并忘记! @Fernando68 Ekhm... 以及如何在 global.asax 中设置文化而不是通过代码手动设置?如果您阅读了我的回答,您就会知道我建议将其设置在 Global.asax... 不确定我是否关注你,但我的意思只是改变一次并继续前进。【参考方案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.
【讨论】:
以上是关于当它设置为 ApplicationPoolIdentity 时,如何设置 IIS 应用程序池标识用户区域设置的主要内容,如果未能解决你的问题,请参考以下文章