Имя: Пароль:
IT
Админ
Кто сталкивался с написанием служб виндовс?
0 Jump
 
03.05.12
09:33
В общем нужно написать простенькую службу чтобы крутилась в памяти и запускала консольную программу по таймеру.
Что то нифига не получается в студии сделать это, вроде пустую написал установить не могу.
Может кто пнет в нужном направлении.
1 zak555
 
03.05.12
09:33
планировщик не предлагать ?
2 Cube
 
03.05.12
09:34
(1) +1
3 Shurjk
 
03.05.12
09:34
для начала было бы неплохо понять что вы понимаете под службой.
4 ЧеловекДуши
 
03.05.12
09:35
Я, и что там сложного?
5 ЧеловекДуши
 
03.05.12
09:35
+ ДелпХи 6 и выше уже имеют встроенную компоненту ;)
6 Kandellaster
 
03.05.12
09:36
7 Kandellaster
 
03.05.12
09:37
а вот и на православном борланде http://cppbuilder.ru/articles/0186.php
8 Jump
 
03.05.12
09:38
(5)Ну в дельфях я никак, там поверхностно VB, перл.
(1)Сейчас как раз все так и работает - запускает планировщик.
В принципе все устраивает, только вот как настроить планировщик программно тогда? Ну чтобы клиент тыкал "далее" и у него появилось запланированное задание.
9 manyak
 
03.05.12
09:48
10 пипец
 
03.05.12
09:49
докучи xstarter
11 Jump
 
03.05.12
09:51
(9)Во! То что надо! Спасибо!
12 Jump
 
03.05.12
09:59
(10)Тоже хорошая штука, только непонятно можно ли ее запускать без интерфейса в трее.
Мне не желательно чтобы пользователь сам там тыкал кнопочки.
13 andrewalexk
 
03.05.12
09:59
(0) :) все кто сталкивался с написанием служб виндоус находятся на microsoft.com
14 Зеленый Кот
 
03.05.12
10:01
delphi
15 Nikitas
 
03.05.12
10:46
ставишь nnCron и будет тебе счастье.. настраиваешь как хочешь
16 Жан Пердежон
 
03.05.12
10:54
удаляешь кроны нафиг, пишешь в консоле
at /?
и будет тебе счастье
17 Jump
 
03.05.12
11:11
(16)А как это засунуть в инсталлятор? и at /? не работает если у пользователя нет пароля.

Мне то что надо - я отдаю пользователю файл setup.exe, тот его запускает, и все у него с этого момента запускаются задачи по таймеру. Т.е вариант с объяснением пользователю чего там куда писать в консоле, чтобы у него заработало не катит, как и заставлять его создавать пароль на учетную запись в винде.
18 Jump
 
03.05.12
11:12
(15)А он умеет работать чисто в виде сервиса? Без пользовательского интерфейса?
19 Nikitas
 
03.05.12
11:38
nnCron - умеет много чего, и ввиде сервиса. на нем свои скрипты писать можно
20 Жан Пердежон
 
03.05.12
11:44
(17) ну извини, на столько телепатию еще не прокачал
21 Жан Пердежон
 
03.05.12
11:46
(17) какой пароль, зачем писать в консоле? ты прог или кто?)
22 izekia
 
03.05.12
11:49
(0) интересно, а что консольная программа делает?
23 Cube
 
03.05.12
11:50
(22) Крадет пароли, чо тут не понятного)
24 izekia
 
03.05.12
11:54
(23) консольных шпионов куча
25 izekia
 
03.05.12
11:54
(24) клавиатурных*
26 ЧеловекДуши
 
03.05.12
11:55
(8)Там нечего знать не надо, кромя парочки команд, первичных знаний о синтаксисе и написания кода, он кстати на подобие "Паскаля".
Компонента там организована на уровне кнопок, т.е. все делается кнопками и галочками.
Все что нужно будет это прописать команду вызова другой программы.
Но в инете и этого навалом :)
27 mistеr
 
03.05.12
11:58
(17) Попробуй угадать, а твоя самописная служба будет работать, если у пользователя нет пароля?

То же самое и с nnCron.
28 ЧеловекДуши
 
03.05.12
11:58
+ если заинтересуешься, то после компиляции нужно инсталировать службу:

"Твой екзе файл службы.EXE -INSTALL"
"Твой екзе файл службы.EXE -UNINSTALL"
29 ковер
 
03.05.12
12:00
(28) службы нужно писать на Си
30 izekia
 
03.05.12
12:01
(29) на асме-то кошернее будет)
31 ковер
 
03.05.12
12:02
(30) то ты слишком глубоко копнул - ты еще скажи в бинарном формате ее написать :)
32 ковер
 
03.05.12
12:09
(0) лови  статью, в ней даже болванки есть для написания собственной службы

http://www.rsdn.ru/article/baseserv/services.xml
33 FN
 
03.05.12
12:14
(17) делаешь "инсталятор" setup.cmd
в нем пишешь:
at 12:00 /every:monday defrag.exe
и вуаля - все как ты хотел - одним кликом для пользователя...
34 Rebelx
 
03.05.12
12:29
(33)есть маленькая проблема - если у пользователя нет пароля, то будет работать только при выполненном входе
35 Rebelx
 
03.05.12
12:31
+(34) с другой стороны можно создать специального пользователя для этого задания ( net user /? )
36 ковер
 
03.05.12
13:25
(34) под другой учеткой можно делать
37 Jump
 
03.05.12
13:36
(27)"Попробуй угадать, а твоя самописная служба будет работать, если у пользователя нет пароля?" - конечно будет, она будет работать даже если в системе  нет пользователей, а уж есть у каких-то пользователей пароль или нет ей до лампочки.
38 Jump
 
03.05.12
13:38
(29)А я думал их надо писать на чем умеешь :)
39 Rebelx
 
03.05.12
13:41
(37) тут ты не совсем прав. Служба может быть запущена от имени пользователя Локальная служба или Сетевая служба. От имени других пользователей - только при наличии пароля.
40 Jump
 
03.05.12
13:48
(39)Служба работает под системной учетной записью, т.е она загружается раньше чем появляется окно входа в систему.
Естественно потом при желании можно залогиниться и под пользователем.
41 Jump
 
03.05.12
13:54
В общем cronNT под семеркой работать не желает.
Пока остановился на xstarter.
42 vcv
 
03.05.12
13:59
Простую консольную утилиту можно запускать любым планировщиком. Штатным или сторонним.
Если обязательно хочется сервис, почти произвольную программу можно сделать сервисом с помощью srvany.
43 Torquader
 
03.05.12
23:10
(39) служба может запускаться от имени системы или под любой другой учётной записью - всё это указывается при вызове CreateService.
Собственно,и запускаться она может или при загрузке или при входе пользователя - если поставить взаимодействие с рабочим столом.
Я писал запуск командной строки под системной учётной записью - только надо искать - где это валяется - идея была - копировать диск,но системный профиль просто блокируется и наличие системной учётной записи не помогло.
44 IVIuXa
 
04.05.12
05:57
(0)
schtasks


конец...
45 IVIuXa
 
04.05.12
05:58
+(44)
at
46 IVIuXa
 
04.05.12
06:06
если тебе действительно нужно написать службу
то делается в среде microsoft studio без проблем

можно и из exe сделать службу опять же у мелкомягких написано

но мне так думается твой вариант это vbs + sfx
47 IVIuXa
 
04.05.12
06:08
пример на моем c# :)

http://wladm.narod.ru/C_Sharp/services.html
48 ws_mason
 
05.05.12
18:24
srvany вполне себе обертка. не знаю как на viste, 7, 2008 правда, но 2003 только в путь.
49 Jump
 
05.05.12
18:31
(47)Спасибо, все просто и понятно, а С# или VB в случае VisualStudio не принципиально.
Тут главное понять что вообще нужно сделать.
Попробую в ближайшее время, а пока для решения своей задачи остановился на xstarter, по функционалу устраивает, ну и время уже не терпит.
50 Torquader
 
06.05.12
12:21
Таки, кто писал под ДОС или Linux, где нет окон и диспетчера сообщений, тот сервис напишет без проблем.

Сначала нужно подключить диспетчер служб:
BOOL StartServiceCtrlDispatcher(LPSERVICE_TABLE_ENTRY lpServiceStartTable)
в который передаётся таблица с именем нашей службы и функцией
VOID WINAPI ServiceMain(DWORD dwArgc,LPTSTR *lpszArgv)
которая является телом нашей службы.
Эта функция будет выполняться до тех пор, пока работает наша служба (аргументы, как и у обычный main, только передаются из StartService).
В ServiceMain мы должны подключить обработчик событий:
SERVICE_STATUS_HANDLE RegisterServiceCtrlHandler(LPCTSTR lpServiceName, LPHANDLER_FUNCTION lpHandlerProc)
возвращаемый указатель мы будем использовать для смены статуса службы через
BOOL SetServiceStatus(SERVICE_STATUS_HANDLE hServiceStatus,LPSERVICE_STATUS lpServiceStatus)
где передаётся структура, описывающая состояние службы.
Указатель статуса закрывать не нужно - он освобождается после завершения службы.
Зарегистрированный обработчик событий
VOID WINAPI Handler(DWORD fdwControl)
мы используем для отслеживания события завершения нашей службы и завершения работы системы.

В итоге в ServiceMain должен быть бесконечный цикл, но если мы ничего не делаем, обязательно нужно вызывать Sleep, чтобы отдать неиспользуемое время системе - иначе всё будет зверски тормозить.
Флаг выхода из цикла мы менаем в обработчике событий, когда получили событие завершения.
51 oleg_km
 
