Schnell auf laufenden Dienst prüfen?

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Schnell auf laufenden Dienst prüfen?

Beitrag 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
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Beitrag 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 .
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
HeX0R
Beiträge: 3055
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag 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
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Beitrag 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
Benutzeravatar
HeX0R
Beiträge: 3055
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag 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 ;)
Antworten