2014-01-25 83 views
2

我想獲得服務內的服務名稱。粗略的想法是獲取進程ID並將進程ID與WMI,ServiceCotroller或EnumServicesStatusEx()API枚舉的服務進行比較。獲得服務內的服務名稱

問題是服務在域帳戶下運行(它不是本地管理員)。當我想枚舉正在運行的服務中的服務時,正在運行的服務本身從枚舉中缺失!

如果我將服務帳戶移到本地管理員,則找到正在運行的服務。所以這不是代碼問題。 (如果代碼問題,行爲應該是相同的:服務未找到。)

如果我將邏輯提取到控制檯應用程序(或通過powershell)並在服務帳戶下運行應用程序或PowerShell,也會找到該服務。所以這不是許可問題。 (如果權限問題,行爲應該是相同的:未找到服務。)

當服務帳戶不是管理員和INSIDE服務時,無法枚舉該服務。這是非常有線的問題。

我從MSDN檢查EnumServicesStatusEx的文檔,發現本地管理員有比本地認證用戶更多的SC_MANAGER_LOCK。這是原因嗎?但是我不能將鎖與服務枚舉鏈接起來。

或者有人請指出一種方法來查詢服務中的服務名稱。

謝謝。

順便說一下,它在Windows 2008 R2上。

我發現相關的問題:How to get name of windows service from inside the service itself1st answer不適合我。我想提供一個通用的庫,並且無法控制安裝程序。 2nd answer和我一樣。我想這應該與我的結果相同。

回答

0

這是一個許可問題。 Sysinternals公司的

運行psservice喜歡:

psservice.exe security InstrumentationTestService 

,我得到了以下結果:

PsService v2.24 - Service information and configuration utility 
Copyright (C) 2001-2010 Mark Russinovich 
Sysinternals - www.sysinternals.com 

SERVICE_NAME: InstrumentationTestService 
DISPLAY_NAME: InstrumentationTestService 
     ACCOUNT: LocalSystem 
     SECURITY: 
     [ALLOW] NT AUTHORITY\SYSTEM 
       Query status 
       Query Config 
       Interrogate 
       Enumerate Dependents 
       Pause/Resume 
       Start 
       Stop 
       User-Defined Control 
       Read Permissions 
     [ALLOW] BUILTIN\Administrators 
       All 
     [ALLOW] NT AUTHORITY\INTERACTIVE 
       Query status 
       Query Config 
       Interrogate 
       Enumerate Dependents 
       User-Defined Control 
       Read Permissions 
     [ALLOW] NT AUTHORITY\SERVICE 
       Query status 
       Query Config 
       Interrogate 
       Enumerate Dependents 
       User-Defined Control 
       Read Permissions 

這表明我的服務帳戶沒有權限查詢服務狀態。

如果我使用服務帳戶運行powershell/WMI/ServiceController,服務帳戶將變成一個INTERACTIVE用戶。所以它有權限查詢服務狀態。

解決方法是授予服務帳戶查詢狀態權限。

0

這不是一個純粹的PowerShell答案,但是就EXE,DLL和SERVICE而言,它有一個很好的工具,它是TASKLIST.EXE

看一看/ FI和/ FO。在下面的示例中,我獲得了搜索服務的信息。

tasklist /FI "SERVICES eq WSearch" /FO "CSV" 

要它使用PowerShell你可以橫置整合:

tasklist /FI "SERVICES eq WSearch" /FO "CSV" | ConvertFrom-Csv 
+0

感謝您的回覆。我得到服務PID並嘗試運行tasklist,如:tasklist/FI「PID eq {PID}」/ SVC/NH。它返回的服務名稱是* N/A *。順便說一句,如果我使用服務帳戶在powershell中運行tasklist,它可以返回正確的服務名稱。所以你的解決方案失敗了。太。 – DeepNight

+0

您確定要正確調用它嗎?你能給出你使用的確切語法嗎? – JPBlanc

+0

'tasklist/FI「PID eq 2524」/ SVC'在控制檯返回「sqlservr.exe 2524 MSSQLSERVER」返回服務調試輸出中的「sqlservr.exe 2524 N/A」有線。 – DeepNight