c#-如何获取Windows会话的当前UICulture

c#-如何获取Windows会话的当前UICulture,c#,.net,winapi,C#,.net,Winapi,我有一个C#(.NET4)Windows服务作为LocalSystem运行 它的功能之一是生成进程(也可以作为LocalSystem运行)。这些进程出现在给定会话的桌面上(例如SessionID 1或SessionID 2、winlogon屏幕等) 以这种方式创建进程时,在进程内调用Thread.CurrentThread.CurrentUICulture始终返回“en US”,而不是给定会话的登录用户的区域性 我需要一种方法来确定登录用户的区域性。我找到的最接近的东西是一个windows AP

我有一个C#(.NET4)Windows服务作为LocalSystem运行

它的功能之一是生成进程(也可以作为LocalSystem运行)。这些进程出现在给定会话的桌面上(例如SessionID 1或SessionID 2、winlogon屏幕等)

以这种方式创建进程时,在进程内调用Thread.CurrentThread.CurrentUICulture始终返回“en US”,而不是给定会话的登录用户的区域性

我需要一种方法来确定登录用户的区域性。我找到的最接近的东西是一个windows API“GetProcessPreferredUILanguages”,我希望使用它来获取给定会话的“资源管理器”进程的语言,但我不清楚这是否是一个可行的选项


感谢您的帮助。提前谢谢

我从来没有这样做过,但我很好奇,所以我用谷歌搜索了一下。你可以试试

根据:

当前UI区域性是每线程属性。也就是说,每个线程都有自己的当前UI区域性。此属性相当于检索或从.NET Framework 4.6开始设置分配给System.Threading.Thread.CurrentThread.CurrentUICulture属性的CultureInfo对象。线程启动时,其UI区域性最初确定如下:

  • 如果属性值不为null,则通过检索线程正在执行的应用程序域中的DefaultThreadCurrentUICulture属性指定的区域性

  • 调用Windows GetUserDefaultUILanguage函数。

还要注意这一点:

此函数仅返回语言标识符。应用程序可以使用GetUserPreferredUILanguages函数检索语言名称


我从来没有这样做过,但我很好奇,所以我用谷歌搜索了一下。你可以试试

根据:

当前UI区域性是每线程属性。也就是说,每个线程都有自己的当前UI区域性。此属性相当于检索或从.NET Framework 4.6开始设置分配给System.Threading.Thread.CurrentThread.CurrentUICulture属性的CultureInfo对象。线程启动时,其UI区域性最初确定如下:

  • 如果属性值不为null,则通过检索线程正在执行的应用程序域中的DefaultThreadCurrentUICulture属性指定的区域性

  • 调用Windows GetUserDefaultUILanguage函数。

还要注意这一点:

此函数仅返回语言标识符。应用程序可以使用GetUserPreferredUILanguages函数检索语言名称



在WindowsIdentity.Impersonate()块中调用GetUserDefaultUILanguage()会返回正确的区域性信息

在WindowsIdentity.Impersonate()块中调用GetUserDefaultUILanguage()会返回正确的区域性信息

很遗憾,这不起作用。函数GetUserPreferredUILanguages()也返回1033(en-US)。显然,这是Windows服务的UI语言,它被传递给它产生的进程。同样,我需要的是标识给定Windows会话(及其登录用户)运行的语言/区域性。您确定用户的区域性未设置为en US吗?此外,我刚刚发现了一个深入的答案,它提供了更多的细节:绝对肯定。我在等“de de”(语言ID 1031)。如果我编写一个独立控制台应用程序并调用Thread.CurrentThread.CurrentUICulture,它将正确返回de de,但不是通过windows服务生成的进程阅读本文,我认为现在发生的是它返回NT Authority\SYSTEM的区域性信息(默认为英语)而不是登录用户的文化信息(在我的例子中是德语)。所以只需更新原始问题。。。。我们在同一会话中有2个用户:NT Authority\SYSTEM和用户XYZ。在系统上下文下运行的进程如何确定用户XYZUNFORT的区域性?但这不起作用。函数GetUserPreferredUILanguages()也返回1033(en-US)。显然,这是Windows服务的UI语言,它被传递给它产生的进程。同样,我需要的是标识给定Windows会话(及其登录用户)运行的语言/区域性。您确定用户的区域性未设置为en US吗?此外,我刚刚发现了一个深入的答案,它提供了更多的细节:绝对肯定。我在等“de de”(语言ID 1031)。如果我编写一个独立控制台应用程序并调用Thread.CurrentThread.CurrentUICulture,它将正确返回de de,但不是通过windows服务生成的进程阅读本文,我认为现在发生的是它返回NT Authority\SYSTEM的区域性信息(默认为英语)而不是登录用户的文化信息(在我的例子中是德语)。所以只需更新原始问题。。。。我们在同一会话中有2个用户:NT Authority\SYSTEM和用户XYZ。在系统上下文下运行的进程如何确定与您的问题完全无关的用户XYZ的区域性,但为什么在交互式用户会话中在LocalSystem帐户下运行进程?这听起来是个很不幸的决定。请原谅我的无知,但有什么更好的做法呢?使用特定的受限权限专门为此应用创建一个帐户,并在桌面上的?LocalSystem?下运行该帐户?哎哟@Jerreck:像任何常规应用程序一样,在登录到用户会话的用户帐户下运行客户端进程。如果需要提升,请向服务发送请求,以代表客户端应用程序执行操作。没有