Seite 1 von 1

Schnell auf laufenden Dienst prüfen?

Verfasst: 11.08.2008 10:32
von Kukulkan
Hallo,

Ich suche eine Möglichkeit, schnell und zuverlässig zu prüfen ob ein Dienst mit einem bestimmten Namen installiert ist und ob der gerade läuft. Gibt es einen Weg über die Registry oder muss ich API bemühen?

Ach ja, ich suche Codeschnipsel und keine Library... :)

Volker

Verfasst: 11.08.2008 10:58
von Rings
du wirst eigentlich alles in der pbosl finden, im Source .
(enumerieren der dienste, nachschauen ob er läuft etc.)
und ob Registry oder APi , kommt aufs selbe raus -> nur windows .

Verfasst: 13.08.2008 00:57
von HeX0R
Hierfür hatte ich mal ne Erweiterung zum PBOSL gemacht, weil ich das Enumerieren zu umständlich fand, wenn ich eh weiss, wie der Service heisst:

Code: Alles auswählen

#SRSC_MANAGER_ALL_ACCESS      = $F003F
#SRSERVICE_ALL_ACCESS         = $F01FF

ProcedureDLL.l GetServiceStatusEx(ServiceName.s)
	Protected Result.l, schSCManager.l, schService.l

	schSCManager = OpenSCManager_(0, 0, #SRSC_MANAGER_ALL_ACCESS)
	If schSCManager
		schService = OpenService_(schSCManager, @ServiceName, #SRSERVICE_ALL_ACCESS)
		If schService
			If QueryServiceStatus_(schService, @Result) = 0
				Result = 0
			EndIf
			CloseServiceHandle_(schService)
		EndIf
		CloseServiceHandle_(schSCManager)
	EndIf
	
	ProcedureReturn Result
EndProcedure

Verfasst: 13.08.2008 13:13
von Kukulkan
Hallo XeXOR,

Danke für den Code, aber bei mir bringt das immer 0 oder es schmiert bei ProcedureReturn Result im Debugger mit invalid memory access ab. :(

PB4.20 / WinXP SP2

Volker

Verfasst: 13.08.2008 19:02
von HeX0R
War auch irgendwie nicht ganz richtig (hab in der MSDN nochmal nachgelesen):

Code: Alles auswählen

#SRSC_MANAGER_ALL_ACCESS      = $F003F
#SRSERVICE_ALL_ACCESS         = $F01FF

Global Dim Service_Message.s(7)
Service_Message(0) = "Service unknown"
Service_Message(1) = "Service Stopped"
Service_Message(2) = "Service Start Pending"
Service_Message(3) = "Service Stop Pending"
Service_Message(4) = "Service Running"
Service_Message(5) = "Service Continue Pending"
Service_Message(6) = "Service Pause Pending"
Service_Message(7) = "Service Paused"

ProcedureDLL.l GetServiceStatusEx(ServiceName.s)
	Protected SS.SERVICE_STATUS, Result.l, schSCManager.l, schService.l

	schSCManager = OpenSCManager_(0, 0, #SRSC_MANAGER_ALL_ACCESS)
	If schSCManager
		schService = OpenService_(schSCManager, @ServiceName, #SRSERVICE_ALL_ACCESS)
		If schService
			If QueryServiceStatus_(schService, @SS)
				Result = SS\dwCurrentState
			EndIf
			CloseServiceHandle_(schService)
		EndIf
		CloseServiceHandle_(schSCManager)
	EndIf

	ProcedureReturn Result
EndProcedure

Debug Service_Message(GetServiceStatusEx("srservice"))
Ich hatte das bei den Schwiegereltern zusammengekleistert, nur war ich dort immer im Warsteiner-Nebel ;)