【问题标题】:Windows API StartService ... localized service nameWindows API StartService ... 本地化服务名称
【发布时间】:2011-03-31 16:30:37
【问题描述】:

我想用 C++ 程序启动卷影复制服务。这包括获取服务控制管理器 (OpenSCManager) 的句柄,使用它来获取服务句柄 (OpenService),然后启动服务 (StartService)。

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

【问题讨论】:

  • 您确定 Volumeschattenkopie 是 German Vista 上的 服务名称 吗?肯定是服务显示名,但是OpenService在寻找CreateService时使用的名字,可能没有本地化。
  • @Jon:谢谢!我懂了。如何找到服务的原始名称?
  • @Felix 进入服务控制面板,调出您感兴趣的服务的属性。它在顶部显示名称。在我的英文 win7 机器上,Volume Shadow Copy 的服务名称是 VSS
  • @Felix:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services,可能是 VSS 左右...
  • @Jon:确实你是对的。我能接受的答案怎么样?

标签: c++ localization windows-services


【解决方案1】:

您确定 Volumeschattenkopie 是 German Vista 上的服务名称吗?肯定是服务显示名,但是OpenService在查找CreateService时使用的名字,可能没有本地化。要找到原始服务名称,请进入服务控制面板,调出您感兴趣的服务的属性。它在顶部显示名称。在我的英文 win7 机器上,Volume Shadow Copy 的服务名称是 VSS。

【讨论】:

    【解决方案2】:

    在为“NT AUTHORITY\NETWORK SERVICE”或“NT AUTHORITY\SYSTEM”等内置 Windows 帐户获取本地化名称时遇到了同样的问题。 唯一的区别是我在这种情况下使用 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      • 1970-01-01
      相关资源
      最近更新 更多