ServiceManager/pl

From Lazarus wiki
Jump to navigationJump to search
Windows logo - 2012.svg

Ten artykuł odnosi się tylko do Windows.

Zobacz także: Przewodnik programowania wieloplatformowego

English (en) español (es) polski (pl)

Menedżer usług

ServiceManager

Dla Windows pakiet fcl-extra zawiera moduł o nazwie ServiceManager.

Poniższy przykład sprawdza, czy usługa SamSs (Security Accounts Manager; powinien być zawsze uruchomiony) jest uruchomiona. (Odpowiednik wiersza poleceń sc query samss).

Nazwa usługi

Pamiętaj, że jeśli tworzysz własną usługę za pomocą pakietu Lazdaemon, ważna jest nazwa usługi, której będziesz używać. Podczas gdy polecenia NET START i NET STOP używają wyświetlanej nazwy usługi, polecenie SC i poniższy kod używają wewnętrznej nazwy usługi. Wyświetlana nazwa to nazwa nadana właściwości „DisplayName” elementu utworzonego w elementach DaemonDefs. Nazwa usługi jest właściwością "Name" tego samego elementu. Wyświetlana nazwa to ta, która jest aktualnie wyświetlana w kolumnie Nazwa przez aplet menedżera usług MS (services.msc) Użyjmy przykładu, aby to wyjaśnić. Załóżmy, że napisałeś aplikację serwisową o nazwie myService.exe, w której znajduje się jeden element w DaemonDefs. Element ma nazwę „MyServ”, a powiązana właściwość „DisplayName” ma wartość „Internal build service”. Używając wiersza poleceń jako administrator możesz:

Zarządzanie usługami za pomocą konsoli

Będziesz potrzebować: Microsoft .NET Framework 4.5.2 (instalator sieciowy) dla Windows Vista SP2, Windows 7 SP1, Windows 8, Windows 8.1, Windows Server 2008 SP2 Windows Server 2008 R2 SP1, Windows Server 2012 i Windows Server 2012 R2

Aby zainstalować usługę na komputerze lokalnym, musisz uzyskać obsługę wiersza polecenia zestawu .NET SDK. 1. Wywołaj wiersz poleceń SDK, wykonaj Start > Wszystkie programy > Microsoft .NET Framework SDK v2.0 > Wiersz poleceń SDK

Instalacja usługi:

\twoja\ścieżka\do\aplikacji\myService.exe --install 
rem .... lub /install, -install też działa

Aktywacja usługi: W tych poleceniach nie zapomnij o podwójnych cudzysłowach, gdy nazwa składa się z wielu słów!

net start "Internal build service"
rem .... lub alternatywnie:
sc start "MyServ"

Aby zatrzymać usługę:

net stop '''"Internal build service"'''
rem ... lub alternatywnie 
sc stop "'''MyServ'''"

Przykład kodu

Biorąc pod uwagę powyższe, fragment kodu wywołujący poniższą funkcję wyglądałby w naszym przypadku tak:

if IsServiceRunning('MyServ') then


Przykładowy program::

program ServiceTest;
// Sprawdź, czy dany proces jest uruchomiony.
{$mode objfpc}{$H+}
uses
  Classes,
  SysUtils,
  ServiceManager,
  JwaWinSvc {dla deklaracji usług};

function IsServiceRunning(ServiceName: string): boolean;
  {opis: Sprawdza, czy usługa Windows jest uruchomiona}
var
  Services: TServiceManager;
  ServiceStatus: TServiceStatus;
begin
  //Sprawdza istniejące usługi
  //odpowiednik polecenia sc query <servicename>
  Services := TServiceManager.Create(nil);
  try
    try
      Services.Acces := SC_MANAGER_CONNECT; //Uwaga literówka w nazwie usługi.
      //Nie potrzebujemy więcej uprawnień dostępu niż to; domyślnie
      //manager usług próbuje uzyskać pełny dostęp
      Services.Connect; //Teraz połącz się z żądanym poziomem dostępu
      Services.GetServiceStatus(ServiceName, ServiceStatus);
      Result := (ServiceStatus.dwCurrentState = SERVICE_RUNNING);
      Services.Disconnect;
    except
      on E: EServiceManager do
      begin
        // Brakująca usługa może zgłosić wyjątek brakującego uchwytu? Nie?
        {LogOutput('Błąd podczas pobierania informacji dla usługi ' + ServiceName +
                   '. Szczegóły techniczne: ' + E.ClassName + '/' + E.Message); }
        Result := False;
        raise; //ponownie wyrzuć oryginalny wyjątek
      end;
      on E: Exception do
      begin
       {LogOutput('Błąd podczas pobierania informacji dla usługi ' + ServiceName +
                  '. Szczegóły techniczne: ' + E.ClassName + '/' + E.Message); }
        Result := False;
        raise; //ponownie wyrzuć oryginalny wyjątek
      end;
    end;
  finally
    Services.Free;
  end;
end;

const
  ServiceToTest = 'SamSs';

//Menedżer Zabezpieczeń Kont (SAM - Security Accounts Manager) powinien być uruchomiony, przynajmniej w systemie Vista
begin
  WriteLn('Rozpoczęcie testu dla usługi ' + ServiceToTest + '.');
  if IsServiceRunning(ServiceToTest) then
    WriteLn('Usługa ' + ServiceToTest + ' jest uruchomiona')
  else
    WriteLn('Usługa ' + ServiceToTest + ' nie jest uruchomiona');
end.

Zobacz także