Entwickler-Ecke

Windows API - Dienste starten


zemy - So 27.02.05 19:23
Titel: Dienste starten
Wie kann ich Dienste, die auf manuell stehen und deaktiviert sind, aktivieren?

Habe MySQL und nen Apachen installiert, brauchs aber nich immer. Um Speicher zu schonen und das hochfahren zu beschleunigen habe ich die Dienste auf manuell gestellt und aktiviere sie bei Bedarf über Verwaltung -> Dienste. Wollte das aber gerne in nem Prog :D Hat da jemand ne Idee für? Möglichst gleich mit vollem Quellcode, habe von WinAPI absolut keine Ahnung (btw: kennt jemannd ne gute Addresse für ein Delphi-WinAPI-EINSTEIGERtutorial?)

MfG Zemy


wulfskin - So 27.02.05 19:33

Start->Einstellungen->Verwaltung->Dienste

//Sorry, erst denken, dann schreiben! :roll:


zemy - So 27.02.05 19:35

zemy hat folgendes geschrieben:
... habe ich die Dienste auf manuell gestellt und aktiviere sie bei Bedarf über Verwaltung -> Dienste. Wollte das aber gerne in nem Prog :D
MfG Zemy


So weit war ich auch schon ^^


Larus - So 27.02.05 19:36

lol ich glaub der meinte wie man das von seinem Programm aus machen kann

//Edit Zemy war wohl ein paar sekunden schneller als ich MIST :P


Delete - So 27.02.05 23:16


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
uses
  WinSvc;

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


function ServiceStart(Machine, ServiceName: string): Boolean;
// Machine is UNC path or local machine if empty
var
  h_manager, h_svc: SC_Handle;
  ServiceStatus: TServiceStatus;
  dwCheckPoint: DWORD;
  ServiceArgVectors: PChar;
begin
  h_manager := OpenSCManager(PChar(Machine), nil, SC_MANAGER_CONNECT);
  if h_manager > 0 then
  begin
    h_svc := OpenService(h_manager, PChar(ServiceName),
      SERVICE_START or SERVICE_QUERY_STATUS);
    if h_svc > 0 then
    begin
      if (StartService(h_svc, 0, ServiceArgVectors)) then { succeeded }
      begin
        if (QueryServiceStatus(h_svc, ServiceStatus)) then
        begin
          while (SERVICE_RUNNING <> ServiceStatus.dwCurrentState) do
          begin
            dwCheckPoint := ServiceStatus.dwCheckPoint;
            Sleep(ServiceStatus.dwWaitHint);
            if (not QueryServiceStatus(h_svc, ServiceStatus)) then
              // couldn't check status
              break;
            if (ServiceStatus.dwCheckPoint < dwCheckPoint) then
              break;
          end;
        end;
      end;
      CloseServiceHandle(h_svc);
    end;
    CloseServiceHandle(h_manager);
  end;

  Result := (SERVICE_RUNNING = ServiceStatus.dwCurrentState);
end;

function ServiceStop(Machine, ServiceName: string): Boolean;
// Machine is UNC path or local machine if empty
var
  h_manager, h_svc: SC_Handle;
  ServiceStatus: TServiceStatus;
  dwCheckPoint: DWORD;
begin
  h_manager := OpenSCManager(PChar(Machine), nil, SC_MANAGER_CONNECT);
  if h_manager > 0 then
  begin
    h_svc := OpenService(h_manager, PChar(ServiceName),
      SERVICE_STOP or SERVICE_QUERY_STATUS);
    if h_svc > 0 then
    begin
      if (ControlService(h_svc, SERVICE_CONTROL_STOP, ServiceStatus)) then
      begin
        if (QueryServiceStatus(h_svc, ServiceStatus)) then
        begin
          while (SERVICE_STOPPED <> ServiceStatus.dwCurrentState) do
          begin
            dwCheckPoint := ServiceStatus.dwCheckPoint;
            Sleep(ServiceStatus.dwWaitHint);
            if (not QueryServiceStatus(h_svc, ServiceStatus)) then
              // couldn't check status
              break;
            if (ServiceStatus.dwCheckPoint < dwCheckPoint) then
              break;
          end;
        end;
      end;
      CloseServiceHandle(h_svc);
    end;
    CloseServiceHandle(h_manager);
  end;

  Result := (SERVICE_STOPPED = ServiceStatus.dwCurrentState);
end;


zemy - Mo 28.02.05 20:25

thx, genau das was ich gebraucht habe :D