ServiceManager/pl
Ten artykuł odnosi się tylko do Windows.
Zobacz także: Przewodnik programowania wieloplatformowego
│
English (en) │
español (es) │
polski (pl) │
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.