06.05.12
15:48
(50) В итоге в ServiceMain должен быть бесконечный цикл, но если мы ничего не делаем, обязательно нужно вызывать Sleep, чтобы отдать неиспользуемое время системе - иначе всё будет зверски тормозить.
Флаг выхода из цикла мы менаем в обработчике событий, когда получили событие завершения.

Я управлял событиями. Каждая команда службе - отдельное событие:

   HANDLE hEvCmd[3];
   hEvCmd[0] = OpenEvent(SYNCHRONIZE | EVENT_MODIFY_STATE,
       FALSE, CEVENTEXIT);
   hEvCmd[1] = OpenEvent(SYNCHRONIZE, FALSE, CEVENTMODE);
   hEvCmd[2] = OpenEvent(SYNCHRONIZE, FALSE, CEVENTSTOP);
   SetEvent(hEvCmd[0]);

   bool lExit = true;
   while (lExit) {
       DWORD nRes = WaitForMultipleObjects(3, hEvCmd, FALSE, nIntProbe);
       switch (nRes) {
       case WAIT_TIMEOUT:
           if (!Probe1C()) {
               WriteLog(EVENTLOG_ERROR_TYPE, L"\n1C don't response"
                   L"\n1C Server session stopped");
               ReportStatus(SERVICE_STOPPED, ERR_1C_DNT_RESP, 0);
               return;
           }
           break;
       case (WAIT_OBJECT_0 + 1):
           lWndMode = !lWndMode;
           ShowMainWnd(lWndMode);
           break;
       case (WAIT_OBJECT_0 + 2):
           DoMethod(L"StopAllSessions");
           break;
       case WAIT_FAILED:
       case WAIT_OBJECT_0:
       default:
           lExit = false;
           break;
       }
   }

   ServiceStop();
52 IVIuXa
 
07.05.12
07:21
(50)
абсолютно не прозрачный код, основанный на уже знании того что:
Сначала нужно подключить диспетчер служб, в который нужно передать таблицу и т.д.

я вот не вижу смысла обладать такими ненужными и не логичными знаниями
программист должен сосредоточиться на решении поставленной задачи а не заниматься 99% времени подготовкой к началу решения задач....
53 Torquader
 
08.05.12
20:52
(52) открываем msdn - берём рабочий пример - и вперёд за решение задачи - если вам не интересно узнать как это делается и зачем - можно вообще поймать студента и предложить ему написать программу.
54 Jump
 
08.05.12
20:57
Да я в принципе когда пытался написать самостоятельно службу уперся в следующее -
Я создал из шаблона службу, написал код, попытался его отладить и столкнулся с тем что не могу установить службу.
На примере из (47) я понял свои ошибки. - я не заполнил некоторые поля, и не сделал инсталлятор службы, почему-то я думал что это все идет автоматом.
55 Конфигуратор1с
 
08.05.12
21:15
тоже интересно
56 ЧеловекДуши
 
08.05.12
21:37
С-ишные извращенцы :)
57 Torquader
 
08.05.12
23:42
(54) К сожалению, выясняется, что установить службу не так просто, если пытаться это сделать вручную, но CreateService и все её параметры спасают положение на ура.
58 IVIuXa
 
09.05.12
06:58
(53)
я ж пытаюсь объяснить
помимо знания самого языка с(фигня) нужно еще знать эти всякие таблицы куда совать
вот что я буду искать в MSDN ?
я как бы не предполагал что туда нужно таблицу запихивать - это вообще глюк(как оказалось нет)
59 zak555
 
09.05.12
10:08
процесс надо будет прятать ?
60 Torquader
 
09.05.12
12:38
(58) Ну, когда я первый раз писал, я просто искал функцию CreateService - поэтому у меня вопросов с созданием и установкой службы не возникло, а уже из этой функции выбирается список функций для управления службами - там уже всё есть.
61 Jump
 
09.05.12
14:45
(59)Зачем?
62 mishaPH
 
09.05.12
14:47
задачи ыиндовые глюкало страшное. тр запуститься. то зависнет. то зависнет так, что только перегруз помогал.

счас поставили ннкрон. изучаем. пока все нравиться.
63 zak555
 
09.05.12
14:47
(61) на всякий случай =)
64 gavrikprog
 
09.05.12
14:48
65 gavrikprog
 
09.05.12
14:50
(64) ну или тут http://www.ozon.ru/context/detail/id/3577055/
не помню
66 gavrikprog
 
09.05.12
14:52
(64) актуальная похоже эта
http://www.ozon.ru/context/detail/id/5497094/
67 Torquader
 
13.05.12
15:00
Кстати, для регистрации службы в системе можно использовать команду "SC CREATE", если набрать в командной строке "SC CREATE /?", то можно узнать, как она работает.
То есть создание и удаление службы можно делать не отходя от командной строки - всё проще, чем могло бы быть.