Форум: "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.033 c