Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


Опрос состояния службы




Для получения структурой SERVICE_STATUS текущего состояния службы используется следующая функция:

BOOL QueryServiceStatus(SC_HANDLE hService, LPSERVICE_STATUS lpServiceStatus)

Резюме: функционирование и управление службой

На рис. 13.1 показано, каким образом SCM связан со службами и программой управления службами, подобной программе 13.3, которая рассматривается в следующем разделе. В частности, SCM должен зарегистрировать службу, и все команды, предназначенные для службы, должны пропускаться через SCM.

Рис. 13.1. Управление службами Windows через SCM

Пример:команднаяоболочкауправленияслужбами

Управление службами часто осуществляется посредством утилит, входящих в группу Administrative Tools, доступ к которым открывается через пиктограмму Services (Службы). Для управления пользовательскими службами можно также использовать оболочку ServiceShell (программа 13.3), представляющую собой видоизмененный вариант программы JobShell из главы 6 (программа 6.3).

Программа 13.3. ServiceShell: программа управления службами

/* Глава 13. */

/* ServiceShell.с. Программа командной оболочки управления службами Windows.

Эта программа является видоизмененным вариантом программы управления задачами из главы 6, но только управляет службами, а не задачами. */

/* Поддерживаемые команды:

create — создание службы

delete – удаление службы

start – запуск службы

control – управление службой */

#include "EvryThng.h"

 

static SC_HANDLE hScm;

static BOOL Debug;

 

int _tmain(int argc, LPTSTR argv[]) {

BOOL Exit = FALSE;

TCHAR Command[MAX_COMMAND_LINE + 10], *pc;

DWORD i, LocArgc; /* Локальный параметр argc. */

TCHAR argstr[MAX_ARG][MAX_COMMAND_LINE];

LPTSTR pArgs[MAX_ARG];

/* Подготовить локальный массив "argv" в виде указателей на строки. */

for (i = 0; i < MAX_ARG; i++) pArgs[i] = argstr[i];

/* Открыть диспетчер управления службами на локальной машине. */

hScm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

/* Главный цикл обработки команд. */

_tprintf(_T("\nУправление службами Windows Services"));

while (!Exit) {

_tprintf(_T ("\nSM$"));

_fgetts(Command, MAX_COMMAND_LINE, stdin);

… Как для JobShell …

if (_tcscmp(argstr [0], _T("create")) == 0) {

Create(LocArgc, pArgs, Command);

}

… Аналогичным образом для всех команд …

}

CloseServiceHandle(hScm);

return 0;

}

 

int Create(int argc, LPTSTR argv[], LPTSTR Command) {

/* Создание новой службы в виде службы, запускаемой "по требованию":

argv[1]: имя службы

argv[2]: отображаемое имя службы

argv[3]: название исполняемого файла */

SC_HANDLE hSc;

TCHAR CurrentDir[MAX_PATH +1], Executable[MAX_PATH + 1];

hSc = CreateService(hScm, argv[1], argv[2], SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, Executable, NULL, NULL, NULL, NULL, NULL);

return 0;

}

 

/* Удаление службы – argv [1]: имя удаляемой службы. */

int Delete(int argc, LPTSTR argv[], LPTSTR Command) {

SC_HANDLE hSc;

hSc = OpenService(hScm, argv[1], DELETE);

DeleteService(hSc);

CloseServiceHandle(hSc);

return 0;

}

 

/* Запуск именованной службы - argv [1]: имя запускаемой службы. */

int Start(int argc, LPTSTR argv[], LPTSTR Command) {

SC_HANDLE hSc;

TCHAR WorkingDir[MAX_PATH + 1];

LPTSTR pWorkingDir = WorkingDir;

LPTSTR argvStart[] = {argv[1], WorkingDir};

GetCurrentDirectory(MAX_PATH + 1, WorkingDir);

hSc = OpenService(hScm, argv[1], SERVICE_ALL_ACCESS);

/* Запустить службу с одним аргументом — именем рабочего каталога. */

/* Примечание: по умолчанию имя службы совпадает с именем, */

/* связанным с дескриптором hSc посредством функции OpenService. */

/* Вместе с тем, функция ServiceMain это не проверяет. */

StartService(hSc, 2, argvStart);

CloseServiceHandle(hSc);

return 0;

}

 

/* Управление именованной службой.

argv[1]: имя управляемой службы.

argv[2]: управляющая команда: stop (остановка), pause (пауза), resume (возобновление), interrogate (опрос). */

static LPCTSTR Commands[] = {"stop," "pause," "resume," "interrogate," "user"};

static DWORD Controls[] = {

SERVICE_CONTROL_STOP, SERVICE_CONTROL_PAUSE,

SERVICE_CONTROL_CONTINUE, SERVICE_CONTROL_INTERROGATE, 128

};

 

int Control(int argc, LPTSTR argv[], LPTSTR Command) {

SC_HANDLE hSc;

SERVICE_STATUS ServiceStatus;

DWORD dwControl, i;

BOOL Found = FALSE;

for (i= 0; i < sizeof(Controls)/sizeof(DWORD) &&!Found; i++) Found = (_tcscmp(Commands [i], argv[2]) == 0);

if (!Found) {

_tprintf(_T("\nНесуществующая команда управления %s"), argv[1]);

return 1;

}

dwControl = Controls[i – 1];

hSc = OpenService(hScm, argv[1], SERVICE_INTERROGATE | SERVICE_PAUSE_CONTINUE | SERVICE_STOP | SERVICE_USER_DEFINED_CONTROL | SERVICE_QUERY_STATUS);

ControlService(hSc, dwControl, &ServiceStatus);

if (dwControl == SERVICE_CONTROL_INTERROGATE) {

QueryServiceStatus (hSc, &ServiceStatus);

printf(_T("Состояние, полученное при помощи QueryServiceStatus\n"));

printf(_T("Состояние службы\n"));

… Вывести всю остальную информацию о состоянии …

}

if (hSc!= NULL) CloseServiceHandle(hSc);

return 0;

}





Поделиться с друзьями:


Дата добавления: 2015-09-20; Мы поможем в написании ваших работ!; просмотров: 464 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

В моем словаре нет слова «невозможно». © Наполеон Бонапарт
==> читать все изречения...

2217 - | 2180 -


© 2015-2025 lektsii.org - Контакты - Последнее добавление

Ген: 0.01 с.