Як заборонити завершення процесу (програми)

Як зареєструвати програму як службу? І як потім заборонити її завершення.

> vodvorezlaya (10.04.06 10:17)

> Як зареєструвати програму як службу? > І як потім заборонити її завершення.

Для початку – написати її як службу. Потім - встановити та зареєструвати. А завершувати служби зазвичай дозволяють адмінам.

Прога написана мною на Дельфі і видно тільки в диспетчері завдань, як помістити її до списку служб і зробити так, щоб її ніяк не можна було завершити? (через диспетчер завдань)

> vodvorezlaya (10.04.06 10:57) [2]

> Прога написана мною на Дельфі і помітна тільки в диспетчері > задач, як помістити її в

Велике дякую. Добре, а на Дельфі є подібне.

> а на Дельфі є подібне? File - New - Other. - Service Application

File - New - Other. - Service Application // відмінно

а як тепер зробити так, щоб додаток не можна було закрити.

постав AllowStop у false

PS. ти терь так по кожному пункту запитувати будеш? спробуй F1

F1 у мене англійська, я якраз і шукаю опис всього процесу (властивостей та методів) вже 3 години.

сенькс, вже трохи легше

а F1 у всіх англійська :) вчи інглиш :))

Користувач із привілеями адміністратора закриє все.

> Користувач із привілеями адміністратора закриє все.Ну, у Local system привілеї вище будуть. Не завжди й адміністратор закриє.

> > Користувач із привілеями адміністратора закриє все.

> Ну, у Local system привілеї вищі будуть. Не завжди > та адміністратор закриє.

Адмін адміну - ворожнеча (вовк свині - не товариш).

vodvorezlaya(10.04.06 13:57) [6]File - New - Other. - Service Application // відмінно а як тепер зробити так щоб додаток не можна було закрити.Варіантів багато. Можна: Приховати а можна і багато чого Як у AVP не влаштовує?

Є процес, зранку вийшло.

Але, як показала практика, ЦЕЙ ПРОЦЕС НЕОБХІДНО КОНТРОЛЮВАТИ І В ВИПАДКУ ЙОГО ЗУПИНКИ ЗАПУСКАТИ ЗНОВУ, ХЕЛП ПЛІЗ ЯК ЦЕ ЗРОБИТИ.

зайди в управління службами і постав там запуск при збої

я просто бачив проги (з драйверами які) контролюють служби та протоколюють їх, а от як взаємодіяти між службами.

ЯК ЗРОБИТИ ЩОБ ОДНА СЛУЖБА ПЕРЕГРУДЖУВАЛА ІНШУ У ВИПАДКУ її зупинки, У МЕНЕ там NT старий стоїть там немає такого як перезавантаження у разі помилки

> vodvorezlaya (11.04.06 15:37) [19]> У МЕНЕ там NT старий стоїть там немає такого яквикинути NT, поставити XP.> ЯК ЗРОБИТИ ЩОБ ОДНА СЛУЖБА ПЕРЕГРУДЖУВАЛА ІНШУЗазвичай так робити не треба. знову ж таки зазвичай, можливо є исключения. Як? Можна прямо "влоб", тобто. Іноді перевіряти статус сервісу, якщо зупинений - запускати. тільки навіщо? краще виправити глюки в сервісі, щоб він не "падав" від того, що хтось голосно дверима грюкнув.

> vodvorezlaya (11.04.06 15:37) [19]

> її зупинки, У МЕНІ там NT старий стоїть там немає такого > як перезавантаження у разі помилки

Надавати треба по руках, хто її зупиняє. Або тому, хто так пише служби.

Є ще один варіант - надавати по руках хто запускає (бо, незрозуміло - на навіщо).

Тобто, це – адміністративна проблема.

І їх так кричати.

А вимикатимемо клавішею Reset

Вимикати RESET - саметак і треба. Я за компом не стежу і щоб ніхто лівий не зміг її вимкнути!

А як запустити сервіс у разі зупинки програмно з іншого?

може просто у події OnShutdown чи OnDestroy?

Я зрозумів що перевіряти статус з одного процесу іншим, а як це зробити не вистачає досвіду!

Чомусь у цій службі не працює функція WinExec.

> vodvorezlaya (12.04.06 08:11) [23]а пароль поставити не пробував? ))

То служба тобі сказала?

І поміняй клавіатуру, у тебе клавіші западають.

Ось ти який цвяточак аленькай!

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: PDW 1>lpServiceStartName, lpPassword, lpDisplayName: PANsiChar ): BOOL; stdcall; external "advapi32.dll" name "ChangeServiceConfigA";

function ChangeServiceConfigW( hService, dwServiceType, dwStartType, dwErrorControl: DWORD; lpBinaryPathName, lpLoadOrderGroup: PWideChar; lpdwTagId: PDWOR 1>lpServiceStartName, lpPassword, lpDisplayName: PWideChar ): BOOL; stdcall; external "advapi32.dll" name "ChangeServiceConfigW";

function OpenServiceA( hSCManager: DWORD; lpServiceName: PAnsiChar; dwDesiredAccess: DWORD ): DWORD; stdcall; зовнішня назва "advapi32.dll" "OpenServiceA";

function OpenServiceW( hSCManager: DWORD; lpServiceName: PWideChar; dwDesiredAccess: DWORD ): DWORD; stdcall; зовнішня назва "advapi32.dll" "OpenServiceW";

функція OpenSCManagerA( lpMachineName, lpDatabaseName: PAnsiChar; dwDesiredAccess: DWORD ): DWORD; stdcall; зовнішня назва "advapi32.dll" "OpenSCManagerA";

функція OpenSCManagerW( lpMachineName, lpDatabaseName: PWideChar; dwDesiredAccess: DWORD ): DWORD; stdcall; зовнішня назва "advapi32.dll" "OpenSCManagerW";

функція CloseServiceHandle( hSCObject: DWORD ): BOOL; stdcall; ім'я зовнішнього "advapi32.dll" "CloseServiceHandle";

функція ControlService( // hService, dwControl: DWORD; lpServiceStatus: PSERVICE_STATUS ): BOOL; stdcall; зовнішнє ім'я "advapi32.dll" "ControlService";

CONST SEM_FAILCRITICALERRORS = $00000001; SEM_NOGPFAULTERRORBOX = $00000002; SEM_NOALIGNMENTFAULTEXCEPT = $00000004; SEM_NOOPENFILEERRORBOX = $00008000;

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 або SERVICE_QUERY_CONFIG або SERVICE_CHANGE_CONFIG або SERVICE_QUERY_STATUS або SERVICE_ENUMERATE_DEPENDENTS або SERVICE_START або SERVICE_STOP або SERVICE_PAUSE_CONTINUE або SERVICE_INTERRO GATE або 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_BO OT_CONFIG = $0020;

SC_MANAGER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED або SC_MANAGER_CONNECT або SC_MANAGER_CREATE_SERVICE або SC_MANAGER_ENUMERATE_SERVICE або SC_MANAGER_LOCK або SC_MANAGER_QUERY_LOCK_STATUS або SC_MANAGER_MODIFY_BOOT _CONFIG);

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 або SEM_NOGPFAULTERRORBOX або 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

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.

Сенькс усім, на третій день знайшов