Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Aktuelles Environment für Dienstemanager bzw. Dienst überneh (https://www.delphipraxis.net/102841-aktuelles-environment-fuer-dienstemanager-bzw-dienst-ueberneh.html)

aeberhard 5. Nov 2007 21:02


Aktuelles Environment für Dienstemanager bzw. Dienst überneh
 
Hallo,

habe ein Problem mit einem von mir per Delphi5 installiertem Dienst.

In meinem Delphi-Programm setze ich die Environment-Variable PATH mit zusätzlichen Verzeichnissen von mir
siehe hier
und hier

Dann wird der Dienst per Programm installiert.

Klappt auch soweit alles. In meinem Delphi-Program, in einem neu gestarteten CMD-Fenster
und in einem anderen Delphi-Programm ist die neue Environment-Variable PATH auch aktuell.
Auch im Systemeditor für Umgebungsvariablen ist der Wert aktuell.

Aber der installierte Dienst der danach gestartet wird hat immer noch den alten
Wert in der Variablen PATH, d. h. ohne meine Verzeichnisse!

Hat jemand eine Idee wie ich dem Dienst oder dem Dienstmanager beibringen kann den aktuellen
PATH zu übernehmen?

Bisher funktioniert das nur nach Neustart des Systems. Möchte aber gerne ohne Neustart auskommen.

Danke schon mal :wink:

Gruß Andreas

hathor 6. Nov 2007 08:42

Re: Aktuelles Environment für Dienstemanager bzw. Dienst übe
 
Die anderen Programme müssen von den Änderugen erfahren - Stichwort: BROADCAST.
Vielleicht hilft Dir der folgende Code "auf die Sprünge".

Delphi-Quellcode:
function SetGlobalEnvironment(const Name, Value: string;
  const User: Boolean = True): Boolean;
resourcestring
  REG_MACHINE_LOCATION = 'System\CurrentControlSet\Control\Session Manager\Environment';
  REG_USER_LOCATION = 'Environment';
begin
  with TRegistry.Create do
    try
      if User then { User Environment Variable }
        Result := OpenKey(REG_USER_LOCATION, True)
      else { System Environment Variable }
      begin
        RootKey := HKEY_LOCAL_MACHINE;
        Result := OpenKey(REG_MACHINE_LOCATION, True);
      end;
      if Result then
      begin
        WriteString(Name, Value); { Write Registry for Global Environment }
        { Update Current Process Environment Variable }
        SetEnvironmentVariable(PChar(Name), PChar(Value));
        { Send Message To All Top Window for Refresh }
        SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, Integer(PChar('Environment')));
      end;
    finally
      Free;
    end;
end;
EDIT:
Sorry, sehe gerade, dass der Code in einem Deiner Links auch auftaucht...
Vielleicht solltest Du Deinen Code mal veröffentlichen - kann ja sein, dass andere Programme nicht "richtig aufgeklärt" werden über die Änderungen.

aeberhard 6. Nov 2007 09:44

Re: Aktuelles Environment für Dienstemanager bzw. Dienst übe
 
Hallo hathor,

Danke für deinen Hinweis!

Wie gesagt in der Registry steht der aktuelle Wert, andere Programme bekommen auch den aktuellen wert
nur die Dienste oder auch der Dienstemanager (?) bekommen nicht den aktuellen PATH.

Ist das so vielleicht gewollt von Windows? Um laufende Dienste nicht einen anderen Pfad unterzumogeln?

Nach Neustart ist alles ok, aber dass will ich ja eben vermeiden!
Kann man evtl. den Dienstemanager bzw. den Prozess der die Dienste startet neu "durchstarten"?


So sieht mein Delphi-Code aus
Delphi-Quellcode:
           
SetSystemWideEnvironmentVariable (eoSystem, 'PATH', 'meinpfad');
SetGlobalEnvironment('PATH', 'meinpfad', false);
Delphi-Quellcode:
 
procedure SetSystemWideEnvironmentVariable (aOwner: tEnviromentOwner; aName, aValue: String);
Var
  dwResult: DWORD;
  Reg: TRegistry;
Begin
  Reg := TRegistry.Create;

  With Reg, cEnviromentOwnerRegPlace [aOwner] Do
    Try
      RootKey := Root;
      OpenKey (Key, False);
      WriteExpandString (aName, aValue);

      SendMessageTimeout (
          HWND_BROADCAST, WM_SETTINGCHANGE,
          0, lParam (pChar ('Environment')),
          SMTO_ABORTIFHUNG, 5000, dwResult
        );
    Finally
      Free
    End;
End;

{*********************************************}
{ Set Global Environment Function            }
{ Coder : Kingron,2002.8.6                    }
{ Bug Report : [email]Kingron@163.net[/email]               }
{ Test OK For Windows 2000 Advance Server    }
{ Parameter:                                 }
{ Name : environment variable name           }
{ Value: environment variable Value          }
{ Ex: SetGlobalEnvironment('MyVar','OK')     }
{*********************************************}

function SetGlobalEnvironment(const Name, Value: string;
  const User: Boolean = True): Boolean;
resourcestring
  REG_MACHINE_LOCATION = 'System\CurrentControlSet\Control\Session Manager\Environment';
  REG_USER_LOCATION = 'Environment';
begin
  with TRegistry.Create do
    try
      if User then { User Environment Variable }
        Result := OpenKey(REG_USER_LOCATION, True)
      else { System Environment Variable }
      begin
        RootKey := HKEY_LOCAL_MACHINE;
        Result := OpenKey(REG_MACHINE_LOCATION, True);
      end;
      if Result then
      begin
        WriteString(Name, Value); { Write Registry for Global Environment }
        { Update Current Process Environment Variable }
        SetEnvironmentVariable(PChar(Name), PChar(Value));
        { Send Message To All Top Window for Refresh }
        SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, Integer(PChar('Environment')));
      end;
    finally
      Free;
    end;
end; { SetGlobalEnvironment }

hathor 6. Nov 2007 10:02

Re: Aktuelles Environment für Dienstemanager bzw. Dienst übe
 
Google mal hier:

http://google.com/codesearch?hl=en&l...rl&btnG=Search

aeberhard 7. Nov 2007 08:09

Re: Aktuelles Environment für Dienstemanager bzw. Dienst übe
 
Hi,

Danke für deine Hilfe, hat mich aber nicht wirklich weitergebracht!

Sieht so aus als ob das nicht möglich ist die Dienste dazu zu überreden das neue
Environment zu übernehmen.

Der Benutzer bekommt halt jetzt einen Hinweis neu zu booten damit alles korrekt klappt.

Gruß
Andreas

hathor 7. Nov 2007 09:34

Re: Aktuelles Environment für Dienstemanager bzw. Dienst übe
 
Hast Du es schon manuell versucht:

Start->Ausführen->services.msc /s (eingeben)->OK

Doppelklick auf den gewünschten Dienst - dann 'Beenden', dann 'Starten'.

Wenn es dann auch nicht geht, hilft tatsächlich nur Booten.
Möglicher Grund: Abhängigkeiten von anderen Diensten.

aeberhard 7. Nov 2007 09:54

Re: Aktuelles Environment für Dienstemanager bzw. Dienst übe
 
Hallo hathor,

habe es soeben ausprobiert. Leider kein Erfolg.
So wie es aussieht erben die Dienste von der services.exe das Environment.
Und das bleibt eben bis zum Reboot unverändert.

Trotzdem Danke!
Andreas

hathor 16. Sep 2013 22:43

AW: Aktuelles Environment für Dienstemanager bzw. Dienst überneh
 
Nachtrag fast 6 Jahre später (Wie die Zeit vergeht!):
Environment PATH hat unterschiedliche Einträge bei SYSTEM und USER etc.

Hat jemand eine Idee, wie man beide synchronisieren kann?

Beispiel: Im CMD-Fenster kann ich folgenden String auslesen:
PATH=
C:\DELPHI\RAD Studio\6.0\bin;C:\Users\Public\Documents\RAD Studio\6.0\Bpl;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Windows\system32;C:\Windows;C:\Windows\ System32\Wbem;C:\Windows\System32\WindowsPowerShel l\v1.0\;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\OpenCL SDK\2.0\bin\x86;C:\Program Files (x86)\Intel\OpenCL SDK\2.0\bin\x64;C:\Program Files (x86)\QuickTime\QTSystem\

Ändern mit: path test
PATH=test

Mit dem Delphi-Code:
Memo1.lines.add(GetEnvironmentVariable('PATH'));

bekomme ich immer noch den langen String von oben.

Welchen Delphi-Code muss ich verwenden, um auch im CMD-Fenster den langen String wieder herzustellen?

jobo 17. Sep 2013 06:33

AW: Aktuelles Environment für Dienstemanager bzw. Dienst überneh
 
CMD verhält sich da so sandbox artig.
Schau mal, ob dir
Code:
setx
weiterhilft.
http://technet.microsoft.com/en-us/l.../cc755104.aspx

hathor 17. Sep 2013 14:52

AW: Aktuelles Environment für Dienstemanager bzw. Dienst überneh
 
Vielen Dank für den Link - werde mir die Einzelheiten mal anschauen...

Heute sieht die Sache wieder anders aus:
Wenn ich in Win 8 über den Start-Button (Classic Shell) cmd.exe aufrufe,
bekommt die Titelzeile den Text 'C:\Windows\System32\cmd.exe'.
Der Inhalt von PATH enthält den langen String, wie oben gezeigt.

Wenn ich ein CMD-Fenster über Delphi mit
'ShellExecute(Handle, 'runas', 'cmd.exe', nil, nil, SW_SHOWNORMAL);' starte,
bekommt die Titelzeile den Text 'C:\Windows\SysWOW64\cmd.exe'.
Der Inhalt von PATH enthält den gleichen langen String.

Wahrscheinlich hat Windows 8 den alten String wieder hergestellt und PATH=test gelöscht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:52 Uhr.
Seite 1 von 2  1 2      

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