Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Remote Services listen / neuen Dienst installieren (https://www.delphipraxis.net/21372-remote-services-listen-neuen-dienst-installieren.html)

kroimon 1. Mai 2004 19:57


Remote Services listen / neuen Dienst installieren
 
Hi!

Kann mir jemand erklären, wie ich
  • eine Liste erstellen kann, welche Dienste auf einem Rechner im Netzwerk laufen, und
  • einen neuen Dienst auf diesem Rechner installieren kann?
Ich bin bei Google auf MSDN-Library durchsuchenOpenSCManager gestoßen, kann aber mit der Dokumentation nicht viel anfangen. Auch hier im Forum habe ich nichts passendes gefunden. Kann mir jemand helfen?

*KRO

kroimon 2. Mai 2004 08:49

Re: Remote Services listen / neuen Dienst installieren
 
Weiß keiner wie das geht? :cry:
Ich bräuchte das ziemlich dringend...

*KRO

kroimon 5. Mai 2004 16:09

Re: Remote Services listen / neuen Dienst installieren
 
*push*

[edit=sakura] :warn: Wortwahl das nächste Mal etwas glücklicher treffen ;) Mfg, sakura[/edit]
[Edith kommt in den Post] Na so schlimm war das aber nich... Eher ein Ausdruck meiner Verzweiflung ;) [/Edith verlässt uns wieder]

sakura 5. Mai 2004 16:32

Re: Remote Services listen / neuen Dienst installieren
 
Die Unit in folgendem Beitrag sollte helfen: http://www.delphipraxis.net/internal...?p=59673#59673 (Sorry, nie gesehen :oops: )

...:cat:...

P.S.: :hi:

Christian Seehase 5. Mai 2004 16:50

Re: Remote Services listen / neuen Dienst installieren
 
Moin KRO,

ich hab' hier mal ein Beispiel, wie das geht, aus einem Programm extrahiert:

Delphi-Quellcode:
type
  // für selbstimportierte Funktion erforderlich
  PENUM_SERVICE_STATUS = ^TEnumServiceStatus;

  // Funktion selber importieren, da die Borland Version nur den ersten zugreifbar macht
  function EnumServicesStatus(
    const hSCManager        : DWord;               // handle to SCM database
    const dwServiceType     : DWord;               // service type
    const dwServiceState    : DWord;               // service state
    const lpServices        : PENUM_SERVICE_STATUS; // status buffer
    const cbBufSize         : DWord;               // size of status buffer
    const pcbBytesNeeded    : PDWORD;              // buffer size needed
    const lpServicesReturned : PDWord;              // number of entries returned
    const lpResumeHandle    : PDWord               // next entry
    ) : Boolean; stdcall; external 'advapi32.dll' name 'EnumServicesStatusA';

implementation

{$R *.DFM}

procedure EnumServices(const AsComputerName : string);

var
  hSCDB             : DWORD;
  pStatus           : PENUM_SERVICE_STATUS;
  pWork             : PENUM_SERVICE_STATUS;
  cbBufSize         : DWORD;
  pcbBytesNeeded    : DWORD;
  lpServicesReturned : DWORD;
  lpResumeHandle    : DWORD;
  iCount            : integer;

begin
  Form1.ListBox1.Items.Clear;
  hSCDB := OpenSCManager(
    PChar('\\'+AsComputerName), // Dienste des angegebenen Rechners auslesen
    nil,                        // Standarddatenbank nehmen
    SC_MANAGER_ENUMERATE_SERVICE // Dienste aufzählen (alle durchgehen)
      or                        // ausserdem
    GENERIC_READ);              // genügt es die Daten nur zu lesen
  if hSCDB <> 0 then begin
    try
      // Erforderlichen Speicherplatz für alle Daten von der Funktion ermitteln lassen
      // ==> gezielt mit 0 Byte Buffer fehlschlagen lassen
      cbBufSize     := 0;
      pStatus       := nil;
      lpResumeHandle := 0;
      EnumServicesStatus(hSCDB,SERVICE_WIN32,SERVICE_STATE_ALL,pStatus,cbBufSize,@pcbBytesNeeded,@lpServicesReturned,@lpResumeHandle);
      lpResumeHandle := 0;

      // speicher reservieren
      pStatus  := AllocMem(pcbBytesNeeded);
      try
        cbBufSize := pcbBytesNeeded;
        EnumServicesStatus(
          hSCDB,            // Handle von OpenSCManager
          SERVICE_WIN32,    // Nur Dienste, keine Treiber
          SERVICE_STATE_ALL, // Alle installierten Dienste, egal ob sie laufen oder nicht
          pStatus,cbBufSize,@pcbBytesNeeded,@lpServicesReturned,@lpResumeHandle);
        // Adresse merken, damit der Speicher später wieder freigegeben werden kann, ohne den Pointer
        // wieder zurückrechnen zu müssen
        pWork := pStatus;
        // Alle Dienste in Listbox anzeigen (mit Namen und Anzeigenamen)
        for iCount := 1 to lpServicesReturned do begin
          Form1.ListBox1.Items.Add(pWork.lpServiceName+'/'+pWork.lpDisplayName);
          inc(pWork);
        end;
      finally
        if Assigned(pStatus) then FreeMem(pStatus,pcbBytesNeeded);
      end;
    finally
      CloseServiceHandle(hSCDB);
    end;
  end;
end;
[EDIT]
Nicht die vergessen die Unit winsvc mit einzubinden
[/EDIT]

kroimon 5. Mai 2004 19:17

Re: Remote Services listen / neuen Dienst installieren
 
Cool. Thanx erstma.
Heut hab ich keine Zeit mehr. Werds morgen mal ausprobieren.

*KRO


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf