Як заборонити завершення процесу (програми)
Як зареєструвати програму як службу? І як потім заборонити її завершення.
> 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.
Сенькс усім, на третій день знайшов