我必须获得" Windows防火墙"的实例。 Windows服务,因为我正在使用
ServiceController service = new ServiceController("Windows Firewall");
这在en-US文化中运行良好,但是当我尝试在Windows葡萄牙语(巴西)pt-PT文化中尝试这样做时,它会抛出未找到的异常服务。
是的,在葡萄牙语中没有" Windows防火墙"相反"防火墙做Windows",如果我改变我的代码如下
ServiceController service = new ServiceController("Firewall do Windows");
它只会在pt-PT文化中发挥作用。
是否有任何通用方法,以获得" Windows防火墙"不管文化如何?
答案 0 :(得分:3)
没有系统提供执行此类转换的功能。您必须在自己的代码中创建所有可能值的列表/字典,并查找该值。
答案 1 :(得分:1)
ServiceController Constructor具有以下参数说明:
名称
标识系统服务的名称。这也可以是服务的显示名称。
换句话说:通过语言不变的服务名称或本地化的显示名称来识别服务。您的代码使用显示名称( Windows防火墙)。如果您将其更改为使用服务名称( MpsSvc ),则不会遇到本地化问题。
您可以通过计算机管理控制台(compmgmt.msc)查找服务的服务名称和显示名称。右键单击服务并选择属性将显示两个名称。
答案 2 :(得分:1)
老实说,我只是学习一个Windows服务的显示名称可以是特定于文化的:-p
我完全同意David。创建自己的键/值列表听起来是最佳选择。另一方面,可能是获取特定于文化的显示名称的一些方法。警告!我不 100%确定这将始终有效!
如何使用它的服务名称并根据它获取显示名称,而不是显示名称?我不认为这将是文化特定的。例如,使用ServiceController.GetServices
方法;
var displayName = ServiceController.GetServices()
.Where(s => s.ServiceName == "MpsSvc")
.Select(s => s.DisplayName)
.ToList()[0];
ServiceController sc = new ServiceController(displayName);
我在MpsSvc上搜索了一个小时,也许可能被用作另一项服务作为名称,但我找不到任何相关内容。
你也可以使用WMI来实现它;
var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Service");
ManagementObjectCollection collection = searcher.Get();
var obj = collection.Cast<ManagementObject>()
.Where(o => o.Path.Path.Contains("MpsSvc"))
.ToList()[0];
string displayName = obj["DisplayName"].ToString();
ServiceController sc = new ServiceController(displayName);