AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Dienste auslesen und ggf. Werte ändern
Thema durchsuchen
Ansicht
Themen-Optionen

Dienste auslesen und ggf. Werte ändern

Ein Thema von F.W. · begonnen am 24. Mai 2004 · letzter Beitrag vom 30. Mai 2004
Antwort Antwort
Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#1

Dienste auslesen und ggf. Werte ändern

  Alt 24. Mai 2004, 21:22
Wie kann man die Dienste (aus der Computerverwaltung) auslesen, stehen die irgendwo in der Registry?
Ich würde nämlich genr ein Prog schreiben, was die Dienste ausliest, in eine Datei speichert (mit dem Wert, ob sie Deaktiviert, auf Manuell oder auf Automatisch gestellt sind) und dann mit den Diensten (auch mit dem Prog ausgelesen auf meinem andern PC) von meinem "großen" vergleicht.

Danke im Vorraus.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Dienste auslesen und ggf. Werte ändern

  Alt 24. Mai 2004, 21:27
http://www.luckie-online.de/Ablage/D...mServices.html
Es sei dir geholfen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#3

Re: Dienste auslesen und ggf. Werte ändern

  Alt 24. Mai 2004, 21:28
IMHO hat Christian Seehase hier mal Code gepostet. Zumindest glaube ich, dass ich den Code von ihm gekla... äh, dass ich von ihm inspiriert wurde ... *g* @Christian?
  Mit Zitat antworten Zitat
Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#4

Re: Dienste auslesen und ggf. Werte ändern

  Alt 24. Mai 2004, 21:42
Danke Luckie!! Das geht schonmal super!

Eine Frage noch, wenn der 2. Wert hinter dem Komma, der mit ausgegeben wird, der Autostarttyp ist, finde ich ich nicht ganz rein, der Autostarttyp ist das Wichtigste! (Neben den Namen der Prozesse )

Aber das hat mich schonmal ein ganzes Stück nach vorn gebracht!
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Dienste auslesen und ggf. Werte ändern

  Alt 28. Mai 2004, 19:37
Moin F.W.,

hier mal ein Beispiel, wie man die sich die Services die als Starttype "Automatisch" haben in einem Memo anzeigen lassen kann.
Da ich teilweise etwas mit Borlands Deklarationen auf dem Kriegsfuss stehe, habe ich einen Teil der Funktionen/Strukturen selber deklariert. Zusätzlich muss noch die Unit WinSvc mit eingebunden werden.

Auf eine Kommentierung habe ich vorerst mal verzichtet. Schau es Dir einfach mal in Ruhe an, und versuch' mal nachzuvollziehen was da passiert.
Eines möchte ich allerdings schon vorab erklären:
Funktionen, die eine bestimmte Buffergrösse erfordern kann man mit gezielt zu kleinem Buffer aufrufen, damit sie einem zurückgeben wieviel Platz sie brauchen. Deshalb tauchen Funktionsaufrufe mehrfach auf.

Delphi-Quellcode:
type
  PENUM_SERVICE_STATUS = ^ENUM_SERVICE_STATUS;
  ENUM_SERVICE_STATUS = packed record
    lpServiceName : PCHAR;
    lpDisplayName : PCHAR;
    ServiceStatus : SERVICE_STATUS;
  end;

  PQUERY_SERVICE_CONFIG = ^QUERY_SERVICE_CONFIG;
  QUERY_SERVICE_CONFIG = packed record
    dwServiceType : DWORD;
    dwStartType : DWORD;
    dwErrorControl : DWORD;
    lpBinaryPathName : PCHAR;
    lpLoadOrderGroup : PCHAR;
    dwTagId : DWORD;
    lpDependencies : PCHAR;
    lpServiceStartName : PCHAR;
    lpDisplayName : PCHAR;
  end;

  function EnumServicesStatus(
    const hSCManager : DWORD;
    const dwServiceType : DWORD;
    const dwServiceState : DWORD;
    const lpServices : PENUM_SERVICE_STATUS;
    const cbBufSize : DWORD;
    const pcbBytesNeeded : PDWORD;
    const lpServicesReturned : PDWORD;
    const lpResumeHandle : PDWORD
    ) : Longbool; stdcall; external 'advapi32.dllname 'EnumServicesStatusA';

  function QueryServiceConfig(
    const hService : DWORD;
    const lpServiceConfig : PQUERY_SERVICE_CONFIG;
    const cbBufSize : DWORD;
    const pcbBytesNeeded : PDWORD
    ) : Longbool; stdcall; external 'advapi32.dllname 'QueryServiceConfigA';

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);

