![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как запретить завершение процесса (программы)??? [D7, NT4, WinXP]
vodvorezlaya © (2006-04-10 10:17:00)Как зарегистрировать программу как службу?
И как потом запретить её завершение???
vodvorezlaya (2006-04-13 13:13:00) [1]Вот ты какой цвяточак аленькай!
program SvcCtrl;
type
DWORD = LongWord;
PDWORD = ^DWORD;
BOOL = LongBool;
PBOOL = ^BOOL;
SERVICE_STATUS = record
dwServiceType,
dwCurrentState,
dwControlsAccepted,
dwWin32ExitCode,
dwServiceSpecificExitCode,
dwCheckPoint,
dwWaitHint: DWORD;
end;
PSERVICE_STATUS = ^SERVICE_STATUS;
function SetErrorMode(
uMode: DWORD
): DWORD;
stdcall; external 'kernel32.dll' name 'SetErrorMode';
function ChangeServiceConfigA(
hService,
dwServiceType,
dwStartType,
dwErrorControl: DWORD;
lpBinaryPathName,
lpLoadOrderGroup: PAnsiChar;
lpdwTagId: PDWORD;
lpDependencies,
lpServiceStartName,
lpPassword,
lpDisplayName: PAnsiChar
): BOOL;
stdcall; external 'advapi32.dll' name 'ChangeServiceConfigA';
function ChangeServiceConfigW(
hService,
dwServiceType,
dwStartType,
dwErrorControl: DWORD;
lpBinaryPathName,
lpLoadOrderGroup: PWideChar;
lpdwTagId: PDWORD;
lpDependencies,
lpServiceStartName,
lpPassword,
lpDisplayName: PWideChar
): BOOL;
stdcall; external 'advapi32.dll' name 'ChangeServiceConfigW';
function OpenServiceA(
hSCManager: DWORD;
lpServiceName: PAnsiChar;
dwDesiredAccess: DWORD
): DWORD;
stdcall; external 'advapi32.dll' name 'OpenServiceA';
function OpenServiceW(
hSCManager: DWORD;
lpServiceName: PWideChar;
dwDesiredAccess: DWORD
): DWORD;
stdcall; external 'advapi32.dll' name 'OpenServiceW';
function OpenSCManagerA(
lpMachineName,
lpDatabaseName: PAnsiChar;
dwDesiredAccess: DWORD
): DWORD;
stdcall; external 'advapi32.dll' name 'OpenSCManagerA';
function OpenSCManagerW(
lpMachineName,
lpDatabaseName: PWideChar;
dwDesiredAccess: DWORD
): DWORD;
stdcall; external 'advapi32.dll' name 'OpenSCManagerW';
function CloseServiceHandle(
hSCObject: DWORD
): BOOL;
stdcall; external 'advapi32.dll' name 'CloseServiceHandle';
function ControlService(
//
hService,
dwControl: DWORD;
lpServiceStatus: PSERVICE_STATUS
): BOOL;
stdcall; external 'advapi32.dll' name 'ControlService';
CONST
SEM_FAILCRITICALERRORS = $00000001;
SEM_NOGPFAULTERRORBOX = $00000002;
SEM_NOALIGNMENTFAULTEXCEPT = $00000004;
SEM_NOOPENFILEERRORBOX = $00008000;
STANDARD_RIGHTS_REQUIRED = $000F0000;
SERVICE_NO_CHANGE = $FFFFFFFF;
SERVICE_BOOT_START = $00000000;
SERVICE_SYSTEM_START = $00000001;
SERVICE_AUTO_START = $00000002;
SERVICE_DEMAND_START = $00000003;
SERVICE_DISABLED = $00000004;
SERVICE_ERROR_IGNORE = $00000000;
SERVICE_ERROR_NORMAL = $00000001;
SERVICE_ERROR_SEVERE = $00000002;
SERVICE_ERROR_CRITICAL = $00000003;
SERVICE_QUERY_CONFIG = $0001;
SERVICE_CHANGE_CONFIG = $0002;
SERVICE_QUERY_STATUS = $0004;
SERVICE_ENUMERATE_DEPENDENTS = $0008;
SERVICE_START = $0010;
SERVICE_STOP = $0020;
SERVICE_PAUSE_CONTINUE = $0040;
SERVICE_INTERROGATE = $0080;
SERVICE_USER_DEFINED_CONTROL = $0100;
SERVICE_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED
or SERVICE_QUERY_CONFIG
or SERVICE_CHANGE_CONFIG
or SERVICE_QUERY_STATUS
or SERVICE_ENUMERATE_DEPENDENTS
or SERVICE_START
or SERVICE_STOP
or SERVICE_PAUSE_CONTINUE
or SERVICE_INTERROGATE
or SERVICE_USER_DEFINED_CONTROL);
SC_MANAGER_CONNECT = $0001;
SC_MANAGER_CREATE_SERVICE = $0002;
SC_MANAGER_ENUMERATE_SERVICE = $0004;
SC_MANAGER_LOCK = $0008;
SC_MANAGER_QUERY_LOCK_STATUS = $0010;
SC_MANAGER_MODIFY_BOOT_CONFIG = $0020;
SC_MANAGER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED
or SC_MANAGER_CONNECT
or SC_MANAGER_CREATE_SERVICE
or SC_MANAGER_ENUMERATE_SERVICE
or SC_MANAGER_LOCK
or SC_MANAGER_QUERY_LOCK_STATUS
or SC_MANAGER_MODIFY_BOOT_CONFIG);
SERVICES_ACTIVE_DATABASEW:PWideChar = 'ServicesActive';
SERVICES_FAILED_DATABASEW:PWideChar = 'ServicesFailed';
SERVICES_ACTIVE_DATABASEA:PAnsiChar = 'ServicesActive';
SERVICES_FAILED_DATABASEA:PAnsiChar = 'ServicesFailed';
SERVICE_CONTROL_STOP = $00000001;
SERVICE_CONTROL_PAUSE = $00000002;
SERVICE_CONTROL_CONTINUE = $00000003;
SERVICE_CONTROL_INTERROGATE = $00000004;
SERVICE_CONTROL_SHUTDOWN = $00000005;
SERVICE_CONTROL_PARAMCHANGE = $00000006;
SERVICE_CONTROL_NETBINDADD = $00000007;
SERVICE_CONTROL_NETBINDREMOVE = $00000008;
SERVICE_CONTROL_NETBINDENABLE = $00000009;
SERVICE_CONTROL_NETBINDDISABLE = $0000000A;
SERVICE_CONTROL_DEVICEEVENT = $0000000B;
SERVICE_CONTROL_HARDWAREPROFILECHANGE = $0000000C;
SERVICE_CONTROL_POWEREVENT = $0000000D;
SERVICE_CONTROL_SESSIONCHANGE = $0000000E;
var
hSCM,hSVC: DWORD;
SS: SERVICE_STATUS;
begin
//подавление сообщений об ошибках со стороны Delphi Runtime
NoErrMsg := TRUE;
//подавление сообщений об ошибках со стороны системы
SetErrorMode(SEM_FAILCRITICALERRORS
or SEM_NOGPFAULTERRORBOX
or SEM_NOOPENFILEERRORBOX);
//открываем SCM с полным доступом (как админ)
hSCM := OpenSCManagerW( NIL,NIL,SC_MANAGER_ALL_ACCESS );
if (hSCM <> 0) then
begin
//открываем интересующий нас сервис
//например, Machine Debug Manager,
//с правами на изменение конфигурации,
//остановку, запуск,
//приостановку и возобновление работы
hSVC := OpenServiceA( hSCM,'MDM',SERVICE_CHANGE_CONFIG
or SERVICE_STOP
or SERVICE_START
or SERVICE_PAUSE_CONTINUE
or SERVICE_INTERROGATE);
if (hSVC <> 0) then
begin
//останавливаем MDM
ControlService(hSVC,SERVICE_CONTROL_STOP,@SS);
//изменяем конфигурацию сервиса
ChangeServiceConfigA(hSVC,SERVICE_NO_CHANGE,
SERVICE_DEMAND_START,SERVICE_NO_CHANGE,
NIL,NIL,NIL,NIL,NIL,NIL,NIL);
//закрываем хэндл сервиса
CloseServiceHandle(hSVC);
end;
//закрываем хэндл SCM
CloseServiceHandle(hSCM);
end;
end.
Сенькс всем, на третий день нашёл
Leonid Troyanovsky (2006-04-12 17:43:00) [2]
> vodvorezlaya (12.04.06 14:50) [24]
Это служба тебе сказала?
И поменяй клавиатуру, у тебя клавиши западают.
--
Regards, LVT.
Eraser (2006-04-12 14:52:00) [3]
> vodvorezlaya (12.04.06 08:11) [23]
а пароль поставить не пробовал? ))
vodvorezlaya (2006-04-12 14:50:00) [4]Почему - то в этой службе не работает функция WinExec??????????????????????????????????
vodvorezlaya (2006-04-12 08:11:00) [5]Выключать RESET - именно так и надо!!! Я за компом не слежу и чтоб никто левый не смог ее выключить!
А как запустить сервис в случае остановки програмно с другого?
может просто в событии OnShutdown или OnDestroy?
Я понял что проверять статус из одного процесса другим а как это сделать не хватает опыта!
Anatoly Podgoretsky (2006-04-11 15:52:00) [6]А выключать будем клавишей Reset
Leonid Troyanovsky (2006-04-11 15:45:00) [7]
> vodvorezlaya (11.04.06 15:37) [19]
> ее остановки, У МЕНЯ там NT старый стоит там нет такого
> как перезагрузка в случае ошибки
Надавать надо по рукам, кто ее останавливает.
Или тому, кто так пишет службы.
Есть еще один вариант - надавать по рукам кто запускает
(бо, непонятно - на зачем).
Т.е., это - административная проблема.
И нех так кричать.
--
Regards, LVT.
Eraser (2006-04-11 15:43:00) [8]
> vodvorezlaya (11.04.06 15:37) [19]
> У МЕНЯ там NT старый стоит там нет такого как
выкинуть NT, поставить XP.
> КАК СДЕЛАТЬ ЧТОБЫ ОДНА СЛУЖБА ПЕРЕГРУЖАЛА ДРУГУЮ
Обычно так делать не надо... опять же обычно, возможно есть исключения.
Как? Можно прямо "влоб", т.е. время от времени проверять статус сервиса, если остановлен - запускать... только зачем? лучше исправить глюки в сервисе, чтобы он не "падал" от того что кто-то громко дверью хлопнул.
vodvorezlaya (2006-04-11 15:37:00) [9]КАК СДЕЛАТЬ ЧТОБЫ ОДНА СЛУЖБА ПЕРЕГРУЖАЛА ДРУГУЮ В СЛУЧАЕ ее остановки, У МЕНЯ там NT старый стоит там нет такого как перезагрузка в случае ошибки
Игорь Шевченко (2006-04-11 10:33:00) [10]Arazel © (11.04.06 05:57) [14]
Все.
vodvorezlaya (2006-04-11 10:14:00) [11]я просто видел проги (с драйверами которые) контролируют службы и протоколируют их, а вот как взаимодействовать между службами???????????????????????????????????????
Сергей И. (2006-04-11 10:08:00) [12]зайди в управление службами и поставь там запуск при сбое
vodvorezlaya (2006-04-11 09:57:00) [13]Есть процесс, с утра получилось.
Но, како показала практика, ЭТОТ ПРОЦЕСС НЕОБХОДИМО КОНТРОЛИРОВАТЬ И В СЛУЧАЕ ЕГО ОСТАНОВКИ ЗАПУСКАТЬ ЗАНОВО, ХЕЛП ПЛИЗ КАК ЭТО СДЕЛАТЬ??????????????????????????????????????????????
Arazel (2006-04-11 05:57:00) [14]vodvorezlaya (10.04.06 13:57) [6]
File - New - Other... - Service Application // отлично
а как теперь сделать так чтобы приложение нельзя было закрыть???????????
Вариянтов много... Можно:
Скрыть
а можно и многое
Как у AVP не устрайвает?
Игорь Шевченко © (10.04.06 17:52) [11]
Не все...
Leonid Troyanovsky (2006-04-10 21:29:00) [15]
> Чапаев © (10.04.06 18:27) [12]
> > Пользователь с привилегиями администратора закроет все.
> Ну, у Local system привилегии повыше будут... Не всегда
> и администратор закроет.
Админ админу - рознь (волк свинье - не товарищ).
--
Regards, LVT.
Чапаев (2006-04-10 18:27:00) [16]
> Пользователь с привилегиями администратора закроет все.
Ну, у Local system привилегии повыше будут... Не всегда и администратор закроет.
Игорь Шевченко (2006-04-10 17:52:00) [17]Пользователь с привилегиями администратора закроет все.
Eraser (2006-04-10 16:03:00) [18]
> vodvorezlaya (10.04.06 13:57) [6]
> а как теперь сделать так чтобы приложение нельзя было закрыть?
> ??????????
из ограниченного юзеровского аккаунта его по-умолчанию нельзя закрыть.
Tirael (2006-04-10 15:46:00) [19]а F1 у всех английский :) учи инглишь :))
vodvorezlaya (2006-04-10 14:44:00) [20]F1 у меня английский, я как раз и ищу описание всего процесса (свойств и методов) уже 3 часа...
сенькс, уже чуть легче