Besteht die Möglichkeit den Guardian aus einem Programm heraus zu schließen? (Mit Hilfe einer Befehlszeile)Das bezieht sich auf Windows Systeme.
Announcement
Collapse
No announcement yet.
Interbase Guardian
Collapse
X
-
Hallo,
ja - über die Win32-API-Funktionen des SCM (Service Control Managers) kann der Dienst programmgesteuert angehalten, gestoppt oder de-installiert werden. Hier im Forum sind einige Beispiele dafür zu finden, wenn nach dem Begriff "<b>OpenSCManager</b>" gesucht wird. Der folgende Auszug demonstriert das Verfahren:
<pre>
procedure TForm1.StopService(const sAPC, sService: String);
var
hSCM : THandle;
hSrv : THandle;
aSrvStatus : TServiceStatus;
const
cERR_NO_SCM = 'Kein Zugriff auf SCM!';
cERR_NO_SRV = 'OpenService für %s ist fehlgeschlagen';
cERR_RUN = 'Der Dienst »%s« läuft!';
cERR_STOP = 'Der Dienst »%s« ist gestoppt!';
cERR_DEL = 'Der Dienst »%s« wurde gelöscht!';
cERR_DIS = 'Der Dienst »%s« wurde deaktiviert!';
begin
hSCM := OpenSCManager(PChar(sAPC), nil, SC_MANAGER_CONNECT);
try
if hSCM = 0 then
raise Exception.Create(cERR_NO_SCM);
hSrv := OpenService(hSCM, PChar(sService), SC_MANAGER_ALL_ACCESS);
if hSrv = 0 then
raise Exception.Create(Format(cERR_NO_SRV, [sService]));
QueryServiceStatus(hSrv, aSrvStatus);
if aSrvStatus.dwCurrentState = SERVICE_RUNNING then
begin
MemoLog.Lines.Add(Format(cERR_RUN, [sService]));
ControlService(hSrv, SERVICE_CONTROL_STOP, aSrvStatus);
Application.ProcessMessages;
Sleep(500);
Application.ProcessMessages;
QueryServiceStatus(hSrv, aSrvStatus);
if aSrvStatus.dwCurrentState = SERVICE_STOPPED then
MemoLog.Lines.Add(Format(cERR_STOP, [sService]));
if CheckBoxDisabled.Checked then
if ChangeServiceConfig(hSrv, SERVICE_NO_CHANGE, SERVICE_DISABLED,
SERVICE_NO_CHANGE, nil, nil, nil, nil,
nil, nil, nil) then
MemoLog.Lines.Add(Format(cERR_DIS, [sService]));
if CheckBoxDeleteService.Checked then
if DeleteService(hSrv) then
MemoLog.Lines.Add(Format(cERR_DEL, [sService]));
end
else
MemoLog.Lines.Add(Format(cERR_STOP, [sService]));
CloseServiceHandle(hSrv);
finally
CloseServiceHandle(hSCM);
end;
end;
</pre>
P.S:: Die Delphi-Unit <b>WinSvc</b> muss dazu eingebunden werden
Comment