Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

How Create a System Service [Install Service] (создать службу) [D6, D7, NT4, Win2k, WinXP]


H.A.Z.A.R.D. ©   (2004-11-17 14:46:00) 

Подскажите пожалуйста КОДдля моего SysMon'a. Мне необходимо, чтобы моя программа работала как сервис и юзеры не смогли ее просто так убить под Win2k/XP. Прога следит за хендлами кое-каких файлов и если находит их, то "глушит", причем с "похоронным маршем". В данным момент я использую AppToService.exe 2.7 для установки свой программки, но меня это не устраивает, я хочу по человечески написать инсталлятор, который делает мою прогу службой. Так сказать SysMonitor :). Извиняюсь если этот вопрос уже здесь писали, но нету времени искать...

Далее будут вопросы чтобы это был еще и сетевой ресурс (мне нужно собирать логи с машин каждый день, запускали ли юзеры запрещенные игрушки или нет), но это не самое важное пока...

ЗЫ. Работаю в ВУЗе Сис-Опом.


H.A.Z.A.R.D.   (2004-11-20 15:23:00) [1]

Aleks

я в курсах по поводу services.exe, но в таком случае apptoservice.exe круче! Даже под админовским аккаунтом неззя ее просто так убить (имеется в виду таскбар), только через управление или .... или..или..или. В общем понятон мне стало, что никто помочь не сможет. Лады, будем искать в др. месте.

Digitman, про орехи забудем, я сюда не прикалываться зашел, лучше дай линк на инфу по визардам, т.к. я в делфях сижу редко, но метко, в основном я сижу на internet приложениях (php,mysql,java, etc...). Вот. Поэтому тонкостей не знаю. Знаю вот, что, для создания сервиса средствами делфи необходимо создавать консольное приожение. Почему? Точнее, я немогу использовать консольное, у меня же форма с таймером и TClientSocket'ом, без них никак. В общем 2 дня голова болит, давно так в делфях не засиживался. Хотя какая разница, делфи не делфи, главное уметь! :)

ЗЫ?: есть у меня код для создания/удаление сервиса (WinAPI), но он не пашет, служба создается, но не запускается, в чем прикол не пойму. И что самое главное - время не ждет. H.A.Z.A.R.D. © Вот, ладно, скажите, в чем ошибка?
Где, что не правильно?

function CreateNTService(ExecutablePath, ServiceName: string): boolean;
var
 hNewService, hSCMgr: SC_HANDLE;
 // Rights: DWORD;
 FuncRetVal: Boolean;
begin
 FuncRetVal := False;
 hSCMgr := OpenSCManager(nil, nil, SC_MANAGER_CREATE_SERVICE);
 if (hSCMgr 0) then
 begin
   hNewService := CreateService(hSCMgr, PChar(ServiceName), PChar(ServiceName),
     STANDARD_RIGHTS_REQUIRED, SERVICE_WIN32_OWN_PROCESS,
     SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
     PChar(ExecutablePath), nil, nil, nil, nil, nil);
   CloseServiceHandle(hSCMgr);
   if (hNewService 0) then
     FuncRetVal := true
   else
     FuncRetVal := false;
 end;
 CreateNTService := FuncRetVal;
end;

// ***

function DeleteNTService(ServiceName: string): boolean;
var
 hServiceToDelete, hSCMgr: SC_HANDLE;
 RetVal: LongBool;
 FunctRetVal: Boolean;
begin
 FunctRetVal := false;
 hSCMgr := OpenSCManager(nil, nil, SC_MANAGER_CREATE_SERVICE);
 if (hSCMgr 0) then
 begin
   hServiceToDelete := OpenService(hSCMgr, PChar(ServiceName),
     SERVICE_ALL_ACCESS);
   RetVal := DeleteService(hServiceToDelete);
   CloseServiceHandle(hSCMgr);
   FunctRetVal := RetVal;
 end;
 DeleteNTService := FunctRetVal;
end;


(код не мой, и не знаю чей, но если бы знал, жалоб бы настрочил 2 страницы, ни комментов ни фига) Alekc 1. Я тебе кинул линк на пример, там тоже не слишком много комментов, но по крайней мере работает.

2. Код
hNewService := CreateService(hSCMgr, PChar(ServiceName), PChar(ServiceName),
    STANDARD_RIGHTS_REQUIRED, SERVICE_WIN32_OWN_PROCESS,
    SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
    PChar(ExecutablePath), nil, nil, nil, nil, nil);

создаёт сервис, но не запускает его. Смотри в справке ф-цию StartService (кажется). SERVICE_DEMAND_START- этот флаг говорит, что сервис должен запускаться вручную!


> Знаю вот, что, для создания сервиса средствами делфи необходимо
> создавать консольное приожение.

Кто тебе сказал такой бред ? H.A.Z.A.R.D. © Alekc

