Перечисление слжб

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Me!
Новичок
Новичок
 
Сообщения: 35
Зарегистрирован: 05.08.2007 (Вс) 21:35

Перечисление слжб

Сообщение Me! » 06.08.2007 (Пн) 16:27

Здравстуйте, уважаемые гуру VB!
Прошу разъяснить мне в чём я ошибаюсь при перечислении активных служб:
Код: Выделить всё
Public Function EnumSystemServices(ctl As Control) As Long
Dim hSCManager As Long, pntr() As ENUM_SERVICE_STATUS, cbBuffSize As Long, cbRequired As Long, dwReturned As Long, hEnumResume As Long, cbBuffer As Long, success As Long, i As Long, sSvcName As String, sDispName As String, dwState As Long, dwType As Long, dwCtrls As Long
hSCManager = OpenSCManager(vbNullString, vbNullString, SC_MANAGER_ALL_ACCESS)
If hSCManager <> 0 Then
  success = EnumServicesStatusExA(hSCManager, 0, &H30, 1, ByVal 0, &H0, cbRequired, dwReturned, hEnumResume, 0)
  If success = 0 Then
   cbBuffer = (cbRequired \ SIZEOF_SERVICE_STATUS) + 1
   ReDim pntr(0 To cbBuffer)
   cbBuffSize = cbBuffer * SIZEOF_SERVICE_STATUS
   hEnumResume = 0
   If EnumServicesStatusExA(hSCManager, 0, &H30, 1, pntr(0), cbBuffSize, cbRequired, dwReturned, hEnumResume, 0) Then
    With ctl
     .Clear
     For i = 0 To dwReturned - 1
       sDispName = GetStrFromPtrA(ByVal pntr(i).lpDisplayName)
      .AddItem sDispName
     Next
    End With
   End If
  End If
End If
Call CloseServiceHandle(hSCManager)
EnumSystemServices = dwReturned
End Function
возвращает неполный список, в то время как использование EnumServicesStatus позволяет получить полный список активных служб, но её я использовать не могу, т.к. нужно определять процесс, запустивший службу.

заранее СПАСИБО!

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 07.08.2007 (Вт) 9:26

Так не устроит:

Код: Выделить всё
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_Service",,48)
For Each objItem in colItems
    Wscript.Echo "-----------------------------------"
    Wscript.Echo "Win32_Service instance"
    Wscript.Echo "-----------------------------------"
    Wscript.Echo "Description: " & objItem.Description
    Wscript.Echo "DisplayName: " & objItem.DisplayName
    Wscript.Echo "PathName: " & objItem.PathName
    Wscript.Echo "ProcessId: " & objItem.ProcessId
Next
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Me!
Новичок
Новичок
 
Сообщения: 35
Зарегистрирован: 05.08.2007 (Вс) 21:35

Сообщение Me! » 07.08.2007 (Вт) 11:54

спасибо за ответ
но не устроит, WMI использовать не могу

ЗЫ: пример аналогичный приведённому в первом посте, но написанный на си - работает верно.

Надеюсь на вашу помощь.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 07.08.2007 (Вт) 12:11

Добавь к каждому If EnumServicesStatusExA блок Else. Возможно для некоторых служб у тебя прав не хватает (тем более ты открываешь SC_MANAGER_ALL_ACCESS).
Lasciate ogni speranza, voi ch'entrate.

Me!
Новичок
Новичок
 
Сообщения: 35
Зарегистрирован: 05.08.2007 (Вс) 21:35

Сообщение Me! » 07.08.2007 (Вт) 12:38

пробовал открывать только с SC_MANAGER_ENUMERATE_SERVICE,
привилегии пробовал подключать - ноль на массу!

EnumServicesStatus (без Ex) в аналогичном примере заполняет буфер полным списком.

Me!
Новичок
Новичок
 
Сообщения: 35
Зарегистрирован: 05.08.2007 (Вс) 21:35

Сообщение Me! » 07.08.2007 (Вт) 12:45

Если это может помочь, вот пример на си, который работает верно:
Код: Выделить всё
void GetServicesForProc(DWORD dwPID)
{
ENUM_SERVICE_STATUS_PROCESSA *lpServiceStatus;
DWORD   dwSize=0,
   dwNumServices=0,
   dwResumeHandle=0,
   dwCount;
SC_HANDLE scHandle=NULL;
int iRet;
void *Buffer=NULL;
scHandle=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
iRet=EnumServicesStatusExA( scHandle,0,0x00000030,1,(LPBYTE)Buffer,0,&dwSize,&dwNumServices,&dwResumeHandle,0);
Buffer=malloc(dwSize);
dwResumeHandle=0;
  iRet=EnumServicesStatusExA( scHandle,0,0x00000030,1,(LPBYTE)Buffer,dwSize,&dwSize,&dwNumServices,&dwResumeHandle,0);
lpServiceStatus=(ENUM_SERVICE_STATUS_PROCESSA *)Buffer;
for (dwCount=0;dwCount<dwNumServices;dwCount++)
  if (lpServiceStatus[dwCount].ServiceStatusProcess.dwProcessId == dwPID) {
//   lpServiceStatus[dwCount].lpServiceName
  }
CloseServiceHandle(scHandle);
if (Buffer) free(Buffer);
return;
}
Последний раз редактировалось Me! 07.08.2007 (Вт) 14:15, всего редактировалось 1 раз.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 07.08.2007 (Вт) 12:56

Ну и зачем там try?
Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 07.08.2007 (Вт) 13:00

Попробуй с вот этим кирпичом посмотреть, а для опроса использовать QueryServiceStatusEx.
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 07.08.2007 (Вт) 13:20

Можно попробовать здесь глянуть (я сам не смотрел):

http://www.planet-source-code.com/vb/sc ... 2&lngWId=1
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Me!
Новичок
Новичок
 
Сообщения: 35
Зарегистрирован: 05.08.2007 (Вс) 21:35

Сообщение Me! » 07.08.2007 (Вт) 13:50

Andrey Fedorov
alibek
СПАСИБО!
в кирпичике есть интересные моменты
а пример файерволла, к сожалению, ничем помог.

Ну и зачем там try?

остался после экспериментов. подправил


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 96

    TopList