Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР СПО(231000)(ПР инж) 12.docx
Скачиваний:
4
Добавлен:
01.04.2025
Размер:
156 Кб
Скачать
☆

Структура сервиса

Сервис может быть консольным приложением и приложением с графическим интерфейсом.

Сервисы взаимодействуют с пользователем через рабочий стол или окно сообщений.

Сервис должен содержать две функции обратного вызова. Первая – определяет точку входа, вторая – реагирует на управляющие сигналы от ОС.

Создание сервиса.

Пример 1. Создание сервиса

#include <windows.h>

#include <fstream.h>

char service_name[] = "DemoService"; // имя сервиса

SERVICE_STATUS service_status;

SERVICE_STATUS_HANDLE hServiceStatus;

VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv);

VOID WINAPI ServiceCtrlHandler(DWORD dwControl);

ofstream out; // выходной файл для протокола работы сервиса

int nCount; // счетчик

// главная функция приложения

int main()

{

// инициализируем структуру сервисов

SERVICE_TABLE_ENTRY service_table[] =

{

{service_name, ServiceMain}, // имя сервиса и функция сервиса

{ NULL, NULL } // больше сервисов нет

};

// запускаем диспетчер сервиса

if (!StartServiceCtrlDispatcher(service_table))

{

out.open("C:\\ServiceFile.log");

out << "Start service control dispatcher failed.";

out.close();

return 0;

}

return 0;

}

VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv)

{

// регистрируем обработчик управляющих команд для сервиса

hServiceStatus = RegisterServiceCtrlHandler(

service_name, // имя сервиса

ServiceCtrlHandler // обработчик управляющих команд

);

if (!hServiceStatus)

{

out.open("C:\\ServiceFile.log");

out << "Register service control handler failed.";

out.close();

return;

}

// инициализируем структуру состояния сервиса

service_status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;

service_status.dwCurrentState = SERVICE_START_PENDING;

service_status.dwControlsAccepted = SERVICE_ACCEPT_STOP |

SERVICE_ACCEPT_SHUTDOWN;

service_status.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR;

service_status.dwServiceSpecificExitCode = 0;

service_status.dwCheckPoint = 0;

service_status.dwWaitHint = 5000;

// устанавливаем состояние сервиса

if (!SetServiceStatus(hServiceStatus, &service_status))

{

out.open("C:\\ServiceFile.log");

out << "Set service status 'SERVICE_START_PENDING' failed.";

out.close();

return;

}

// определяем сервис как работающий

service_status.dwCurrentState = SERVICE_RUNNING;

// нет ошибок

service_status.dwWin32ExitCode = NO_ERROR;

// устанавливаем новое состояние сервиса

if (!SetServiceStatus(hServiceStatus, &service_status))

{

out.open("C:\\ServiceFile.log");

out << "Set service status 'START_PENDING' failed.";

out.close();

return;

}

// открываем файл протокола работы сервиса

out.open("C:\\ServiceFile.log");

out << "The service is started." << endl << flush;

out << "My name is: " << lpszArgv[0] << endl << flush;

for (int i = 1; i < (int)dwArgc; ++i)

out << "My " << i << " parameter = " << lpszArgv[i] << endl << flush;

// рабочий цикл сервиса

while (service_status.dwCurrentState == SERVICE_RUNNING)

{

++nCount;

Sleep(3000);

}

}

VOID WINAPI ServiceCtrlHandler(DWORD dwControl)

{

switch(dwControl)

{

case SERVICE_CONTROL_STOP: // остановить сервис

// записываем конечное значение счетчика

out << "Count = " << nCount << endl;

out << "The service is finished." << endl << flush;

// закрываем файл

out.close();

// устанавливаем состояние остановки

service_status.dwCurrentState = SERVICE_STOPPED;

// изменить состояние сервиса

SetServiceStatus(hServiceStatus, &service_status);

break;

case SERVICE_CONTROL_SHUTDOWN: // завершить сервис

service_status.dwCurrentState = SERVICE_STOPPED;

// изменить состояние сервиса

SetServiceStatus(hServiceStatus, &service_status);

break;

default:

// увеличиваем значение контрольной точки

++service_status.dwCheckPoint;

// оставляем состояние сервиса без изменения

SetServiceStatus(hServiceStatus, &service_status);

break;

}

return;

}

Установка сервиса

Пример 2. Установка сервиса

#include <windows.h>

#include <iostream.h>

int main()

