![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как получить список служб и их состояние? [D4, D5, D6, D7, NT4, Win2k, WinXP]
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
Заранее благодарен.