Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Приверить, запущен ли сервис

Delphi , Программа и Интерфейс , Процессы и Сервисы

Приверить, запущен ли сервис

Падает комп с 16-го этажа и думает: "Вот бы сейчас зависнуть".


uses
  WinSvc; 
function ServiceGetStatus(sMachine, sService: PChar): DWORD; 
  {******************************************} 
  {*** Parameters: ***} 
  {*** sService: specifies the name of the service to open 
  {*** sMachine: specifies the name of the target computer 
  {*** ***} 
  {*** Return Values: ***} 
  {*** -1 = Error opening service ***} 
  {*** 1 = SERVICE_STOPPED ***} 
  {*** 2 = SERVICE_START_PENDING ***} 
  {*** 3 = SERVICE_STOP_PENDING ***} 
  {*** 4 = SERVICE_RUNNING ***} 
  {*** 5 = SERVICE_CONTINUE_PENDING ***} 
  {*** 6 = SERVICE_PAUSE_PENDING ***} 
  {*** 7 = SERVICE_PAUSED ***} 
  {******************************************} 
var 
  SCManHandle, SvcHandle: SC_Handle; 
  SS: TServiceStatus; 
  dwStat: DWORD; 
begin 
  dwStat := 0; 
  // Open service manager handle. 
  SCManHandle := OpenSCManager(sMachine, nil, SC_MANAGER_CONNECT); 
  if (SCManHandle > 0) then 
  begin 
    SvcHandle := OpenService(SCManHandle, sService, SERVICE_QUERY_STATUS); 
    // if Service installed 
    if (SvcHandle > 0) then 
    begin
      // SS structure holds the service status (TServiceStatus); 
      if (QueryServiceStatus(SvcHandle, SS)) then 
        dwStat := ss.dwCurrentState; 
      CloseServiceHandle(SvcHandle); 
    end; 
    CloseServiceHandle(SCManHandle); 
  end; 
  Result := dwStat; 
end; 

function ServiceRunning(sMachine, sService: PChar): Boolean; 
begin 
  Result := SERVICE_RUNNING = ServiceGetStatus(sMachine, sService); 
end; 

// Check if Eventlog Service is running 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  if ServiceRunning(nil, 'Eventlog') then 
    ShowMessage('Eventlog Service Running') 
  else 
    ShowMessage('Eventlog Service not Running') 
end; 

{ 
  Windows 2000 and earlier: All processes are granted the SC_MANAGER_CONNECT, 
  SC_MANAGER_ENUMERATE_SERVICE, and SC_MANAGER_QUERY_LOCK_STATUS access rights. 

  Windows XP: Only authenticated users are granted the SC_MANAGER_CONNECT, 
  SC_MANAGER_ENUMERATE_SERVICE, 
  and SC_MANAGER_QUERY_LOCK_STATUS access rights. 
} 

{ 
  Do not use the service display name (as displayed in the services 
  control panel applet.) You must use the real service name, as 
  referenced in the registry under 
  HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services 
}

Программа на Delphi, которая проверяет запущен ли Windows-сервис. Специфический сервис, который проверяется, - это Служба журнала событий.

Код выполняет следующие действия:

  1. Определяет две функции: ServiceGetStatus и ServiceRunning.

    • ServiceGetStatus: Функция принимает два параметра, sMachine и sService, которые указывают на имя целевого компьютера и имя сервиса для открытия соответственно. Функция возвращает DWORD-значение, указывающее статус сервиса:
    • 1 = SERVICE_STOPPED
    • 2 = SERVICE_START_PENDING
    • 3 = SERVICE_STOP_PENDING
    • 4 = SERVICE_RUNNING
    • 5 = SERVICE_CONTINUE_PENDING
    • 6 = SERVICE_PAUSE_PENDING
    • 7 = SERVICE_PAUSED

    • ServiceRunning: Функция является обёрткой вокруг ServiceGetStatus и просто возвращает, соответствует ли статус сервиса SERVICE_RUNNING.

  2. Определяет процедуру Button1Click, которая вызывается при клике кнопки на форме (TForm1).

    • Процедура проверяет, запущен ли Служба журнала событий, используя ServiceRunning. Если она запущена, отображается сообщение об ошибке, говорящее о том, что "Служба журнала событий запущена". В противном случае отображается сообщение об ошибке, говорящее о том, что "Служба журнала событий не запущена".

Код также включает в себя примечания о разрешениях Windows-сервисов и важности использования реального имени сервиса вместо имени отображения.

Для улучшения кода:

  1. Обработка ошибок: Текущая реализация не обрабатывает ошибки хорошо. Например, если OpenSCManager или OpenService fails, она вернет код ошибки, но программа продолжит выполняться без какого-либо указания о том, что что-то пошло не так. Лучше было бы проверять ошибки и отображать значимое сообщение пользователю.

  2. Организация кода: Процедура Button1Click тесно связана с функциями управления сервисами. Для улучшения поддерживаемости считайте, что эти функции переместите в свой собственный модуль или единицу и сделайте их более универсальными.

  3. Комментарии к коду: Хотя есть комментарии в коде, они могли бы быть более подробными и информативными. Рассмотрите добавление комментариев, объясняющих почему были сделаны определенные решения, что конкретные части кода делают и как они взаимодействуют друг с другом.

  4. Обработка имени сервиса: Код предполагает, что имя сервиса всегда равно 'Eventlog'. Для того, чтобы сделать его более общепринятым, рассмотрите передачу имени сервиса в параметр или хранение его в файле конфигурации.

  5. Улучшения интерфейса: Программа отображает сообщения об ошибке для указания о том, запущен ли сервис или нет. Рассмотрите добавление более дружественных элементов интерфейса, таких как полоса состояния или список, чтобы отображать эту информацию в более структурированном виде.

Функция ServiceGetStatus позволяет получить статус запущенного сервиса на компьютере, а функция ServiceRunning проверяет, запущен ли конкретный сервис.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Процессы и Сервисы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 13:22:50/0.0060691833496094/1