{

SC_HANDLE hServiceControlManager, hService;

// связываемся с менеджером сервисов

hServiceControlManager = OpenSCManager(

NULL, // локальная машина

NULL, // активная база данных сервисов

SC_MANAGER_CREATE_SERVICE // возможно создание сервиса

);

if (hServiceControlManager == NULL)

{

cout << "Open service control manager failed." << endl

<< "The last error code: " << GetLastError() << endl

<< "Press any key to exit." << endl;

cin.get();

return 0;

}

cout << "Service control manager is opened." << endl

<< "Press any key to continue." << endl;

cin.get();

// устанавливаем новый сервис

hService = CreateService(

hServiceControlManager, // дескриптор менеджера сервисов

"DemoService", // внутреннее имя сервиса, используемое SCM

"Demo_Service", // внешнее имя сервиса в панели управления

SERVICE_ALL_ACCESS, // полный контроль над сервисом

SERVICE_WIN32_OWN_PROCESS, // сервис является процессом

SERVICE_DEMAND_START, // запускается сервис по требованию

SERVICE_ERROR_NORMAL, // обработка ошибок нормальная

"C:\\DemoService.exe", // путь к сервису

NULL, // сервис не принадлежит к группе

NULL, // тэг группы не изменяется

NULL, // сервис не зависит от других сервисов

NULL, // имя совпадает с текущим именем учетной записи

NULL // пароля нет

);

if (hService == NULL)

{

cout << "Create service failed." << endl

<< "The last error code: " << GetLastError() << endl

<< "Press any key to exit." << endl;

cin.get();

// закрываем дескриптор менеджера сервисов

CloseServiceHandle(hServiceControlManager);

return 0;

}

cout << "Service is installed." << endl

<< "Press any key to exit." << endl;

cin.get();

// закрываем дескрипторы

CloseServiceHandle(hService);

CloseServiceHandle(hServiceControlManager);

return 0;

}

Запуск сервиса

Пример 3. Открытие и запуск сервиса

#include <windows.h>

#include <iostream.h>

int main()

{

char service_name[] = "DemoService"; // имя сервиса

char *param[] = { "p1", "p2", "p3" }; // список параметров

SC_HANDLE hServiceControlManager, hService;

// связываемся с менеджером сервисов

hServiceControlManager = OpenSCManager(

NULL, // локальная машина

NULL, // активная база данных сервисов

SC_MANAGER_CONNECT // соединение с менеджером сервисов

);

if (hServiceControlManager == NULL)

{

cout << "Open service control manager failed." << endl

<< "The last error code: " << GetLastError() << endl

<< "Press any key to continue." << endl;

cin.get();

return 0;

}

cout << "Service control manager is opened." << endl

<< "Press any key to continue." << endl;

cin.get();

// открываем сервис

hService = OpenService(

hServiceControlManager, // дескриптор менеджера сервисов

service_name, // имя сервиса

SERVICE_ALL_ACCESS // полный доступ к сервису

);

if (hService == NULL)

{

cout << "Open service failed." << endl

<< "The last error code: " << GetLastError() << endl

<< "Press any key to exit." << endl;

cin.get();

// закрываем дескриптор менеджера сервисов

CloseServiceHandle(hServiceControlManager);

return 0;

}

cout << "Service is opened." << endl

<< "Press any key to continue." << endl;

cin.get();

// стартуем сервис

if (!StartService(

hService, // дескриптор сервиса

3, // три параметра

(const char**)param // указатель на массив параметров

))

{

cout << "Start service failed." << endl

<< "The last error code: " << GetLastError() << endl

<< "Press any key to exit." << endl;

cin.get();

// закрываем дескрипторы

CloseServiceHandle(hServiceControlManager);

CloseServiceHandle(hService);

return 0;

}

cout << "The service is started." << endl

<< "Press any key to exit." << endl;

cin.get();

// закрываем дескрипторы

CloseServiceHandle(hServiceControlManager);

CloseServiceHandle(hService);

return 0;

}

3. Оборудование

4. Задание на работу

Спроектировать, установить и протестировать сервис по варианту, заданному преподавателем.

5. Содержание отчета

6. Контрольные вопросы

Список литературы

Основная литература

  1. Гордеев, А.В. Системное программное обеспечение : Учебник для вузов / А.В.Гордеев,А.Ю.Молчанов .— М.и др. : Питер, 2003 .— 736с.<6>

  2. Гордеев, А.В. Системное программное обеспечение : Учебник для вузов / А.В.Годеев,А.Ю.Молчанов .— СПб.[и др.] : Питер, 2001 .— 736с.<7>

  3. Агуров, П.В. Интерфейс USB.Практика использования и программирования / П.В.Агуров .— СПб. : БХВ-Петербург, 2005 .— 576с.<5>

  4. Хорев, П.Б. Методы и средства защиты информации в компьютерных системах : учеб.пособие для вузов / П.Б.Хорев .— 3-е изд.,стер. — М. : Академия, 2007 .— 256с.<6>

  5. Хорев, П.Б. Методы и средства защиты информации в компьютерных системах : учеб.пособие для вузов / П.Б.Хорев .— 2-е изд.,стер. — М. : Академия, 2006 .— 256с.<6>