2011-03-31 109 views
1

我想用C++程序启动卷影复制服务。这涉及获取服务控制管理器(OpenSCManager)的句柄,使用它获取服务句柄(OpenService),然后启动服务(StartService)。Windows API StartService ...本地化服务名称

但是,我必须将服务名称作为字符串传递给OpenService函数。 VSS服务在我的德语Windows Vista上称为Volumeschattenkopie。有没有办法以任何语言开始正确的服务?我以前没有使用过资源字符串,但是可以通过FindStringResourceEx或类似的东西获得服务名称?

+0

您确定Volumeschattenkopie是德语Vista上的*服务名称*吗?这绝对是*服务显示名称*,但OpenService正在寻找CreateService期间使用的名称,该名称可能未被本地化。 – Jon 2011-03-31 16:43:14

+0

@Jon:谢谢!我懂了。我如何找出服务的原始名称? – 2011-03-31 16:45:38

+2

@Felix进入服务控制面板,调出您感兴趣的服务的属性。它在顶部显示名称。在我的英文win7框中,Volume Shadow Copy的服务名称是VSS – Jon 2011-03-31 16:48:30

回答

2

您确定Volumeschattenkopie是德语Vista上的服务名称吗?这绝对是服务显示名称,但OpenService正在查找在CreateService期间使用的名称,该名称可能未被本地化。要找到原始服务名称,请进入服务控制面板,调出您感兴趣的服务的属性。它在顶部显示名称。在我的英文win7框中,Volume Shadow Copy的服务名称是VSS。

0

我的内置Windows帐户(如“NT AUTHORITY \ NETWORK SERVICE”或“NT AUTHORITY \ SYSTEM”)获取本地化名称时遇到同样的问题。 唯一的区别是我在这种情况下使用C#。不过我觉得这不应该是一个问题转移到C++(使用非托管或托管C++?)

这里是我是如何被本地计算机上的本地化“NT AUTHORITY \ NETWORK SERVICE”:

SecurityIdentifier userIdentifer = new SecurityIdentifier(WellKnownSidType.NetworkServiceSid, null); 
string accountName = userIdentifer.Translate(typeof(NTAccount)).Value; 

而且如果我需要'NT AUTHORITY \ SYSTEM',那么我只需使用不同的Sid:

SecurityIdentifier userIdentifer = new SecurityIdentifier(WellKnownSidType.LocalSystemSid, null);