Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.18;
Скачать: CL | DM;

Вниз

как получить список служб и их состояние?   Найти похожие ветки 

 
Lefan ©   (2004-01-29 08:46) [0]

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

sybj

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


 
y-soft ©   (2004-01-29 08:52) [1]

OpenSCManager
EnumServiceStatusEx
CloseServiceHandle

Подробности в SDK или MSDN


 
Lefan ©   (2004-01-29 09:19) [2]

Зделал так:

procedure TForm1.FormCreate(Sender: TObject);
var  schSCManager : SC_HANDLE;
begin
  schSCManager := OpenSCManager(
      NULL,                    // local machine
      NULL,                    // ServicesActive database
      SC_MANAGER_ALL_ACCES);  // full access rights

  if (schSCManager = 0)
      showMessage("OpenSCManager");
end;


не понимает SC_HANDLE, OpenSCManager, SC_MANAGER_ALL_ACCES
какой unit подключить?
в MSDN что-то не вижу...   :(


 
Lefan ©   (2004-01-29 09:24) [3]

вопрос отпал...  :)


 
Lefan ©   (2004-01-29 10:59) [4]

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

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

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


 
Digitman ©   (2004-01-29 11:22) [5]


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


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


 
Lefan ©   (2004-01-29 11:50) [6]


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...

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


 
Polevi ©   (2004-01-29 12:03) [7]

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;


 
Digitman ©   (2004-01-29 12:06) [8]


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


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

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


 
Polevi ©   (2004-01-29 12:13) [9]

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


 
Lefan ©   (2004-01-29 12:15) [10]

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

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


 
Digitman ©   (2004-01-29 12:19) [11]


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


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


 
Lefan ©   (2004-01-29 14:41) [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 15:01) [13]


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


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

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


 
Lefan ©   (2004-01-30 06:27) [14]

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

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

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


 
Lefan ©   (2004-01-30 06:41) [15]

еще проблема обнаружилась,
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:57) [16]

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

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

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


 
sniknik ©   (2004-01-30 08:21) [17]

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


 
Digitman ©   (2004-01-30 08:29) [18]


> 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-ф-ции, писана не для Пушкина ... а для тебя) ...


 
Lefan ©   (2004-01-30 08:35) [19]

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

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

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

var
hService : SC_HANDLE;


 
Digitman ©   (2004-01-30 08:43) [20]


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


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

SC_HANDLE hSCManager, // handle to service control manager database


 
Lefan ©   (2004-01-30 08:46) [21]

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


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

Извиняйте, если что не так, я хочу спать так что возможно не так понял вопрос, как я вкурил ты хочешь получить хэндл о процессах, если нет то функции всё равно хорошие, держи:
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;

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


 
DeadMeat ©   (2004-02-10 15:31) [23]

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



Страницы: 1 вся ветка

Текущий архив: 2004.04.18;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.05 c
1-1081000268
silya
2004-04-03 17:51
2004.04.18
Удаление/добавление строк в StringGrid


3-1079602120
Grant
2004-03-18 12:28
2004.04.18
Нетипизированные файлы


1-1081021925
Shopot
2004-04-03 23:52
2004.04.18
TImage.


8-1063264030
lex
2003-09-11 11:07
2004.04.18
Как создать Overlay Surfaces?


1-1080815133
snake1977
2004-04-01 14:25
2004.04.18
TStringGrid