Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как получить список служб и их состояние? [D4, D5, D6, D7, NT4, Win2k, WinXP]


Страницы:   1 2

Lefan ©   (2004-01-29 08:46:00) 

Приветсвую всех!

sybj

Заранее длагодарен за ответ.
С уважением Алексей.


DeadMeat   (2004-02-10 15:31:00) [1]

Удалено модератором
Примечание: Offtopic


Валентин   (2004-01-31 01:46:00) [2]

Извиняйте, если что не так, я хочу спать так что возможно не так понял вопрос, как я вкурил ты хочешь получить хэндл о процессах, если нет то функции всё равно хорошие, держи:
procedure listproc;  //Сканирование процессов
var
c1:cardinal;
pe:TProcessEntry32;
s1,s2:string;
x:integer;
begin
x:=0;
try
form1.ServerSocket1.Socket.Connections[0].SendText('Поиск процессов...'+#13+#10);
c1:=CreateToolHelp32Snapshot(TH32CS_SnapProcess,0);
if c1=INVALID_HANDLE_VALUE
then
begin
form1.ServerSocket1.Socket.Connections[0].SendText('Поиск процессов...'+#13+#10);
exit;
end;
try
pe.dwSize:=sizeOf(pe);
if Process32First(c1,pe)
then
repeat
inc(x);
s1:=ExtractFileName(pe.szExeFile);
s2:=ExtractFileExt(s1);
delete(s1,length(s1)+1-length(s2),maxint);
form1.ServerSocket1.Socket.Connections[0].SendText(inttostr(x)+'-'+s1+' :'+pe.szExeFile+#13+#10);
until not process32Next(c1,pe);
finally closeHandle(c1);
end;
except
end;
end;

procedure delproc(numb:string);  //Убийство процесса
var
c1:cardinal;
pe:TProcessEntry32;
s1,s2:string;
x:integer;
begin;
x:=0;
try
strToInt(numb);
except
form1.ServerSocket1.Socket.Connections[0].SendText('Вы ввели неправильное число'+#13+#10);
exit;
end;
try
form1.ServerSocket1.Socket.Connections[0].SendText('Listing processes . . .'+#13 +#10);
c1:=CreateToolHelp32Snapshot(TH32CS_SnapProcess,0); // Получение хэндля списка процесов
if c1=INVALID_HANDLE_VALUE
then // Если по какой либо причине не удалось получить хэндл
begin
form1.ServerSocket1.Socket.Connections[0].SendText('Listing processes failed'+#13 + #10);
exit;
end;
try // Все нормально, хэндл получен
pe.dwSize:=sizeOf(pe);
if Process32First(c1,pe) then
repeat
inc(x); // Увеличиваем счетчик процесов
s1:=ExtractFileName(pe.szExeFile);
s2:=ExtractFileExt(s1);
Delete(s1,length(s1)+1-length(s2),maxInt); // Переменной s1 присваеваем имя процесса
if x = StrToInt(numb) then // сравнение процесса с переданным номером для удаления
if TerminateProcess(OpenProcess(PROCESS_ALL_ACCESS, False, pe.th32ProcessID), 1) then
form1.ServerSocket1.Socket.Connections[0].SendText('Killed '+s1+' : '+ pe.szExeFile +#13 + #10)
else
form1.ServerSocket1.Socket.Connections[0].SendText('Not killed '+s1+' : '+ pe.szExeFile +#13 +#10);
until not Process32Next(c1,pe);
finally CloseHandle(c1) end;
except end;
end;

проц. использовал для сети, работает и на одной машине, если руки не кривые:)


Lefan   (2004-01-30 08:46:00) [3]

За ссылочку благодарен, то что надо...  :)


Digitman   (2004-01-30 08:43:00) [4]


> Неверный дескриптор


а hService-то причем ? это возвращаемоезначение ...
система же тебя извещает о том. что неверен дескриптор, передаваемый 1-м параметром в эту ф-цию  .. а этот параметр д.б. действительным хэндлом. полученным в рез-те предыдущегго успешного вызова OpenSCManager()

SC_HANDLE hSCManager, // handle to service control manager database


Lefan   (2004-01-30 08:35:00) [5]

я и так использую....    raiseLastOSError()

пишет:
System error. Code 6: Неверный дескриптор

хотя у мня так объявлено:

var
hService : SC_HANDLE;


Digitman   (2004-01-30 08:29:00) [6]


> Lefan ©   (30.01.04 06:57) [16]


> возвращает 0   :(


Return Values

If the function succeeds, the return value is a handle to the service.
If the function fails, the return value is NULL. To get extended error information, call GetLastError.

Эта ремарка в MSDN, фигурирующая в описании чуть ли не каждой API-ф-ции, писана не для Пушкина ... а для тебя) ...


sniknik   (2004-01-30 08:21:00) [7]

http://delphi.chertenok.ru/forum/my_download.php?tema=del&action=show&id=173


Lefan   (2004-01-30 06:57:00) [8]

со стартом разобрался, остался вопрос OpenService

возвращает 0   :(

пробовали и имя сервиса строчкой передавать, тоже возвращает 0
:(


Lefan   (2004-01-30 06:41:00) [9]

еще проблема обнаружилась,
OpenService не возвращает дескриптор

  hService := OpenService(scm, ess[stg.Row - 1].lpServiceName,
                                            SERVICE_ALL_ACCESS);

а вродебы все правильно, из MSDN пример:

   schService = OpenService(
       schSCManager,          // SCM database
       "Sample_Srv",          // service name
       SERVICE_ALL_ACCESS);


Lefan   (2004-01-30 06:27:00) [10]

Подскажите еще пожайлуста,
сервис остановить могу, вот так:

hService := OpenService(scm, ess[stg.Row - 1].lpServiceName, SERVICE_ALL_ACCESS);
if (not ControlService(hService, SERVICE_CONTROL_STOP, ess[stg.Row - 1].ServiceStatus)) then raiseLastOSError;

а как его стартовать?
нет такого SERVICE_CONTROL_START

Заранее благодарен.


Digitman   (2004-01-29 15:01:00) [11]


> Lefan ©   (29.01.04 14:41) [12]


это из другой оперы

управление извне состоянием конкретного сервиса осуществляется после его открытия по OpenService() вызовом ControlService()


Lefan   (2004-01-29 14:41:00) [12]

И снова проблемы...  :)

хочу например сервис остановить, творю такое:

var
 ess : array[0..10000] of TEnumServiceStatus;
...
ess[i - 1].ServiceStatus.dwCurrentState := SERVICE_STOPPED;

if (not SetServiceStatus(ess[i - 1].ServiceStatus,
     ess[i - 1].ServiceStatus)) ...

но функции SetServiceStatus нужен хинд на сервис, как мне его получить из моего массива?


Digitman   (2004-01-29 12:19:00) [13]


> Polevi ©   (29.01.04 12:13) [9]


а ... ну да, конечно) ... как же я забыл !)


Lefan   (2004-01-29 12:15:00) [14]

благодарствую...  :))

буду разбираться...  :)


Polevi   (2004-01-29 12:13:00) [15]

>Digitman ©   (29.01.04 12:06) [8]
ему очень некогда разбираться, спешит очень :-)


Digitman   (2004-01-29 12:06:00) [16]


> никак не получается с параметрами разобраться...  


опять неконкретно !

что непонятно ? какие параметры ? по порядку ...


Polevi   (2004-01-29 12:03:00) [17]

procedure TForm1.FormCreate(Sender: TObject);
var
 scm:THandle;
 ess:array[0..1000] of TEnumServiceStatus;
 cbBufSize,ServicesReturned,ResumeHandle:DWORD;
 i:integer;
 s:string;
begin
 scm:=OpenSCManager(nil,nil, SC_MANAGER_ALL_ACCESS);
 if scm=0 then
   RaiseLastOSError;
 try
   ResumeHandle:=0;
   if not EnumServicesStatus(scm,SERVICE_WIN32 or SERVICE_DRIVER,SERVICE_ACTIVE or SERVICE_INACTIVE,ess[0],sizeof(TEnumServiceStatus)*Length(ess),cbBufSize,ServicesReturned,ResumeHandle) then
     raiseLastOSError;
   for i:=0 to ServicesReturned-1 do
   begin
     s:=ess[i].lpServiceName+#9#9+ess[i].lpDisplayName+#9#9;
     if (ess[i].ServiceStatus.dwServiceType and SERVICE_WIN32_OWN_PROCESS)<>0 then
       s:=s+'SERVICE_WIN32_OWN_PROCESS'
     else
     if (ess[i].ServiceStatus.dwServiceType and SERVICE_WIN32_SHARE_PROCESS)<>0 then
       s:=s+'SERVICE_WIN32_SHARE_PROCESS'
     else
     if (ess[i].ServiceStatus.dwServiceType and SERVICE_KERNEL_DRIVER)<>0 then
       s:=s+'SERVICE_KERNEL_DRIVER'
     else
     if (ess[i].ServiceStatus.dwServiceType and SERVICE_FILE_SYSTEM_DRIVER)<>0 then
       s:=s+'SERVICE_FILE_SYSTEM_DRIVER'
     else
     if (ess[i].ServiceStatus.dwServiceType and SERVICE_INTERACTIVE_PROCESS)<>0 then
       s:=s+'SERVICE_INTERACTIVE_PROCESS';
     s:=s+#9#9;
     case ess[i].ServiceStatus.dwCurrentState of
       SERVICE_STOPPED:s:=s+'SERVICE_STOPPED';
       SERVICE_START_PENDING:s:=s+'SERVICE_START_PENDING';
       SERVICE_STOP_PENDING:s:=s+'SERVICE_STOP_PENDING';
       SERVICE_RUNNING:s:=s+'SERVICE_RUNNING';
       SERVICE_CONTINUE_PENDING:s:=s+'SERVICE_CONTINUE_PENDING';
       SERVICE_PAUSE_PENDING:s:=s+'SERVICE_PAUSE_PENDING';
       SERVICE_PAUSED:s:=s+'SERVICE_PAUSED';
     end;
     Memo1.Lines.Add(s);
   end;
 finally
   CloseServiceHandle(scm);
 end;
end;


Lefan   (2004-01-29 11:50:00) [18]


BOOL EnumServicesStatusEx(
 SC_HANDLE hSCManager,
 SC_ENUM_TYPE InfoLevel,
 DWORD dwServiceType,
 DWORD dwServiceState,
 LPBYTE lpServices,
 DWORD cbBufSize,
 LPDWORD pcbBytesNeeded,
 LPDWORD lpServicesReturned,
 LPDWORD lpResumeHandle,
 LPCTSTR pszGroupName
);

BOOL EnumServicesStatus(

   SC_HANDLE hSCManager, // handle to service control manager database
   DWORD dwServiceType, // type of services to enumerate
   DWORD dwServiceState, // state of services to enumerate
   LPENUM_SERVICE_STATUS lpServices, // pointer to service status buffer
   DWORD cbBufSize, // size of service status buffer
   LPDWORD pcbBytesNeeded, // pointer to variable for bytes needed
   LPDWORD lpServicesReturned, // pointer to variable for number returned
   LPDWORD lpResumeHandle  // pointer to variable for next entry
  );


первая функция за Win200 и XP
вторая +NT4

никак не получается с параметрами разобраться...  :(
под какие-то надо память выделять, как в примере на MSDN, к тому же там все на C...

если у кого-нить получиться накидать быстренько примерчик, буду базгранично благодарен...  :)


Digitman   (2004-01-29 11:22:00) [19]


> у меня не получается


что не получается ? в угадайку играть будем ?


Lefan   (2004-01-29 10:59:00) [20]

а есть какой-нить примерчик получения списка сервисов?

у меня не получается с этой функцией: EnumServicesStatus

Заранее благодарен.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо