Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Eine Bitte wg. MSCONFIG aus WinME und 2000 (https://www.delphipraxis.net/397-eine-bitte-wg-msconfig-aus-winme-und-2000-a.html)

MathiasSimmack 13. Jul 2002 13:35


Eine Bitte wg. MSCONFIG aus WinME und 2000
 
Hi Leute.

Ich bräuchte mal eine kurze Info zum Programm MSCONFIG.

Da der nsamaster seinen Autostart-Controller nicht mehr zu aktualisieren scheint, und weil ein anderer Manager ebenfalls Probleme mit deaktivierten Einträgen unter WinXP hat, sitze ich gerade (spaßeshalber) an meinem eigenen Manager. :-) - Ich habe allerdings nur Zugriff auf Win 98 und XP. Bei Win 95 und NT gibt es kein MSCONFIG, daher kann ich die 98er-Technik problemlos übernehmen. Was mich jetzt noch interessiert: wie arbeitet das Tool unter ME und 2000?

Könnte das jemand mal bitte ausprobieren?
Einfach nur mal einen Eintrag deaktivieren und in der Registry nachsehen, nach welchem Prinzip dieser Eintrag deaktiviert wird.

Unter Win98 ist es gleichnamiger Schlüssel mit Minus am Ende, etwa

Zitat:

Zitat von die 98er-Registry
RunOnce-

Unter XP sichert MSCONFIG die Daten allerdings unter HKLM im Pfad

Zitat:

Zitat von die XP-Registry
Software\Microsoft\Shared Tools\MSConfig\startupreg

(Das lässt natürlich auch Schlüsse auf die Nützlichkeit des Tools für Benutzer ohne Admin-Rechte zu, die normalerweise ja nichts im Schlüssel HKLM eintragen können. Aber das ist ein anderes Thema.)

Wenn mir jemand die notwendigen Infos schicken würde, könnte ich mein Tool anpassen und euch dann hier samt Quellcode rüberreichen. Wenn´s euch interessiert, natürlich.

Gruß,
Mathias.

Daniel 13. Jul 2002 13:44

Wo bekomme ich denn MSCONFIG für Windows 2000 her? Wenn ich in der Standard-Installation von Windows 2000 Pro (SP2 / IE6) einfach RUN -> MSCONFIG.EXE eintippe, bekomme ich die Fehlermeldung, dass die angegebene Datei nicht gefunden werden konnte.
Ich habe auch keine derartige Windows-Komponenten gefunden, die ich nachträglich installieren könnte.... :?:

Grüße,
Daniel

MathiasSimmack 13. Jul 2002 14:46

Nanu?

Mir war so, als hätte es bei Win2000 ein MSCONFIG gegeben ... Wenn das nicht der Fall ist, dann soll´s mir recht sein - ein Problem weniger. :-) - Im Ernst, ich hatte gedacht, nur 95 und NT hatten das Programm noch nicht dabei.

Aber bei ME müsste es drin sein. :?:
Gibt es hier ME-User?

Chewie 13. Jul 2002 15:39

Ich bin Ex-ME-User. Da isses dabei.

MathiasSimmack 14. Jul 2002 10:21

Ich habe mal eine Testversion hochgeladen. Wer mal ein bisschen probieren möchte ... Aber - da ich noch keine Info zu Win ME habe, ist das Programm hier normalerweise geblockt. Man kann aber testweise den Parameter "-mewarning" benutzen und das Programm dann doch starten.

Meine Idee wäre noch, dass man z.B. unter NT die Services auflistet. Schau´n wir mal, ob was draus wird.

Wie gesagt: wenn mir jemand die Frage zu Win ME beantworten kann, dann gebe ich auch gern den Quellcode raus, damit ihr selbst einbauen könnt was immer ihr wollt oder braucht. Das Typecasting des TreeView ist nämlich recht flexibel:
Code:
type
  PCast = ^TCast;
  TCast =
    packed record
      dwType : dword;
      pEntry : pointer;
    end;
Der Pointer kann auf beliebige eigene Objekte zeigen. Im Moment nutze ich nur eins für die Registry-Einträge. :-)

Daniel B 14. Jul 2002 10:39

Zitat:

Zitat von MathiasSimmack
Ida ich noch keine Info zu Win ME habe, ist das Programm hier normalerweise geblockt. Man kann aber testweise den Parameter "-mewarning" benutzen und das Programm dann doch starten.

Hi,

ich habe es soeben unter ME ausprobiert. Mit dem Par kann ich es auch starten.
Dann habe ich was in Run geändert, neugestartet und musste festellen dass das jeweilige Prog nicht mehr gestartet wird. Scheint also zu gehen.

MathiasSimmack 14. Jul 2002 10:54

Mit MSCONFIG oder meinem YAAM?

Wenn das ME-MSCONFIG die Schlüssel auch mit einem Minus ausschaltet, wie oben beschrieben, dann wär´s in Ordnung. Theoretisch solltest du dann einen, mit MSCONFIG deaktivierten Eintrag auch in YAAM als deaktiviert vorfinden.

Und genau das interessiert mich. :-)

Daniel B 14. Jul 2002 12:40

Zitat:

Zitat von MathiasSimmack
Mit MSCONFIG oder meinem YAAM?

:?: :?:

Ich hba dieses YAMM.. Dein Post vor mir mit dem Link namen Testversion. Weiter oben gibts doch gar keinen Link.

Noch ne andere frage, beim Programmstart flackert irgendwas so ne sek. lang und dann kommt erst da Fenster. Was ist das?

jbg 14. Jul 2002 12:53

Das flackern wird durch eine SplashForm: TSplashForm hervorgerufen.

MathiasSimmack 14. Jul 2002 13:08

Zitat:

Zitat von Daniel B
Noch ne andere frage, beim Programmstart flackert irgendwas so ne sek. lang und dann kommt erst da Fenster. Was ist das?

Das ist ein hypnotischer Befehl auf dein Unterbewusstsein, der dir befiehlt: "Kauf YAAM! Es ist großartig!" :twisted:

Nein, im Ernst. Es ist -
Zitat:

Zitat von jbg
Das flackern wird durch eine SplashForm: TSplashForm hervorgerufen ...

... mit einem Progressbar. Für den Fall, dass jemand eine ellenlange Liste an Einträgen haben sollte. Es sieht nämlich nicht so gut aus, wenn man das Programm startet, es aber erst eine Sekunde oder noch später erscheint, weil´s dann erst mit dem Einlesen fertig ist. :-)

@Daniel: Mach doch mal den Test. Starte MSCONFIG, deaktiviere irgendwas und schau dann nach ob YAAM den Eintrag findet. Wenn ja, dann ist das Prinzip mit dem von Win98 vergleichbar und ich kann die Blockierung für ME aufheben. (In der Registry müsste dann z.B. ein Schlüssel wie "Run-" usw. zu finden sein.) Wenn YAAM den deaktivierten Eintrag nicht findet, dann schau mal in die ME-Registry, ob das MSCONFIG vielleicht auch so einen Eintrag wie unter XP anlegt. Das wäre sehr nett von dir.

Gruß,
Mathias.

Daniel B 14. Jul 2002 13:36

Zitat:

Zitat von jbg
Das flackern wird durch eine SplashForm: TSplashForm hervorgerufen.

Das ist mir schon Klar. Ich wollte nur wissen was da gemacht wird.
Jetzt weiss ich es ja, Hypnose. :mrgreen:

Daniel B 14. Jul 2002 13:44

Zitat:

Zitat von MathiasSimmack
@Daniel: Mach doch mal den Test. Starte MSCONFIG, deaktiviere irgendwas und schau dann nach ob YAAM den Eintrag findet. Wenn ja, dann ist das Prinzip mit dem von Win98 vergleichbar und ich kann die Blockierung für ME aufheben.

Ich hab in MSconfig bei Autostart was weggeklickt, dann übernehemn, dann OK, dann die Abfrage zum Neustart NEIN.

YAMM da immer offen. Hat aber keine änderungen mitbekommen. Ich musste es schliessen und wieder öffnen, dann war auch da die änderung zu sehen.

Ein Schliessen und wieder öffnen des Run -Ordners hatte nichts gebracht.

War es das do wie du es gedacht hattest?

MathiasSimmack 14. Jul 2002 19:41

Hi Daniel.

Klingt, als würde das ME-MSCONFIG das selbe Prinzip wie unter 98 benutzen. Dass YAAM nicht auf Änderungen reagiert, liegt (programmtechnisch) auf der Hand: es ist weder Timer noch Thread drin; und ich fände es auch Quatsch, wenn er z.B. alle 10 Sekunden die Registry neu einliest.
Ich habe stattdessen einen neuen Menüpunkt mit F5-Shortcut (refresh) eingefügt. :-)


Für alle -

Ich habe mal den aktuellen Source hochgeladen. ABER da ist ein Fehler drin.
Mit voller Absicht!

jetzt nicht mehr :wink:

Ich bräuchte nämlich mal Rat von NT-Service-Spezialisten. Ich habe versucht, die PSDK-Beispiele zum Starten, Stoppen und Deinstallieren von Services nachzuvollziehen. Klappt prinzipiell auch. Nur diesen Part mit dem Stoppen abhängiger Services habe ich nicht so richtig gebacken bekommen.
Es ist sicher das selbe Prinzip wie beim Einlesen der Services, aber wenn ich den Code übernehme, bin ich auf max. 500 Services beschränkt.

Hat jemand vielleicht eine bessere Idee, wie man a) das Einlesen der Services flexibler gestalten kann, so dass man vielleicht auch 1000 Dienste einlesen kann und kein "array[0..500]of TEnumServiceStatus" mehr braucht, und b) wie man dann den Teil mit den abhängigen Services lösen kann.


Wie gesagt, beim Kompilieren wird eine Fehlermeldung ausgelöst.
An der Stelle müsste dann der Teil mit den "dependend services" rein.
Das Einlesen mit dem genannten Array passiert übrigens in der Funktion "OpenServices".

So, viel Spaß damit.
Wenn ihr noch Anregungen oder so habt, dann nur her damit!
´n paar Optimierungen im Source sind sicher auch noch möglich. :wink:


Gruß,
Mathias.

@Mods: vielleicht sollte man das Thema jetzt nach "Open Source" verschieben?

Christian Seehase 15. Jul 2002 12:41

Moin Mathias,

also zu a) habe ich eine Idee:

Erstmal dafür sorgen, dass der Buffer nicht reicht, damit die Funktion die erforderliche Grösse ermittelt, und dann den Buffer entsprechend setzten.
Dazu ein kurzer Ausschnitt aus einem Programm von mir, um's zu verdeutlichen:

Code:
      cbBufSize     := 0;
      pStatus       := nil;
      lpResumeHandle := 0;
      EnumServicesStatus(hSCDB,p_fType,SERVICE_STATE_ALL,pStatus,cbBufSize,@pcbBytesNeeded,@lpServicesReturned,@lpResumeHandle);
      lpResumeHandle := 0;
      pStatus  := AllocMem(pcbBytesNeeded);
      try
        cbBufSize := pcbBytesNeeded;
        EnumServicesStatus(hSCDB,p_fType,SERVICE_STATE_ALL,pStatus,cbBufSize,@pcbBytesNeeded,@lpServicesReturned,@lpResumeHandle);
Es gibt ja viele Funktionen, bei denen das klappt ;-)

Sollte sich der Aufruf von Enumservicesstatus von Deinem unterscheiden:
Ich hab' mir die Funktionen selber importiert.

MathiasSimmack 15. Jul 2002 14:06

Hi Chris.

Ähem ... kann man dieses Programm, bzw. diesen Teil daraus mal bekommen? :oops: Mir geht´s nämlich um die Variablendeklarationen und die Frage, wie man dann an die einzelnen Services rankommt. Ich muss gestehen, ich kann mit der entsprechenden Zeile aus dem PSDK
Code:
for ( i = 0; i < dwCount; i++ )
            {
               ess = *(lpDependencies + i);

               ...
nicht viel anfangen. Daran scheiterte auch die Umsetzung im YAAM. :(


Mathias.

Christian Seehase 15. Jul 2002 14:27

Moin Mathias,

schick mir doch bitte mal 'ne Erinnerungsmail.
Dann kann ich mir das vielleicht heute Abend mal anschauen.

Christian Seehase 16. Jul 2002 14:58

Moin Mathias,

hilft das weiter?

Code:
unit MAIN;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, ComCtrls,winsvc;

type
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

type
  PENUM_SERVICE_STATUS = ^ENUM_SERVICE_STATUS;
  ENUM_SERVICE_STATUS =
    packed record
      lpServiceName : PChar;
      lpDisplayName : PChar;
      ServiceStatus : SERVICE_STATUS;
    end;

type
  TcsEnumServicesStatus = function(
    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;

  TcsEnumDependentServices = function(
    const hService          : DWord;               // handle to service
    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
    ) : Boolean; stdcall;

  TcsOpenSCManager = function(
    const lpMachineName  : PChar;
    const lpDatabaseName : PChar;
    const dwDesiredAccess : DWord
    ) : DWord; stdcall;

const
  SERVICE_ACCEPT_STOP                 = $00000001;
  SERVICE_ACCEPT_PAUSE_CONTINUE       = $00000002;
  SERVICE_ACCEPT_SHUTDOWN             = $00000004;
  SERVICE_ACCEPT_PARAMCHANGE          = $00000008;
  SERVICE_ACCEPT_NETBINDCHANGE        = $00000010;
  SERVICE_ACCEPT_HARDWAREPROFILECHANGE = $00000020;
  SERVICE_ACCEPT_POWEREVENT           = $00000040;
  SERVICE_ACCEPT_SESSIONCHANGE        = $00000080;

var
  EnumServicesStatus   : TcsEnumServicesStatus;
  EnumDependentServices : TcsEnumDependentServices;
  OpenSCManager        : TcsOpenSCManager;

var
  Form1: TForm1;

implementation
{$R *.DFM}

var
  hLib   : DWORD;

procedure TForm1.FormCreate(Sender: TObject);

  procedure AddDependentServices(const p_tnRoot : TTreeNode;const p_sServiceName : string;const p_hServiceDB : DWORD);

  var
    hService : DWORD;
    pStatus           : PENUM_SERVICE_STATUS;
    pWork             : PENUM_SERVICE_STATUS;
    cbBufSize         : DWord;
    pcbBytesNeeded    : DWord;
    lpServicesReturned : DWord;
    i                 : integer;
    tnWork            : TTreeNode;

  begin
    hService := OpenService(p_hServiceDB,PChar(p_sServiceName),SERVICE_ENUMERATE_DEPENDENTS);
    if hService <> 0 then
    begin
      try
        cbBufSize := 0;
        pStatus  := nil;
        EnumDependentServices(hService,SERVICE_STATE_ALL,pStatus,cbBufSize,@pcbBytesNeeded,@lpServicesReturned);
        pStatus := AllocMem(pcbBytesNeeded);
        try
          cbBufSize := pcbBytesNeeded;
          EnumDependentServices(hService,SERVICE_STATE_ALL,pStatus,cbBufSize,@pcbBytesNeeded,@lpServicesReturned);
          pWork := pStatus;
          for i := 1 to lpServicesReturned do
          begin
            tnWork := TreeView1.Items.AddChild(p_tnRoot,pWork.lpServiceName);
            AddDependentServices(tnWork,pWork.lpServiceName,p_hServiceDB);
            inc(pWork);
          end;
        finally
          if Assigned(pStatus) then
          begin
            FreeMem(pStatus,pcbBytesNeeded);
          end;
        end;
      finally
        CloseServiceHandle(hService);
      end;
    end;
  end;

var
  hSCDB             : DWord;
  pStatus           : PENUM_SERVICE_STATUS;
  pWork             : PENUM_SERVICE_STATUS;
  cbBufSize         : DWord;
  pcbBytesNeeded    : DWord;
  lpServicesReturned : DWord;
  lpResumeHandle    : DWord;
  i                 : integer;
  tnWork            : TTreeNode;

begin
  TreeView1.Items.Clear;
  hSCDB := OpenSCManager(nil,nil,SC_MANAGER_ENUMERATE_SERVICE or GENERIC_READ);
  if hSCDB <> 0 then
  begin
    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;
        EnumServicesStatus(hSCDB,SERVICE_WIN32,SERVICE_STATE_ALL,pStatus,cbBufSize,@pcbBytesNeeded,@lpServicesReturned,@lpResumeHandle);
        pWork := pStatus;
        for i := 1 to lpServicesReturned do
        begin
          tnWork := TreeView1.Items.AddChild(nil,pWork.lpServiceName);
          AddDependentServices(tnWork,pWork.lpServiceName,hSCDB);
          inc(pWork);
        end;
      finally
        if Assigned(pStatus) then
        begin
          FreeMem(pStatus,pcbBytesNeeded);
        end;
      end;
    finally
      CloseServiceHandle(hSCDB);
    end;
  end;
end;

initialization
begin
  hLib := LoadLibrary('ADVAPI32.DLL');
  if hLib <> 0 then
  begin
    @EnumServicesStatus := GetProcAddress(hLib,'EnumServicesStatusA');
    if @EnumServicesStatus = nil then raise Exception.Create('EnumServicesStatusA');
    @EnumDependentServices := GetProcAddress(hLib,'EnumDependentServicesA');
    if @EnumDependentServices = nil then raise Exception.Create('EnumDependentServicesA');
    @OpenSCManager := GetProcAddress(hLib,'OpenSCManagerA');
    if @OpenSCManager = nil then raise Exception.Create('OpenSCManagerA');
  end;
end;

finalization
begin
  if hLib <> 0 then
  begin
    FreeLibrary(hLib);
  end;
end;
end.

MathiasSimmack 16. Jul 2002 19:15

Ja. Hat a) weitergeholfen, und ist b) schon eingebaut. 8)

Hier noch mal der Link zum aktuellen Quellcode. Man kann jetzt die Startup-Einträge in der Registry bearbeiten, löschen oder neue hinzufügen; und unter NT-Systemen sollte man nun auch Dienste starten, stoppen und deinstallieren können.

Aber Vorsicht beim Deinstallieren!

Ich habe außerdem noch ein Popup-Menü ergänzt und ein paar Bugs gefixt.
Aber leere Schlüssel werden auch weiterhin nicht gelöscht.

nsamaster 9. Dez 2002 00:40

Bin wieder da!
 
Hallo!

Lange hat's gedauert, aber die neue Version ist schon bald fertig!
Hier der Link: http://switch.dl.sourceforge.net/sou.../AC_v0_1_2.zip

Seht euch nicht so viel um, ich hab mit Sourceforge leider noch nicht soviel zu tun...


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