AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Aktuelles Environment für Dienstemanager bzw. Dienst überneh
Thema durchsuchen
Ansicht
Themen-Optionen

Aktuelles Environment für Dienstemanager bzw. Dienst überneh

Ein Thema von aeberhard · begonnen am 5. Nov 2007 · letzter Beitrag vom 17. Sep 2013
Antwort Antwort
Seite 1 von 2  1 2      
aeberhard

Registriert seit: 5. Nov 2007
Ort: München
4 Beiträge
 
#1

Aktuelles Environment für Dienstemanager bzw. Dienst überneh

  Alt 5. Nov 2007, 21:02
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

Gruß Andreas
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#2

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

  Alt 6. Nov 2007, 08:42
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.
  Mit Zitat antworten Zitat
aeberhard

Registriert seit: 5. Nov 2007
Ort: München
4 Beiträge
 
#3

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

  Alt 6. Nov 2007, 09:44
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 }
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#4

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

  Alt 6. Nov 2007, 10:02
Google mal hier:

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

Registriert seit: 5. Nov 2007
Ort: München
4 Beiträge
 
#5

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

  Alt 7. Nov 2007, 08:09
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
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#6

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

  Alt 7. Nov 2007, 09:34
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.
  Mit Zitat antworten Zitat
aeberhard

Registriert seit: 5. Nov 2007
Ort: München
4 Beiträge
 
#7

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

  Alt 7. Nov 2007, 09:54
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
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#8

AW: Aktuelles Environment für Dienstemanager bzw. Dienst überneh

  Alt 16. Sep 2013, 22:43
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?
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#9

AW: Aktuelles Environment für Dienstemanager bzw. Dienst überneh

  Alt 17. Sep 2013, 06:33
CMD verhält sich da so sandbox artig.
Schau mal, ob dir
Code:
setx
weiterhilft.
http://technet.microsoft.com/en-us/l.../cc755104.aspx
Gruß, Jo
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#10

AW: Aktuelles Environment für Dienstemanager bzw. Dienst überneh

  Alt 17. Sep 2013, 14:52
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:41 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