Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.036 c
4-1076307416
Ricko
2004-02-09 09:16
2004.04.18
Правильная выгрузка DLL


3-1079872042
Vilux
2004-03-21 15:27
2004.04.18
Ado и многопоточность


3-1079974397
Igoryok
2004-03-22 19:53
2004.04.18
Функция seek


1-1080654906
Kme
2004-03-30 17:55
2004.04.18
Проблемы с многозадачностью


3-1080022593
russko
2004-03-23 09:16
2004.04.18
Копирование БД





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский