Кто сталкивался с написанием служб виндовс? #609069


#0 by Jump
В общем нужно написать простенькую службу чтобы крутилась в памяти и запускала консольную программу по таймеру. Что то нифига не получается в студии сделать это, вроде пустую написал установить не могу. Может кто пнет в нужном направлении.
#1 by zak555
планировщик не предлагать ?
#2 by Cube
+1
#3 by Shurjk
для начала было бы неплохо понять что вы понимаете под службой.
#4 by ЧеловекДуши
Я, и что там сложного?
#5 by ЧеловекДуши
+ ДелпХи 6 и выше уже имеют встроенную компоненту ;)
#6 by Kandellaster
#7 by Kandellaster
а вот и на православном борланде
#8 by Jump
Ну в дельфях я никак, там поверхностно VB, перл. Сейчас как раз все так и работает - запускает планировщик. В принципе все устраивает, только вот как настроить планировщик программно тогда? Ну чтобы клиент тыкал "далее" и у него появилось запланированное задание.
#9 by manyak
#10 by пипец
докучи xstarter
#11 by Jump
Во! То что надо! Спасибо!
#12 by Jump
Тоже хорошая штука, только непонятно можно ли ее запускать без интерфейса в трее. Мне не желательно чтобы пользователь сам там тыкал кнопочки.
#13 by andrewalexk
:) все кто сталкивался с написанием служб виндоус находятся на microsoft.com
#14 by Зеленый Кот
delphi
#15 by Nikitas
ставишь nnCron и будет тебе счастье.. настраиваешь как хочешь
#16 by Жан Пердежон
удаляешь кроны нафиг, пишешь в консоле at /? и будет тебе счастье
#17 by Jump
А как это засунуть в инсталлятор? и at /? не работает если у пользователя нет пароля. Мне то что надо - я отдаю пользователю файл setup.exe, тот его запускает, и все у него с этого момента запускаются задачи по таймеру. Т.е вариант с объяснением пользователю чего там куда писать в консоле, чтобы у него заработало не катит, как и заставлять его создавать пароль на учетную запись в винде.
#18 by Jump
А он умеет работать чисто в виде сервиса? Без пользовательского интерфейса?
#19 by Nikitas
nnCron - умеет много чего, и ввиде сервиса. на нем свои скрипты писать можно
#20 by Жан Пердежон
ну извини, на столько телепатию еще не прокачал
#21 by Жан Пердежон
какой пароль, зачем писать в консоле? ты прог или кто?)
#22 by izekia
интересно, а что консольная программа делает?
#23 by Cube
Крадет пароли, чо тут не понятного)
#24 by izekia
консольных шпионов куча
#25 by izekia
клавиатурных*
#26 by ЧеловекДуши
Там нечего знать не надо, кромя парочки команд, первичных знаний о синтаксисе и написания кода, он кстати на подобие "Паскаля". Компонента там организована на уровне кнопок, т.е. все делается кнопками и галочками. Все что нужно будет это прописать команду вызова другой программы. Но в инете и этого навалом :)
#27 by mistеr
Попробуй угадать, а твоя самописная служба будет работать, если у пользователя нет пароля? То же самое и с nnCron.
#28 by ЧеловекДуши
+ если заинтересуешься, то после компиляции нужно инсталировать службу: "Твой екзе файл службы.EXE -INSTALL" "Твой екзе файл службы.EXE -UNINSTALL"
#29 by ковер
службы нужно писать на Си
#30 by izekia
на асме-то кошернее будет)
#31 by ковер
то ты слишком глубоко копнул - ты еще скажи в бинарном формате ее написать :)
#32 by ковер
лови  статью, в ней даже болванки есть для написания собственной службы
#33 by FN
делаешь "инсталятор" setup.cmd в нем пишешь: at 12:00 /every:monday defrag.exe и вуаля - все как ты хотел - одним кликом для пользователя...
#34 by Rebelx
есть маленькая проблема - если у пользователя нет пароля, то будет работать только при выполненном входе
#35 by Rebelx
+ с другой стороны можно создать специального пользователя для этого задания ( net user /? )
#36 by ковер
под другой учеткой можно делать
#37 by Jump
"Попробуй угадать, а твоя самописная служба будет работать, если у пользователя нет пароля?" - конечно будет, она будет работать даже если в системе  нет пользователей, а уж есть у каких-то пользователей пароль или нет ей до лампочки.
#38 by Jump
А я думал их надо писать на чем умеешь :)
#39 by Rebelx
тут ты не совсем прав. Служба может быть запущена от имени пользователя Локальная служба или Сетевая служба. От имени других пользователей - только при наличии пароля.
#40 by Jump
Служба работает под системной учетной записью, т.е она загружается раньше чем появляется окно входа в систему. Естественно потом при желании можно залогиниться и под пользователем.
#41 by Jump
В общем cronNT под семеркой работать не желает. Пока остановился на xstarter.
#42 by vcv
Простую консольную утилиту можно запускать любым планировщиком. Штатным или сторонним. Если обязательно хочется сервис, почти произвольную программу можно сделать сервисом с помощью srvany.
#43 by Torquader
служба может запускаться от имени системы или под любой другой учётной записью - всё это указывается при вызове CreateService. Собственно,и запускаться она может или при загрузке или при входе пользователя - если поставить взаимодействие с рабочим столом. Я писал запуск командной строки под системной учётной записью - только надо искать - где это валяется - идея была - копировать диск,но системный профиль просто блокируется и наличие системной учётной записи не помогло.
#44 by IVIuXa
schtasks конец...
#45 by IVIuXa
+ at
#46 by IVIuXa
если тебе действительно нужно написать службу то делается в среде microsoft studio без проблем можно и из exe сделать службу опять же у мелкомягких написано но мне так думается твой вариант это vbs + sfx
#47 by IVIuXa
пример на моем c# :)
#48 by ws_mason
srvany вполне себе обертка. не знаю как на viste, 7, 2008 правда, но 2003 только в путь.
#49 by Jump
Спасибо, все просто и понятно, а С# или VB в случае VisualStudio не принципиально. Тут главное понять что вообще нужно сделать. Попробую в ближайшее время, а пока для решения своей задачи остановился на xstarter, по функционалу устраивает, ну и время уже не терпит.
#50 by Torquader
Таки, кто писал под ДОС или 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 by oleg_km
В итоге в 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" 1C don't response"                    L" 1C 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 by IVIuXa
абсолютно не прозрачный код, основанный на уже знании того что: Сначала нужно подключить диспетчер служб, в который нужно передать таблицу и т.д. я вот не вижу смысла обладать такими ненужными и не логичными знаниями программист должен сосредоточиться на решении поставленной задачи а не заниматься 99% времени подготовкой к началу решения задач....
#53 by Torquader
открываем msdn - берём рабочий пример - и вперёд за решение задачи - если вам не интересно узнать как это делается и зачем - можно вообще поймать студента и предложить ему написать программу.
#54 by Jump
Да я в принципе когда пытался написать самостоятельно службу уперся в следующее - Я создал из шаблона службу, написал код, попытался его отладить и столкнулся с тем что не могу установить службу. На примере из я понял свои ошибки. - я не заполнил некоторые поля, и не сделал инсталлятор службы, почему-то я думал что это все идет автоматом.
#55 by Конфигуратор1с
тоже интересно
#56 by ЧеловекДуши
С-ишные извращенцы :)
#57 by Torquader
К сожалению, выясняется, что установить службу не так просто, если пытаться это сделать вручную, но CreateService и все её параметры спасают положение на ура.
#58 by IVIuXa
я ж пытаюсь объяснить помимо знания самого языка с(фигня) нужно еще знать эти всякие таблицы куда совать вот что я буду искать в MSDN ? я как бы не предполагал что туда нужно таблицу запихивать - это вообще глюк(как оказалось нет)
#59 by zak555
процесс надо будет прятать ?
#60 by Torquader
Ну, когда я первый раз писал, я просто искал функцию CreateService - поэтому у меня вопросов с созданием и установкой службы не возникло, а уже из этой функции выбирается список функций для управления службами - там уже всё есть.
#61 by Jump
Зачем?
#62 by mishaPH
задачи ыиндовые глюкало страшное. тр запуститься. то зависнет. то зависнет так, что только перегруз помогал. счас поставили ннкрон. изучаем. пока все нравиться.
#63 by zak555
на всякий случай =)
#64 by gavrikprog
тут было
#65 by gavrikprog
ну или тут не помню
#66 by gavrikprog
актуальная похоже эта
#67 by Torquader
Кстати, для регистрации службы в системе можно использовать команду "SC CREATE", если набрать в командной строке "SC CREATE /?", то можно узнать, как она работает. То есть создание и удаление службы можно делать не отходя от командной строки - всё проще, чем могло бы быть.
Тэги: Админ
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С