var
  hSCDB : DWORD;
  hService : DWORD;
  pStatus : PENUM_SERVICE_STATUS;
  pWork : PENUM_SERVICE_STATUS;
  pServiceConfig : PQUERY_SERVICE_CONFIG;
  cbBufSize : DWORD;
  dwSaveBufSize : DWORD;
  pcbBytesNeeded : DWORD;
  lpServicesReturned : DWORD;
  lpResumeHandle : DWORD;
  i : integer;

begin
  hSCDB := OpenSCManager(nil,nil,SC_MANAGER_ENUMERATE_SERVICE or GENERIC_READ);
  if hSCDB = 0 then begin
    ShowMessage(SysErrorMessage(GetLastError));
    exit;
  end;
  try
    cbBufSize := 0;
    pStatus := nil;
    lpResumeHandle := 0;
    EnumServicesStatus(hSCDB,SERVICE_WIN32,SERVICE_STATE_ALL,pStatus,cbBufSize,@pcbBytesNeeded,@lpServicesReturned,@lpResumeHandle);
    lpResumeHandle := 0;
    pStatus := AllocMem(pcbBytesNeeded);
    try
      cbBufSize := pcbBytesNeeded;
      dwSaveBufSize := cbBufSize;
      if not EnumServicesStatus(hSCDB,SERVICE_WIN32,SERVICE_STATE_ALL,pStatus,cbBufSize,@pcbBytesNeeded,@lpServicesReturned,@lpResumeHandle) then begin
        ShowMessage(SysErrorMessage(GetLastError));
        exit;
      end;
      pWork := pStatus;
      Memo1.Lines.Clear;
      for i := 1 to lpServicesReturned do begin
        hService := OpenService(hSCDB,pWork.lpServiceName,GENERIC_READ);
        if hService <> 0 then begin
          pServiceConfig := nil;
          cbBufSize := 0;
          pcbBytesNeeded := 0;
          QueryServiceConfig(hService,pServiceConfig,cbBufSize,@pcbBytesNeeded);
          pServiceConfig := AllocMem(pcbBytesNeeded);
          try
            cbBufSize := pcbBytesNeeded;
            if QueryServiceConfig(hService,pServiceConfig,cbBufSize,@pcbBytesNeeded) then begin
              if pServiceConfig.dwStartType = SERVICE_AUTO_START then begin
                Memo1.Lines.Add(pServiceConfig.lpDisplayName);
              end;
            end else begin
              ShowMessage(SysErrorMessage(GetLastError));
            end;
          finally
            if pServiceConfig <> nil then FreeMem(pServiceConfig,cbBufSize);
          end;
        end else begin
          ShowMessage(SysErrorMessage(GetLastError));
        end;
        inc(pWork);
      end;
    finally
      if pStatus <> nil then FreeMem(pStatus,dwSaveBufSize);
    end;
  finally
    CloseServiceHandle(hSCDB);
  end;
end;
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#6

Re: Dienste auslesen und ggf. Werte ändern

  Alt 30. Mai 2004, 20:27
Hab den Code leider erst jetzt ausprobieren können, allerdings auch nur so, an das Projekt komm iczh erst in ein paar Tagen wieder ran (zum intensiven dran rumbasteln!). Ich muss es mal mit dem anderen abgleichen, sonst könnte man wenigstens die Prozesse, von deinem Code suchen und den Autostarttyp auf Automatisch setzen...

...und alle anderen sind manuell bzw. deaktiviert?

Ich werd mir deinen Quellcode nochmal ansehen und drauf zurückkommen, wenn ich Fragen habe, ok?
Also ich versuch's erstmal selbst!

Danke!!
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Dienste auslesen und ggf. Werte ändern

  Alt 30. Mai 2004, 21:08
Moin F.W.,

am Besten schaust Du Dir mal die entsprechenden Dokumentationen im PSDK in Ruhe durch.
Speziell EnumServicesStatus und QueryServiceConfig.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz