Tuesday, 1 December 2009

Start or Stop a MSSQLServer service with Delphi

Muchas veces nos encontraremos en diferentes situaciones donde tenemos que controlar los servicios de un equipo. En éste pequeño artículo, he recuperado diversos posts de gente que hizo el trabajo en su día y hago una pequeña adaptación para el ejemplo que quiero mostrar. Los servicios de windows los podemos encontrar en Herramientas administrativas -> Servicios. Desde la propia herramienta del SO podemos iniciar, parar o ver el estado de los servicios que tenemos instalados en nuestro equipo. En varias webs podemos encontrar mucha información referente a los servicios, algunas interesantes con el código desarrollado son por ejemplo:
Los 2 ejemplos disponen de todo el código que he utilizado para los métodos que aquí os pongo. En mi caso lo que yo quiero hacer es parar el servicio de SQLServer de un servidor (con Windows Server). Para ello, debemos parar el servicio SQLSERVERAGENT y luego una vez parado éste, parar el servicio MSSQLSERVER. Para iniciarlo otra vez, debemos hacer el camino opuesto y primero iniciar el MSSQLSERVER y luego el SQLSERVERAGENT.


Aquí os dejo el código fuente utilizando la unit TServiceManager de marc Dürst. Además podemos encontrar información de ésta unit en el siguiente enlace.
  • Iniciar el servicio:


procedure StartSQLServer();
var
i: integer;
begin
//Iniciar un altre cop els serveis
Log('Starting Service MSSQLSERVER');
while ServiceManager2.ServiceStopped do
begin
mmolog.Lines.Add('.');
Sleep(defTime);
i := 0;
while i < timeout do
begin
mmolog.Lines[mmolog.Lines.count - 1] := mmolog.Lines[mmolog.Lines.count - 1] + '.';
Sleep(defTime);
Inc(i);
Application.ProcessMessages;
end;
ServiceManager2.StartService;
Sleep(defTime);
end;
while not ServiceManager2.ServiceRunning do
begin
mmolog.Lines.Add('.');
mmolog.Lines[mmolog.Lines.count - 1] := mmolog.Lines[mmolog.Lines.count - 1] + '.';
Sleep(defTime);
Application.ProcessMessages;
end;
if ServiceManager2.ServiceRunning then
begin
Log('Service Started MSSQLSERVER');
Sleep(defTime);
Log('Starting Service SQLSERVERAGENT');
while ServiceManager1.ServiceStopped do
begin
mmolog.Lines.Add('.');
Sleep(defTime);
i := 0;
while i < timeout do
begin
mmolog.Lines[mmolog.Lines.count - 1] := mmolog.Lines[mmolog.Lines.count - 1] + '.';
Sleep(defTime);
Inc(i);
Application.ProcessMessages;
end;
ServiceManager1.StartService;
Sleep(defTime);
end;
while not ServiceManager1.ServiceRunning do
begin
mmolog.Lines.Add('.');
mmolog.Lines[mmolog.Lines.count - 1] := mmolog.Lines[mmolog.Lines.count - 1] + '.';
Sleep(defTime);
Application.ProcessMessages;
end;
if ServiceManager1.ServiceRunning then
begin
Log('Service Started SQLSERVERAGENT');
end;
end;
Log('Status Services SQLSERVERAGENT: ' + BoolToStr(ServiceManager1.ServiceRunning) + ' MSSQLSERVER: ' + BoolToStr(ServiceManager2.ServiceRunning));
end;



  • Parar el servicio:


procedure StopSQLServer();
var
status: DWORD;
i: integer;
begin
//Primer hem d'aturar el SQLSERVERAGENT
status := ServiceGetStatus(GetComputerNetName(), 'SQLSERVERAGENT');
Log('Getting status from service SQLSERVERAGENT -> ' + GetTextStatus(status));
ServiceManager1.Connect(PAnsiChar(name));
ServiceManager1.OpenServiceConnection('SQLSERVERAGENT');

status := ServiceGetStatus(GetComputerNetName(), 'MSSQLSERVER');
Log('Getting status from service MSSQLSERVER -> ' + GetTextStatus(status));
ServiceManager2.Connect(PAnsiChar(name));
ServiceManager2.OpenServiceConnection('MSSQLSERVER');

Log('Stopping Service SQLSERVERAGENT');
while ServiceManager1.ServiceRunning do
begin
mmolog.Lines.Add('.');
Sleep(defTime);
i := 0;
while i < timeout do
begin
mmolog.Lines[mmolog.Lines.count - 1] := mmolog.Lines[mmolog.Lines.count - 1] + '.';
Sleep(defTime);
Inc(i);
Application.ProcessMessages;
end;
ServiceManager1.StopService;
Sleep(defTime);
end;
while not ServiceManager1.ServiceStopped do
begin
mmolog.Lines.Add('.');
mmolog.Lines[mmolog.Lines.count - 1] := mmolog.Lines[mmolog.Lines.count - 1] + '.';
Sleep(defTime);
Application.ProcessMessages;
end;
if ServiceManager1.ServiceStopped then
begin
Log('Service Stopped SQLSERVERAGENT');
Sleep(defTime);
Log('Stopping Service MSSQLSERVER');
while ServiceManager2.ServiceRunning do
begin
mmolog.Lines.Add('.');
Sleep(defTime);
i := 0;
while i < timeout do
begin
mmolog.Lines[mmolog.Lines.count - 1] := mmolog.Lines[mmolog.Lines.count - 1] + '.';
Sleep(defTime);
Inc(i);
Application.ProcessMessages;
end;
ServiceManager2.StopService;
Sleep(defTime);
end;
while not ServiceManager2.ServiceStopped do
begin
mmolog.Lines.Add('.');
mmolog.Lines[mmolog.Lines.count - 1] := mmolog.Lines[mmolog.Lines.count - 1] + '.';
Sleep(defTime);
Application.ProcessMessages;
end;
if ServiceManager2.ServiceStopped then
Log('Service Stopped MSSQLSERVER');
end;
Log('Status Services SQLSERVERAGENT: ' + BoolToStr(ServiceManager1.ServiceStopped) + ' MSSQLSERVER: ' + BoolToStr(ServiceManager2.ServiceStopped));
end;

Para la utilización del TServiceManager además hay que crear los objetos:


uses
ServiceManager, WinSvc;


procedure Destroy();
begin
FreeAndNil(ServiceManager1);
FreeAndNil(ServiceManager2);
FreeAndNil(IniFile);
end;

procedure Create();
begin
ServiceManager1 := TServiceManager.Create();
ServiceManager2 := TServiceManager.Create();
end;

  • Enlaces de interés:
Stop Service MSSQLSERVER.
Get Computer name.

0 comments:

Post a Comment