Страница: 1 |
Страница: 1 |
Вопрос: Как получить список работающих служб? (NT Service)
Добавлено: 13.01.06 11:16
Автор вопроса: alex
Привет всем!
Как мне кажется надо просканировать определенные ветки реестра, только нигде не могу найти примера кода. В POFFS не нашел.. :-(
Ответы
Всего ответов: 11
Номер ответа: 1
Автор ответа:
Dushes
ICQ: 249195431
Вопросов: 8
Ответов: 110
Профиль | | #1
Добавлено: 13.01.06 12:08
Товагищи, эта проблема архиважна и архипроста одновгеменно. Пгедлагаю для дела геовлюции использовать WMI.
Public Function TrimN(ByVal S) As String
On Error Resume Next
If InStr(S, vbNullChar) <> 0 Then S = Left(S, InStr(S, vbNullChar) - 1)
TrimN = Trim(S)
If TrimN = "" Then TrimN = "Не определено)"
End Function
Public Function EnumServices() As String
Dim Objs As Object, Obj As Object, S As String, I&
On Error GoTo 1
Set Objs = GetObject("WinMgmts:".Instancesof("Win32_Service"
For Each Obj In Objs
If Not IsNull(Obj.Name) Then
I = I + 1
S = S & "Сервис " & I & ": " & TrimN(Obj.Caption) & " - " & TrimN(Obj.PathName) & " -> " & TrimN(Obj.State) & vbCrLf
End If
Next
EnumServices = S
1 End Function
Номер ответа: 2
Автор ответа:
alex
Вопросов: 84
Ответов: 453
Профиль | | #2
Добавлено: 13.01.06 12:15
Dushes
Речь идет о коде на PowerBASIC`e а не на VB!
Номер ответа: 3
Автор ответа:
Dushes
ICQ: 249195431
Вопросов: 8
Ответов: 110
Профиль | | #3
Добавлено: 13.01.06 13:30
Мда, и что у меня за привычка - не смотреть на раздел форума. А в Power Basic использовать этот же WMI объект никак низзя ?
Номер ответа: 4
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #4
Добавлено: 13.01.06 13:52
Можно, но лучше не использовать.
Вообще, а не только в pb.
Номер ответа: 5
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #5
Добавлено: 13.01.06 13:57
EnumServicesStatus не пробовал?
Номер ответа: 6
Автор ответа:
alex
Вопросов: 84
Ответов: 453
Профиль | | #6
Добавлено: 13.01.06 14:02
Спасибо! В POFFS по этой функции сразу нашел код для PBCC
#Register None
#Include "win32api.inc"
#If Not %Def(%NULL)
%NULL=0
#EndIf
#If Not %Def(%SERVICE_KERNEL_DRIVER)
%SERVICE_KERNEL_DRIVER = &H00000001
#EndIf
#If Not %Def(%SERVICE_FILE_SYSTEM_DRIVER)
%SERVICE_FILE_SYSTEM_DRIVER = &H00000002
#EndIf
#If Not %Def(%SERVICE_INTERACTIVE_PROCESS)
%SERVICE_INTERACTIVE_PROCESS = &H00000100
#EndIf
#If Not %Def(%SERVICE_ADAPTER)
%SERVICE_ADAPTER = &H00000004
#EndIf
#If Not %Def(%SERVICE_RECOGNIZER_DRIVER)
%SERVICE_RECOGNIZER_DRIVER = &H00000008
#EndIf
#If Not %Def(%SERVICE_DRIVER)
%SERVICE_DRIVER = %SERVICE_KERNEL_DRIVER Or %SERVICE_FILE_SYSTEM_DRIVER Or %SERVICE_RECOGNIZER_DRIVER
#EndIf
#If Not %Def(%SERVICE_OWN_PROCESS_INTERACTIVE) 'whatever
%SERVICE_OWN_PROCESS_INTERACTIVE = %SERVICE_INTERACTIVE_PROCESS Or %SERVICE_WIN32_OWN_PROCESS
#EndIf
#If Not %Def(%SERVICE_TYPE_ALL)
%SERVICE_TYPE_ALL = %SERVICE_WIN32 Or %SERVICE_ADAPTER Or %SERVICE_DRIVER Or %SERVICE_INTERACTIVE_PROCESS
#EndIf
#If Not %Def(%SERVICE_CONTINUE_PENDING)
%SERVICE_CONTINUE_PENDING = &H00000005
#EndIf
Function PBMain() As Long
Local lServiceManagerHandle As Long
Local lResult As Long
Local lBytesNeeded As Long 'bytes needed to enumerate remaining service entries
Local lNumServicesReturned As Long 'number of services returned
Local lResumeHandle As Long 'pointer to position in enum in case we need to re-alloc to enum all services
Local i As Long
Local lLinesPrinted As Long
Dim tSrvStatus(256) As ENUM_SERVICE_STATUS 'enumerate up to 256 services
'get service handle on local computer - services active database and ask for EnumServicesStatus
lServiceManagerHandle = OpenSCManager( ByVal %NULL, ByVal %NULL, %SC_MANAGER_ENUMERATE_SERVICE )
If lServiceManagerHandle = %NULL Then'an error happened
Select Case GetLastError()
Case %ERROR_ACCESS_DENIED
Print "The requested access to the database was denied"
GoSub do_theLines
Case %ERROR_DATABASE_DOES_NOT_EXIST
Print "The specified database does not exist"
GoSub do_theLines
Case %ERROR_INVALID_PARAMETER
Print "The parameter you specified was invalid"
GoSub do_theLines
Case Else
Print "Some other error occured..."
GoSub do_theLines
End Select
Else
'Enum all services
lResult = EnumServicesStatus( lServiceManagerHandle, _
%SERVICE_WIN32, _ 'for kernel and file system use %SERVICE_DRIVER
%SERVICE_ACTIVE, _ 'to check services in stopped status use %SERVICE_INACTIVE
tSrvStatus(0), _ 'pointer to ENUM_SERVICE_STATUS array
SizeOf(tSrvStatus(0)) * 256 , _ 'size in bytes of tSrvStatus buffer
lBytesNeeded, _ 'points to number of bytes needed to enum all entries
lNumServicesReturned, _ 'number of services returned
lResumeHandle )
If lResult = %NULL Then
Select Case GetLastError()
Case %ERROR_ACCESS_DENIED
Print "Handle does not have ENUM access"
GoSub do_theLines
Case %ERROR_INVALID_HANDLE
Print "You passed an invalid handle"
GoSub do_theLines
Case %ERROR_INVALID_DATA
Print "The parameter you specified was invalid"
GoSub do_theLines
Case %ERROR_MORE_DATA
'there are more services than tSrvStatus() array can handle
're-alloc to lBytesNeeded and call EnumServicesStatus() again
'passing it the lResumeHandle to start where you left off -
'just allocate a sufficient buffer and you should never come here...
End Select
Else
'enum services
For i = 0 To lNumServicesReturned - 1
Print "Service name : " + tSrvStatus(i).@lpServiceName
GoSub do_theLines
Print "isplay name : " + tSrvStatus(i).@lpDisplayName
GoSub do_theLines
'type of service
Select Case tSrvStatus(i).ServiceStatus.dwServiceType
Case %SERVICE_WIN32_OWN_PROCESS
Print "Type : SERVICE_WIN32_OWN_PROCESS"
GoSub do_theLines
Case %SERVICE_WIN32_SHARE_PROCESS
Print "Type : SERVICE_WIN32_SHARE_PROCESS"
GoSub do_theLines
Case %SERVICE_KERNEL_DRIVER
Print "Type : SERVICE_KERNEL_DRIVER"
GoSub do_theLines
Case %SERVICE_FILE_SYSTEM_DRIVER
Print "Type : SERVICE_FILE_SYSTEM_DRIVER"
GoSub do_theLines
Case %SERVICE_INTERACTIVE_PROCESS
Print "Type : SERVICE_INTERACTIVE_PROCESS"
GoSub do_theLines
Case %SERVICE_ADAPTER
Print "Type : SERVICE_ADAPTER"
GoSub do_theLines
Case %SERVICE_RECOGNIZER_DRIVER
Print "Type : SERVICE_RECOGNIZER_DRIVER"
GoSub do_theLines
Case %SERVICE_WIN32
Print "Type : SERVICE_WIN32"
GoSub do_theLines
Case %SERVICE_TYPE_ALL
Print "Type : SERVICE_TYPE_ALL"
GoSub do_theLines
Case %SERVICE_DRIVER
Print "Type : SERVICE_DRIVER"
GoSub do_theLines
Case %SERVICE_OWN_PROCESS_INTERACTIVE
Print "Type : SERVICE_OWN_PROCESS (Interactive)"
GoSub do_theLines
Case Else
Print "Type : UNKNOWN - VALUE: " tSrvStatus(i).ServiceStatus.dwServiceType
GoSub do_theLines
End Select
'state of status
Select Case tSrvStatus(i).ServiceStatus.dwCurrentState
Case %SERVICE_STOPPED
Print "Status : SERVICE IS STOPPED"
GoSub do_theLines
Case %SERVICE_START_PENDING
Print "Status : SERVICE IS STARTING"
GoSub do_theLines
Case %SERVICE_STOP_PENDING
Print "Status : SERVICE IS STOPPING"
GoSub do_theLines
Case %SERVICE_RUNNING
Print "Status : SERVICE IS RUNNING"
GoSub do_theLines
Case %SERVICE_CONTINUE_PENDING
Print "Status : SERVICE CONTINUE PENDING"
GoSub do_theLines
Case %SERVICE_PAUSE_PENDING
Print "Status : SERVICE PAUSE PENDING"
GoSub do_theLines
Case %SERVICE_PAUSED
Print "Status : SERVICE IS PAUSED"
GoSub do_theLines
End Select
'there are more members in the SERVICE_STATUS type
'check them out for additional useful info
Print "-------------------------------------------------"
GoSub do_theLines
Next
End If
'Close the service handle
Call CloseServiceHandle( lServiceManagerHandle )
End If
WaitKey$
Exit Function
do_theLines:
Incr lLinesPrinted
If lLinesPrinted >= ScreenY -2 Then
Print "--- MORE ---"
lLinesPrinted = 0
WaitKey$
End If
Return
End Function
Номер ответа: 7
Автор ответа:
alex
Вопросов: 84
Ответов: 453
Профиль | | #7
Добавлено: 13.01.06 14:34
И еще у меня вопрос. Можно ли программно остановить или убить службу, зная ее имя?
Номер ответа: 8
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #8
Добавлено: 13.01.06 15:35
можно
Номер ответа: 9
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #9
Добавлено: 13.01.06 16:18
shell "net stop имя_службы"
Номер ответа: 10
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #10
Добавлено: 13.01.06 16:26
invoke ControlService, hService, SERVICE_CONTROL_STOP, addr serv_status
Номер ответа: 11
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #11
Добавлено: 13.01.06 16:30
Только сначала надо
invoke OpenService, hManager, addr szServiceName, SERVICE_ALL_ACCESS