в том, примере, который я написал сервис вообще не запускается, ни руками, ни ногами! Автоматом тем более не хочет, явно чего-то в коде не хватает.

Насчет консоли, это в какой-то статье, но я и сам думаю, что это бред. sniknik © http://delphi.chertenok.ru/forum/my_download.php?tema=del&action=show&id=173
и запускается и стартует, разбирайся сам, писалось очень давно (гдето за полгода до того как туда выкладывалось) и больше этой темой не занимался, т.что разберешся хорошо, нет и не спрашивай ;о)). Xaker © sniknik ©   (22.11.04 11:46) [13]
классный там сервис - реально хорошо работает ! sniknik © Xaker ©   (22.11.04 11:47) [14]
спасибо. ;о))

там один небольшой "недостаток", если можно так сказать, тот поток в котором он работает на самом деле лишний, сервис и так стартует в отдельном, т.что смысла в нем нет. об этом и написано, что это просто пример (можно так, можно без него) но часто почемуто на это внимания не обращают а принимают как руководство к действию, типа так и должно быть. H.A.Z.A.R.D. © Спасибо тебе sniknik, рульную штуку дал.

Рульную потому, что она действительно рулит. К своему проекту еще не подцепил, но то что она функционирует на "отлично", это действительно так.
AppToService.exe, буржуйская, небесплатная, глючная программа. Глючная потому, что хоть и стоит как "Авто" - работает как "мать твою так". Глюк заключается (даже не глюк, а баг работающий как см.выше) в том, что если я сделаю выход из системы (текущий пользователь в системе к примеру Student), и зайду снова в систему, то моя программа зависящая от этого AppToService и сам AppToService уже не висит и не висят в процессах, т.е. они второй раз не запускаются, а только при старте Windows, значит никакие они не системные, а "косят под них".
Я пока не фтыкнул код сервиса в свою программу, но проверил, что хоть 20, хоть 30 раз входи и выходи из системы, данный сервис (в примере он обозвался как ApiServ.exe с заголовком "$ Нихрена пока не делает") работает как надо.

Все, большое всем спасибо господа ученые. Мне все помогли в какой-то мере.

Если хотите я могу написать что моя простая как сибирский валенок программа делает, могу даже исходник выложить, т.к. все банально просто. :)

(жалко, не успел увидеть, что там написали kaZaNoVa  & Вут:-)

[ps: баг у apptoservice увидел буквально пару минут назад, до этого внимания не обращал]

[pps: по существу прога нужна для того, чтобы мне зарплату не урезали, я ведь работаю системным оператором на 3 зала аж, студенты "умные" таскают из дома всякую фигню и на парах сидят играют, мне надоело каждому повторять, нужно чтобы они сами воочию видели, что играть тут нельзя. Теперь по характернуому
звуку можно определить, что студент запустил такую-то грушку :)) гыы]

{пример звукового сигнала, мне он понравился, писал я, поэтому материте если что меня :)}

function BeBeep(countsound:smallint):smallint;
var x:smallint;
begin
x:=0;
While (x


Alekc   (2004-11-18 18:40:00) [2]

Вот тут лежит заготовка для сервиса на чистом WinAPI:
http://alekc.nm.ru/xservice.zip

Но если ты хочешь чтобы твою прогу нельзя было убить из таск манагера, то просто назови её services.exe ;o)


Вут   (2004-11-18 18:06:00) [3]

Удалено модератором
Примечание: На хакерские сайты


Digitman   (2004-11-18 13:18:00) [4]


> H.A.Z.A.R.D. ©   (17.11.04 16:19) [1]
> Почитал про ваши орехи


и, чувствуется, так и хочешь угодить в ту рощу

иначе бы хотя бы сподобился объяснить, почему не используешь стандартный Делфи-визард по созданию сервис-приложений и, соотв-но, станд.класс TServiceApplication


H.A.Z.A.R.D.   (2004-11-18 08:11:00) [5]

VMcL

если ты реально писал сервисы, то у тебя должен быть кусок исходника, кинь плз на мыло.


VMcL   (2004-11-18 00:43:00) [6]

>> H.A.Z.A.R.D. ©  (17.11.04 14:46)

OpenSCManager(), CreateService(), CloseServiceHandle()


kaZaNoVa   (2004-11-17 23:48:00) [7]

Удалено модератором
Примечание: Offtopic


Cobalt   (2004-11-17 23:42:00) [8]

Насколько я читал про сервисы тут, между прочим, в форуме, запуск сервиса с параметром /install регистрирует сервис.
А вообще-то, рекомендуется в таких случаях использовать SCM - так, кажется, называется. В общем, служба(в смысле, API), управляющая сервисами.


H.A.Z.A.R.D.   (2004-11-17 16:19:00) [9]

Почитал про ваши орехи :), надеюсь моего message там не будет :)


Наверх

Титульная страница Поиск, карта сайта Написать письмо