Entwickler-Ecke
Windows API - Dienst .... kann nichts...
einfach112 - Do 20.08.09 18:29
Titel: Dienst .... kann nichts...
Hallo ! habe einen einfach dienst gemacht, der prüfen soll ob bestimmte dateien vorhanden sind ....
bzw. das wollte ich machen ....
der dienst wird gestartet .... soweit so gut .... das Problem ist das ich in einen Specialfolder muss !
das heisst z.B. Desktop oder eigene Dateien usw.....
Problem ist das ich dafür dann den Pfad z.B. zum Desktop wissen müsste ....
Leider funktioniert weder das auslesen der registry im bereich current_user ......explorer/shell folders
noch irgendwas im GetSpecialFolder bereich....
Es scheint also daran zu liegen das mein Dienst anscheinend nicht im Admin modus läuft !
denn sonst sollte ja das auslesen im current_user bereich möglich sein !
Hat jemand eine Idee wie ich das nun also wenn es daran liegen sollte als admin zum laufen bekomme !?
Vielen dank wie immer im voraus !
mfg
einfach112
Moderiert von
Narses: Topic aus Dateizugriff verschoben am Do 20.08.2009 um 19:12
Xentar - Do 20.08.09 19:36
einfach112 hat folgendes geschrieben : |
Es scheint also daran zu liegen das mein Dienst anscheinend nicht im Admin modus läuft !
denn sonst sollte ja das auslesen im current_user bereich möglich sein !
Hat jemand eine Idee wie ich das nun also wenn es daran liegen sollte als admin zum laufen bekomme !? |
Quatsch..
Überleg nochmal ganz genau, was ein Dienst ist..
Ein Programm, das schon gestartet wird, wenn überhaupt KEIN User angemeldet ist.
Und du versuchst nun, den SpecialFolder eines ANGEMELDETEN Users auszulesen.
na, fällt dir was auf?
Tipp: Entwickel keinen Dienst, sondern z.B. eine Anwendung die im Tray läuft.
Edit:
Soweit ich weiß, ist es auch seit Windows Vista überhaupt nicht mehr möglich, mit dem User zu interagieren. Dementsprechend kommst du auch nicht mehr an die Spezialordner des angemeldeten Users - weil u.U. überhaupt niemand angemeldet ist.
Delete - Do 20.08.09 22:27
Da fehlt wieder Grundwissen. Ein Dienst läuft im Kontext des Systemkontos und natürlich nicht im Kontex irgendeines angemeldeten Benutzers, denn genau deswegen ist es ja ein Dienst.
Man könnte jetzt versuchen herauszufinden, ob eibn Benutzer angemeldet ist. Aber auch das ist problematisch, ja mehr als ein Benutzer angeneldet sein kann. Welchen Benutzer hätten wir dann gerne? ;)
Wenn ein Programm benutzerspezifische Aufgaben erledigen soll, dann muss es auch im Kontext des jeweiligen Benutzers laufen, um Zugriff auf die benötigten Ressourcen zu haben. Du musst also eine ganz einfache Benutzeranwendung schreiben, die eben ausgeführt wird, wenn sich ein Benutzer anmeldet, also Autorun des betreffenden Benutzers liegt.
Richtig unter Vista gibt es keine aktiven Diesnte mehr, aus Sicherheitsgründen, da eine direkte Interaktion aus dem Benutzerkontext mit einem Dienst im Systemkontext bedeutet, dass die Anweisungen im Systemkontext, also mit erhöhten Rechten ausgeführt wird. Und dies bedeutet natürlich eine Sicherheitslücke. Microsoft empfiehlt, daher auch unter anderen Systemen keine Interaktivendienste zu implenmetieren.
einfach112 - So 23.08.09 00:01
ARGH ! LOL THX 4 BACKUP !
einfach112 - So 23.08.09 00:12
mmhhh komig ....
also ich habe meinen dienst beendet ! /über die verwaltung !
dann habe ich den dienst ebenfalls wieder über die verwaltung gestartet ! also bin ich ja angemeldet !
nun lasse ich wie gesagt z.B. den reg-schlüssel auslesen :HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
dort sagt er mir dann aber immer noch das dort nix ist ?! also der schlüssel wird gefunden ! aber der inhalt wird nicht ausgegeben !
vieleicht ein fehler im quelltext ?
hier mal was ich habe :
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| procedure TService2.Timer1Timer(Sender: TObject); var reg: TRegistry; var1: String; begin timer1.Enabled:=false; reg := TRegistry.Create(KEY_READ); try reg.Rootkey := HKEY_CURRENT_USER; if reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders', False) then begin var1 := reg.ReadString('Desktop'); reg.CloseKey; end else ShowMessage('Schlüssel konnte nicht geöffnet werden.'); finally reg.Free; end; if var1 = '' then begin timer1.Enabled:=true; showmessage('timer neu gestartet !') end else showmessage(var1); end; |
bekomme halt jetzt immer die showmessage Timer neu gestartet ! ?
MfG
speedseller112
Delete - So 23.08.09 04:11
Noch mal, der Registryschlüssel ist nicht der Schlüssel des angenmeldeten Benutzers. Sondern der Schlüssel der zu dem Benutzer gehört in dessen Kontext der Prozess läuft. Und jetzt guck mal unter welchen Benutzerkonto dein Dienst läuft. Der läuft nicht in dem Benutzerkontext unter dem du dich angemeldet hast, sondern unter dem Benutzerkontext System, das ist das Benutzerkonto deines Dienstes. Und der Schlüssel HKCU vom Benutzer System ist eben nicht der Registryschlüssel HKCU unter dem du dich als interaktiver Benutzer angemeldet hast.
Ich lege dir noch mals ans Herz dich erstmal mit den Interna von Windows vertraut zu machenns besondere was Dienste und die Sicherheit (Windows Stations, Benutzerverwaltung, Benutzerkontext, Anmeldung/Abmeldung 8also was da passiert und warum es passiert), (Prozess)Tokens, ...) angeht, anders wirst du auf keinen grünen Zweig kommen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!