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/)
-   -   Service Beschreibung aus dessen Namen (https://www.delphipraxis.net/94055-service-beschreibung-aus-dessen-namen.html)

Jelly 15. Jun 2007 10:52


Service Beschreibung aus dessen Namen
 
Gibt es eine Möglichkeit, den Beschreibungstext eines Win32 Service anhand seines eindeutigem Namens auszulesen?

SirThornberry 15. Jun 2007 10:56

Re: Service Beschreibung aus dessen Namen
 
meinst du den Namen oder Displaynamen

Jelly 15. Jun 2007 11:01

Re: Service Beschreibung aus dessen Namen
 
Ja

Luckie 15. Jun 2007 11:02

Re: Service Beschreibung aus dessen Namen
 
Sehr geschickt auf eine Oder-Farge mit "ja" zu antworten. :mrgreen: Aber ich dachte, du wolltest den Beschreibungstext? Muss mal gucken, ob ich da was finde.

Guck mal hier: http://www.michael-puff.de/Developer...mServices.html Eventuell kannst du damit ja was anfangen.

SirThornberry 15. Jun 2007 11:07

Re: Service Beschreibung aus dessen Namen
 
die gesuchte Funktion heißt: QueryServiceConfig2

@Luckie, bei dem source von dir kann ichs nicht finden.

Die Beschreibung eines Services anhand des Namen zu setzen geht so:
Delphi-Quellcode:
const
  SERVICE_CONFIG_DESCRIPTION    = 1;

type
  TSERVICE_DESCRIPTION = packed record
    lpDescription: PChar;
  end;
[...]
var
  lDescription   : TSERVICE_DESCRIPTION;
  lManager,
  lServiceHandle : Cardinal;
begin
  lManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  if (lManager <> 0) then
  begin
    lServiceHandle := OpenService(lManager, PChar(Self.Name), SERVICE_ALL_ACCESS);
    if (lServiceHandle <> 0) then
    begin
      lDescription.lpDescription := 'Erlaubt Login erst nach einlegen der richtigen CD.';
      ChangeServiceConfig2A(lServiceHandle, SERVICE_CONFIG_DESCRIPTION, @lDescription);
      CloseServiceHandle(lServiceHandle);
    end;
    CloseServiceHandle(lManager);
  end;
end;
auslesen geht dann ähnlich, musst eben nur die Zeile "ChangeServiceConfig2A(..." sowie die vorherige zeile und dafür die andere Funktion einsetzen.

Luckie 15. Jun 2007 11:30

Re: Service Beschreibung aus dessen Namen
 
Mein Code war ja nur als Ansatz gedacht.

SirThornberry 15. Jun 2007 11:45

Re: Service Beschreibung aus dessen Namen
 
achso :-D (OT: Toller ModThread)

Jelly 15. Jun 2007 12:14

Re: Service Beschreibung aus dessen Namen
 
Zitat:

Zitat von Luckie
Sehr geschickt auf eine Oder-Farge mit "ja" zu antworten. :mrgreen:

Bemüh doch mal deine Glaskugel :zwinker:

Sorry, meinte eigentlich den Displayname.

Es gibt wohl die API Funktion GetServiceDisplayName zu dem Zweck.

Aber folgender Code schmeisst mír eine Access Violoation um die Ohren. Ich hab immer wieder die Probleme mit PChar und Konsorten. Es bedarf wohl nur einer kleinen Änderung, oder ?

Delphi-Quellcode:
function ServiceGetDisplayname (sMachine, sService: string) : string ;
var
  SCManHandle, SvcHandle: SC_Handle;
  SS: TServiceStatus;
  dwStat: DWORD;
  ok : boolean ;
  sDisplayname : PChar ;
  L : cardinal ;
begin
  dwStat := 0;
  // Open service manager handle.
  SCManHandle := OpenSCManager(PChar(sMachine), nil, SC_MANAGER_CONNECT);
  if (SCManHandle > 0) then
  begin
    ok := GetServiceDisplayName (SCManHandle,PChar(sService), sDisplayname, L) ;
    CloseServiceHandle(SvcHandle);
    Result := String(sDisplayname) ;
  end else
    Result := '' ;
end;

Luckie 15. Jun 2007 12:22

Re: Service Beschreibung aus dessen Namen
 
Du musst auch Speicher anfordnern:

Delphi-Quellcode:
uses
  WinSvc;

function ServiceGetDisplayname(sMachine, sService: string; var DisplayName: string): Boolean;
var
  ret              : Boolean;
  SCManHandle      : SC_Handle;
  Buffer           : PChar;
  len              : cardinal;
begin
  ret := False;
  len := 0;
  SCManHandle := OpenSCManager(PChar(sMachine), nil, SC_MANAGER_CONNECT);
  if (SCManHandle > 0) then
  begin
    GetServiceDisplayName(SCManHandle, PChar(sService), nil, len);
    if GetLastError = ERROR_INSUFFICIENT_BUFFER then
    begin
      len := len + 1;
      GetMem(Buffer, len);
      ret := GetServiceDisplayName(SCManHandle, PChar(sService), Buffer, len);
      DisplayName := string(Buffer);
      FreeMem(Buffer);
    end;
    CloseServiceHandle(SCManHandle);
  end;
  Result := ret;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Displayname      : string;
begin
  if ServiceGetDisplayname('', 'NetLogon', Displayname) then
    ShowMessage(Displayname)
  else
    ShowMessage(SysErrorMessage(GetLastError));
end;
Ich habe die Funktion auch gleich noch mal etwas umgeschrieben, damit eine einfachere Fehlerbehandlung möglich wird.

Jelly 15. Jun 2007 15:05

Re: Service Beschreibung aus dessen Namen
 
Danke Luckie... Klappt wunderbar.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:05 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