![]() |
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 ![]() ![]() 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 |
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:
EDIT:
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; 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. |
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 } |
Re: Aktuelles Environment für Dienstemanager bzw. Dienst übe
|
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 |
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. |
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 |
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? |
AW: Aktuelles Environment für Dienstemanager bzw. Dienst überneh
CMD verhält sich da so sandbox artig.
Schau mal, ob dir
Code:
weiterhilft.
setx
![]() |
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 20:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz