Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Листинги / Листинги / 34-05-ChangeServiceConfig

.cpp
Скачиваний:
4
Добавлен:
24.03.2016
Размер:
4.07 Кб
Скачать
#include <windows.h>
#include <iostream.h>

int main()
{
  char  service_name[] = "DemoService";    // имя сервиса
  SC_HANDLE  hServiceControlManager, hService;
  
  // указатель на буфер для информации о конфигурации сервиса
  QUERY_SERVICE_CONFIG*  lpQueryServiceConfig;
  // переменная для размера структуры в случае неудачи функции
  DWORD  dwBytesNeeded;

  // связываемся с менеджером сервисов
  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();

  // захватываем память под буфер
  lpQueryServiceConfig = (LPQUERY_SERVICE_CONFIG)new char[4096];

  // определям конфигурацию сервиса
  QueryServiceConfig( hService, lpQueryServiceConfig, 4096, 
                      &dwBytesNeeded);
  // распечатываем информацию о режиме запуска сервиса
  cout << "Old start type: " << lpQueryServiceConfig->dwStartType 
       << endl;

  // изменяем режим запуска сервиса
  if (!ChangeServiceConfig(
    hService,              // дескриптор сервиса
    SERVICE_NO_CHANGE,     // тип сервиса не изменяем
    SERVICE_AUTO_START,    // запуск во время загрузки системы
    SERVICE_NO_CHANGE,     // режим обработки ошибок не изменяем
    NULL, NULL, NULL, NULL, NULL, NULL, NULL  // все остальные параметры 
                                              // конфигурации не изменяем
    ))
  {
    cout << "Change service configuration failed." << endl
      << "The last error code: " << GetLastError() << endl
      << "Press any key to exit." << endl;
    cin.get();

    // закрываем дескрипторы
    CloseServiceHandle(hServiceControlManager);
    CloseServiceHandle(hService);

    return 0;
  }

  // определям конфигурацию сервиса
  QueryServiceConfig( hService, lpQueryServiceConfig, 4096, 
                     &dwBytesNeeded);
  // распечатываем информацию о режиме запуска сервиса
  cout << "New start type: " << lpQueryServiceConfig->dwStartType 
       << endl;

  // восстанавливаем режим запуска сервиса
  ChangeServiceConfig(
    hService,              // дескриптор сервиса
    SERVICE_NO_CHANGE,     // тип сервиса не изменяем
    SERVICE_DEMAND_START,  // запуск во время загрузки системыпо требованию
    SERVICE_NO_CHANGE,     // режим обработки ошибок не изменяем
    NULL, NULL, NULL, NULL, NULL, NULL, NULL  // все остальные параметры 
                                              // конфигурации не изменяем
    );
  // определям конфигурацию сервиса
  QueryServiceConfig( hService, lpQueryServiceConfig, 4096, 
                     &dwBytesNeeded);
  // распечатываем информацию о режиме запуска сервиса
  cout << "Old start type: " << lpQueryServiceConfig->dwStartType 
       << endl;

  // освобождаем память
  delete[] lpQueryServiceConfig;

  cout << "Press any key to exit." << endl;
  cin.get();

  // закрываем дескрипторы
  CloseServiceHandle(hServiceControlManager);
  CloseServiceHandle(hService);

  return 0;
}
Соседние файлы в папке Листинги