2011-03-31 51 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);