Rubrik: Windows/System | 22.03.05 |
EnumServicesStatus-Funktion Diese Funktion ermittelt Services und deren Status in einer geöffneten Service-Datenbank. | ||
Betriebssystem: WinNT 3.1, WinNT 3.1, Win2000 | Views: 7.391 |
Deklaration:
Declare Function EnumServicesStatus Lib "advapi32.dll" _ Alias "EnumServicesStatusA" ( _ ByVal hSCManager As Long, _ ByVal dwServiceType As Long, _ ByVal dwServiceState As Long, _ lpServices As Any, _ ByVal cbBufSize As Long, _ pcbBytesNeeded As Long, _ lpServicesReturned As Long, _ lpResumeHandle As Long) As Long
Beschreibung:
Diese Funktion ermittelt Services und deren Status in einer geöffneten Service-Datenbank.
Parameter:
hSCManager | Erwartet das Handle einer geöffneten Service-Datenbank, die mittels der OpenSCManager-Funktion geöffnet werden kann. Für den erfolgreichen Aufruf der Funktion muss der Prozess dieerforderlichen Zugriffsrechte besitzen. |
dwServiceType | Erwartet eine oder eine Kombination aus beiden der folgenden Konstanten, die beschreiben welcheArten der Services enumeriert werden sollen. |
dwServiceState | Erwartet den Status der zu enumerierenden Services. Es werden dann nur Services enumeriert, die den angegebenen Status besitzen. |
lpServices | Erwartet Puffer, der aus einem Array von ENUM_SERVICE_STATUS-Strukturen besteht. Dieser Puffer muss genügendArrayfelder besitzen, um alle gefundenen Serviceinformationen zu empfangen. |
cbBufSize | Erwartet die Größe des übergebenen Puffers in Bytes. |
pcbBytesNeeded | Erwartet eineLong-Variable, die mit der Anzahl der benötigten Bytes gefüllt wird, die der Puffer groß sein muss um alle Informationen zu erhalten. |
lpServicesReturned | Erwartet eineLong-Variable, die mit der Anzahl der in den Puffer kopierten Serviceinformationen gefüllt wird. |
lpResumeHandle | Erwartet eineLong-Variable, die mit dem Handle des Starteintrages gefüllt ist, an dem die Enumeration begonnen werden soll. Enthält dieseVariable den Wert "0", so wird am Anfang der Datenbank angefangen zu enumerieren. Schlägt die Funktion fehl und gibt die GetLastError-Funktionden Fehler "ERROR_MORE_DATA" zurück, so wird diese Variable mit dem Handle des nächsten zu enumerierenden Datensatzes gefüllt. |
dwServiceType Konstanten:
Const SERVICE_KERNEL_DRIVER = &H1 ' SERVICE_DRIVER Konstante Const SERVICE_FILE_SYSTEM_DRIVER = &H2 ' SERVICE_DRIVER Konstante Const SERVICE_RECOGNIZER_DRIVER = &H8 ' SERVICE_DRIVER Konstante Const SERVICE_DRIVER = ( SERVICE_KERNEL_DRIVER Or SERVICE_FILE_SYSTEM_DRIVER Or SERVICE_RECOGNIZER_DRIVER ) ' Es sollen Treiber Services enumeriert werden Const SERVICE_WIN32_OWN_PROCESS = &H10 ' SERVICE_WIN32 Konstante Const SERVICE_WIN32_SHARE_PROCESS = &H20 ' SERVICE_WIN32 Konstante Const SERVICE_WIN32 = (SERVICE_WIN32_OWN_PROCESS Or SERVICE_WIN32_SHARE_PROCESS) ' Es sollen Anwendungs-Services enumeriert werden
Rückgabewert:
Ist die Funktion erfolgreich, so ist die Rückgabe ein Wert "ungleich 0", andernfalls wird derWert "0" zurückgegeben. Für erweiterte Fehlerinformationen können Sie die GetLastError-Funktion aufrufen.
Beispiel:
Private Declare Function OpenSCManager Lib "advapi32.dll" _ Alias "OpenSCManagerA" ( _ ByVal lpMachineName As String, _ ByVal lpDatabaseName As String, _ ByVal dwDesiredAccess As Long) As Long Private Declare Function EnumServicesStatus Lib "advapi32.dll" _ Alias "EnumServicesStatusA" ( _ ByVal hSCManager As Long, _ ByVal dwServiceType As Long, _ ByVal dwServiceState As Long, _ lpServices As Any, _ ByVal cbBufSize As Long, _ pcbBytesNeeded As Long, _ lpServicesReturned As Long, _ lpResumeHandle As Long) As Long Private Declare Function CloseServiceHandle Lib "advapi32.dll" ( _ ByVal hSCObject As Long) As Long Private Declare Sub CopyMemory Lib "kernel32" _ Alias "RtlMoveMemory" ( _ Destination As Any, _ Source As Any, _ ByVal Length As Long) Private Declare Function GetLastError Lib "kernel32" () As Long Private Declare Function lstrcpy Lib "kernel32" _ Alias "lstrcpyA" ( _ lpString1 As Any, _ lpString2 As Any) As Long Private Type SERVICE_STATUS dwServiceType As Long dwCurrentState As Long dwControlsAccepted As Long dwWin32ExitCode As Long dwServiceSpecificExitCode As Long dwCheckPoint As Long dwWaitHint As Long End Type Private Type ENUM_SERVICE_STATUS lpServiceName As Long lpDisplayName As Long ServiceStatus As SERVICE_STATUS End Type ' OpenSCManager lpDatabaseName-Konstante Private Const SERVICES_ACTIVE_DATABASE = "ServicesActive" ' Standarddatenbank ' OpenSCManager dwDesiredAccess-Konstanten Private Const SC_MANAGER_CONNECT = &H1 ' (Autorisierte Benutzer, Lokales System, Administrator) ' Erlaubt das Verbinden mit der Datenbank Private Const SC_MANAGER_ENUMERATE_SERVICE = &H4 ' (Autorisierte Benutzer, Lokales System, Administrator) ' Erlaubt das Enumerieren der Datenbank Private Const SC_MANAGER_QUERY_LOCK_STATUS = &H10 ' (Autorisierte Benutzer, Lokales System, Administrator) ' Erlaubt die Abfrage von gelockten Datensätzen Private Const SC_MANAGER_MODIFY_BOOT_CONFIG = &H20 ' SC_MANAGER_ALL_ACCESS Konstante Private Const STANDARD_RIGHTS_REQUIRED = &HF0000 ' SC_MANAGER_ALL_ACCESS Konstante Private Const SC_MANAGER_CREATE_SERVICE = &H2 ' SC_MANAGER_ALL_ACCESS Konstante Private Const SC_MANAGER_LOCK = &H8 ' SC_MANAGER_ALL_ACCESS Konstante Private Const SC_MANAGER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or _ SC_MANAGER_CONNECT Or SC_MANAGER_CREATE_SERVICE Or _ SC_MANAGER_ENUMERATE_SERVICE Or SC_MANAGER_LOCK Or _ SC_MANAGER_QUERY_LOCK_STATUS Or SC_MANAGER_MODIFY_BOOT_CONFIG) _ ' (Administrator) Erlaubt alle Zugriffe auf die Datenbank Private Const READ_CONTROL = &H20000 ' STANDARD_RIGHTS_READ Konstante Private Const STANDARD_RIGHTS_READ = (READ_CONTROL) ' Erlaubt Standard-Lesezugriffe ' EnumServicesStatus dwServiceType-Konstanten Private Const SERVICE_KERNEL_DRIVER = &H1 ' SERVICE_DRIVER Konstante Private Const SERVICE_FILE_SYSTEM_DRIVER = &H2 ' SERVICE_DRIVER Konstante Private Const SERVICE_RECOGNIZER_DRIVER = &H8 ' SERVICE_DRIVER Konstante Private Const SERVICE_DRIVER = (SERVICE_KERNEL_DRIVER Or _ SERVICE_FILE_SYSTEM_DRIVER Or SERVICE_RECOGNIZER_DRIVER) ' Es sollen Treiber Services enumeriert werden Private Const SERVICE_WIN32_OWN_PROCESS = &H10 ' SERVICE_WIN32 Konstante Private Const SERVICE_WIN32_SHARE_PROCESS = &H20 ' SERVICE_WIN32 Konstante Private Const SERVICE_WIN32 = (SERVICE_WIN32_OWN_PROCESS Or _ SERVICE_WIN32_SHARE_PROCESS) ' Es sollen Anwendungs-Services enumeriert werden ' EnumServicesStatus dwServiceState-Konstanten Private Const SERVICE_ACTIVE = &H1 ' Der Service muss aktiv sein Private Const SERVICE_INACTIVE = &H2 ' Der Service muss inaktiv sein Private Const SERVICE_STATE_ALL = (SERVICE_ACTIVE Or SERVICE_INACTIVE) ' Der Service kann aktiv oder inaktiv sein ' eine der Standard Fehlerkonstanten Private Const ERROR_MORE_DATA = 234 ' Es sind noch Daten verfügbar
' Alle registrierten Services ermitteln Private Sub Form_Load() Dim hSManager As Long, Retval As Long, i As Integer Dim BufferSize As Long, CountServices As Long, hNextService As Long Dim Buffer() As ENUM_SERVICE_STATUS, TmpStr As String, TmpStr2 As String ' Datenbank mit registrierten Services öffnen hSManager = OpenSCManager(vbNullString, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ENUMERATE_SERVICE) ' Benötigte Puffergröße ermitteln Retval = EnumServicesStatus(hSManager, SERVICE_WIN32, _ SERVICE_STATE_ALL, ByVal 0&, 0&, BufferSize, 0&, 0&) If GetLastError << 234 And Retval = 0 Then MsgBox "Die benötigte Puffergröße konnte nicht ermittelt werden." Exit Sub End If ' Puffer einrichten und Daten ermitteln ReDim Buffer(BufferSize / Len(Buffer(0))) Retval = EnumServicesStatus(hSManager, SERVICE_WIN32, _ SERVICE_STATE_ALL, Buffer(0), Len(Buffer(0)) * (UBound(Buffer) + 1), _ BufferSize, CountServices, hNextService) ' Servicenamen ausgeben For i = 0 To CountServices - 1 TmpStr = String(257, vbNullChar) Call lstrcpy(ByVal TmpStr, ByVal Buffer(i).lpServiceName) TmpStr = Trim$(Left$(TmpStr, InStr(1, TmpStr, vbNullChar) - 1)) TmpStr2 = String(257, vbNullChar) Call lstrcpy(ByVal TmpStr2, ByVal Buffer(i).lpDisplayName) TmpStr2 = Trim$(Left$(TmpStr2, InStr(1, TmpStr2, vbNullChar) - 1)) Debug.Print "Service: " & TmpStr & " (" & TmpStr2 & ")" Next i ' Servicedatenbank schließen Call CloseServiceHandle(hSManager) End Sub