|   |   | 
| 
 | Кто сталкивался с написанием служб виндовс? | ☑ | ||
|---|---|---|---|---|
| 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 | ||||
| 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 | 
        (0)
  тут было http://www.ozon.ru/context/detail/id/4023293/ | |||
| 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 /?", то можно узнать, как она работает.
  То есть создание и удаление службы можно делать не отходя от командной строки - всё проще, чем могло бы быть. | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |