Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Alle User auslesen (https://www.delphipraxis.net/71480-alle-user-auslesen.html)

Martin K 15. Jun 2006 21:15


Alle User auslesen
 
Hi,
wie kann man denn alle User auslesen?
(Also alle User, die unter Systemsteuerung -> Benutzerkonten zu finden sind)

Hab es schon versucht, einfach alle Ordner in C:\Dokumente und Einstellungen zu nehmen, aber das sind irgendwie viel mehr...

Danke schonmal, für eure Hilfe!

arbu man 15. Jun 2006 21:17

Re: Alle User auslesen
 
Auf Luckies Homepage gibt es da eine Unit die das glaub ich kann.

CalganX 15. Jun 2006 21:21

Re: Alle User auslesen
 
Hi,
guckst du hier. ;)

Chris

Martin K 15. Jun 2006 21:28

Re: Alle User auslesen
 
Danke!

Die Suche hatte ich zwar benutzt, aber irgendwie nichts gefunden :oops:

Martin K 15. Jun 2006 22:10

Re: Alle User auslesen
 
Hi,
Leider ist es doch nicht so einfach, wie ich dachte...

zwei Fragen zu diesem Code:
Geht das auch ohne die JEDIs ?

Ist es irgendwie möglich, hinter bzw. vor den Usernamen Environment-Variablen zu setzen ?
Bsp:
C:\Dokumente und Einstellungen\<Username>\Startmenü

DGL-luke 15. Jun 2006 22:17

Re: Alle User auslesen
 
also äh... du solltest ja irgendwo den benutzernamen als string herbekommen. Mit diesem string kannst du machen, was du willst, also auch
Zitat:

hinter bzw. vor den Usernamen Environment-Variablen [...] setzen
Wenn du nur das Home-Verzeichnis des aktuellen users suchst, wird dir Luckie mit seinem artikel [dp]%Homedir% das unbekannte verzeichnis[/dp] gerne weiterhelfen...

Luckie 15. Jun 2006 23:36

Re: Alle User auslesen
 
Zitat:

Zitat von Martin K
zwei Fragen zu diesem Code:
Geht das auch ohne die JEDIs ?

Jupp. Guckst du hier: http://www.michael-puff.de/dirindex....phi/Sonstiges/ -> MpNTUser.pas

Martin K 16. Jun 2006 12:00

Re: Alle User auslesen
 
Zitat:

Zitat von DGL-luke
also äh... du solltest ja irgendwo den benutzernamen als string herbekommen. Mit diesem string kannst du machen, was du willst, also auch
Zitat:

hinter bzw. vor den Usernamen Environment-Variablen [...] setzen
Wenn du nur das Home-Verzeichnis des aktuellen users suchst, wird dir Luckie mit seinem artikel [dp]%Homedir% das unbekannte verzeichnis[/dp] gerne weiterhelfen...

Hmm... Und wenn ich nicht das Verzeichnis des aktuellen Users will, sondern das von UserX ?
Bsp.:
C:\Dokumente und Einstellungen\UserX\Startmenü

Wie kann man das mit Environment-Variablen lösen ?


@Luckie:
Die Unit sieht ja sehr umfangreich aus, welche Funktion muss ich denn da nehmen?
Kannst Du mir evtl. ein Beispiel geben?

Martin K 17. Jun 2006 17:50

Re: Alle User auslesen
 
push^^

Luckie 18. Jun 2006 12:40

Re: Alle User auslesen
 
Delphi-Quellcode:
uses
  MpuNTUser;


function EnumUserCallback(Username: string; cntUsers: Integer; Data: Pointer): Boolean;
begin
  TListBox(Data).Items.Add(Username);
  Result := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  EnumUsers('', FILTER_NORMAL_ACCOUNT, EnumUserCallback, Listbox1);
end;
Was ist daran jetzt so schwer?

Martin K 18. Jun 2006 14:02

Re: Alle User auslesen
 
@Luckie:
Danke :thumb:

Jetzt muss ich es nur noch irgendwie hinkriegen, bestimmte Ordner von den Usern auszulesen.
Mit Environment-Variablen kann ich ja nur auf All Users oder den aktuellen User zugreifen...
:gruebel:

Martin K 19. Jun 2006 15:54

Re: Alle User auslesen
 
Hm....
Hat denn keiner einen Vorschlag?

Es geht um folgendes:
Wenn ein Programm deinstalliert wird, sollen natürlich die entsprechenden Dateien bei allen Usern aus %AppData%\Mein Programm gelöscht werden.

Dazu lese ich nach Luckie's Methode alle User aus, aber wie geht es dann weiter?
Wie macht ihr so was?

Martin K 20. Jun 2006 22:11

Re: Alle User auslesen
 
Hm...
Ist es denn nicht möglich, einen ordentlichen Uninstaller zu bauen,
der die Einstellungen von allen Usern restlos entfernt (s. vorherige Beiträge) ?

Christian Seehase 20. Jun 2006 22:17

Re: Alle User auslesen
 
Moin Martin,

wenn Du das alles selber machen willst, dann sollte sich Dein Programm schlicht merken unter welchen Usern es gestartet wurde (am Besten inclusive Profilpfad).

Martin K 20. Jun 2006 22:25

Re: Alle User auslesen
 
Zitat:

Zitat von Christian Seehase
wenn Du das alles selber machen willst, dann sollte sich Dein Programm schlicht merken unter welchen Usern es gestartet wurde (am Besten inclusive Profilpfad).

Ja, aber wie denn?

Angenommen ein User hat ziemlich wenig Rechte und kann nur in seinem eigenen User-Verzeichnis schreiben.
Wo soll ich das dann speichern (den Pfad des Users), wenn dieser unter C:\Programme keine Schreib-Rechte hat???

fkerber 20. Jun 2006 22:30

Re: Alle User auslesen
 
Hi!

Selbst wenn du weißt, wo du was löschen wolltest, werden dir wohl bei einem Nicht-Administrator die Rechte dazu fehlen, um die Dateien zu löschen. Im Ordner eines anderen Users zu löschen ist "verboten" und das ist auch gut so ;)


Ciao Frederic

Martin K 20. Jun 2006 22:57

Re: Alle User auslesen
 
Hm...

Natürlich muss die Deinstallation von einem Administrator durchgeführt werden.
Aber ein guter Uninstaller zeichnet sich doch dadurch aus, dass alle Daten, die ein Programm hinterlässt, restlos gelöscht werden - und ich finde, das sollte auch für alle User gelten.

Wo ist denn sonst der Sinn, wenn das Programm (z.B. in C:\Programme) nicht mehr da ist, aber irgendein User noch Einstellungen (z.B. INI-Datei) von diesem Programm in seinen Anwendungsdaten hat?

Aber zum eigentlichen Problem:
Ist es denn nicht möglich, spezielle Pfade (Environment-Variablen) für einen UserX auszulesen - oder geht das nur für die, des aktuellen Users?

MathiasSimmack 21. Jun 2006 06:47

Re: Alle User auslesen
 
Zitat:

Zitat von Martin K
Wo ist denn sonst der Sinn, wenn das Programm (z.B. in C:\Programme) nicht mehr da ist, aber irgendein User noch Einstellungen (z.B. INI-Datei) von diesem Programm in seinen Anwendungsdaten hat?

Das ist gar nicht so unüblich. Die meisten Setups entfernen nur die Daten des angemeldeten Benutzers, und natürlich die Programmdaten, lassen aber die Ordner anderer User in Ruhe. In den meisten Fällen bietet die Firma dann aber eine Art Reinigungstool an, dass der User starten kann, und dass nur seinen Profilordner säubert.

Martin K 21. Jun 2006 12:24

Re: Alle User auslesen
 
Irgendwie gefällt mir das alles nicht, wenn ein Programm nach der Deinstallation noch irgendwo Daten hinterlässt.

Dann ist es wohl doch besser, in die Registry zu speichern...
denn da ist es einfach, die Einstellungen eines Programms bei allen Usern zu entfernen:
Einfach in einer For-Schleife alle Unterschlüssel von HKEY_USERS durchgehen :wink:

freak4fun 21. Jun 2006 13:19

Re: Alle User auslesen
 
Du könntest als Alternative eine Meldung ausgeben, das dein Programm nicht berechtigt war Daten zu löschen und dass man das doch bitte "per Hand" tuen soll. Dann gibst du den/die Ordner an und gut. Hab ich schon öfters gesehen.

MfG
freak

Christian Seehase 21. Jun 2006 15:54

Re: Alle User auslesen
 
Moin Martin,

wenn keine Reste verbleiben sollen, dann wäre es wohl besser keine userspezifischen Daten zu speichern.
Und ich kann kein Problem darin erkennen, dass userspezifische Daten erhalten bleiben können.
Dann kann sich jemand zumindest seine Konfiguration auf ein anderes System retten.
Zumindest sollte bei der Deinstallation die Option für den Erhalt der Daten gegeben sein.
Wenn die Daten im Profil gespeichert werden (wo sie ja auch hingehören), dürfte es ja kein Problem sein, durch alle Profile auf dem Rechner durchzugehen, und zu prüfen, ob sich dort Daten des Programmes befinden.

DGL-luke 21. Jun 2006 16:14

Re: Alle User auslesen
 
Zitat:

Zitat von Christian Seehase
dürfte es ja kein Problem sein, durch alle Profile auf dem Rechner durchzugehen

Darüber diskutieren wir seit anfang des threads und sind zu dem ergebnis gekommen, dass das "as designed" nicht möglich ist.

Christian Seehase 21. Jun 2006 17:06

Re: Alle User auslesen
 
Moin Lukas,

Zitat:

Zitat von DGL-luke
... und sind zu dem ergebnis gekommen, dass das "as designed" nicht möglich ist.

ich kann nur im Moment kein Problem darin sehen mittels FindFirst/FindNext/FindClose durch "Dokumente und Einstellungen" zu gehen. ;-)

Martin K 22. Jun 2006 17:36

Re: Alle User auslesen
 
Zitat:

Zitat von Christian Seehase
ich kann nur im Moment kein Problem darin sehen mittels FindFirst/FindNext/FindClose durch "Dokumente und Einstellungen" zu gehen. ;-)

Naja, das ist doch nun wirklich keine Lösung.

Angenommen ein User hat in seinen Eigenen Dateien (die sind auch in einem Unterordner von Dokumente und Einstellungen) eine INI-Datei, die rein zufällig genauso heißt wie die meines Programms, dann wird die auch gelöscht ...

Nein, es sollte schon irgendwie mit den AppData abhängig von den ausgelesenen Usernamen (Luckies Code) gehen...

Martin K 11. Jul 2006 14:19

Re: Alle User auslesen
 
Hi,

ich habe mich jetzt nochmal näher mit der Registry beschäftigt und v. a. mit der Frage, wie man spezielle Ordner-Pfade von anderen Benutzern (also nicht All Users und nicht der aktuelle User) bekommt.
Natürlich geht es hierbei um den Hauptschlüssel HKEY_USERS:
Unter <Nummer (mit Schleife durchgehen)>\Software\Microsoft\Windows\CurrentVer sion\Explorer und dem Eintrag Logon User Name kann der Benutzername und unter dem Unterschlüssel \Shell Folders können die Pfade der speziellen Ordner herausgefunden werden.

Meine erste Frage:
Kann dies verallgemeinern?
Funktioniert das auch bei älteren Windows-Versionen?

Der Eintrag Logon User Name ist allerdings nicht bei allen Schlüsseln vorhenden, bei folgenden ist er nicht zu finden:
S-1-5-18 //Mischung aus aktueller User, Network Service, WINDOWS
S-1-5-19 //LocalService
S-1-5-20 //NetworkService

Meine zweite Frage:
Kann man die auch verallgemeinern?
(Also dass S-1-5-19 für LocalService und S-1-5-20 für NetworkService steht)?
Auch ältere Win-Versionen?

Meine dritte Frage:
Fangen die Schlüssel für alle anderen Benutzer mit S-1-5-21... an?
Ist das allgemein so?
Auch ältere Win-Versionen?

Dann noch was:
Zu jedem Schlüssel gibt es noch einen Schlüssel der mit der selben Nummer beginnt und dann ein ..._Classes dahinter hat.
Diese enthalten jedoch keine Shell Folders.

Ach ja, und der Schlüssel .DEFAULT enthält dasselbe wie der Schlüssel S-1-5-18.


Wäre jetzt nett, wenn mir jemand bei meinen Fragen helfen könnte oder ist das auslesen der Shell Folders über die Registry evtl. nicht so der gute Weg ?
- Danke schonmal! -

ste_ett 11. Jul 2006 14:38

Re: Alle User auslesen
 
Benutzerspezifische Ordner bekommst du mit
Delphi-Quellcode:
SHGetSpecialFolderLocation()
. :)

Martin K 11. Jul 2006 14:46

Re: Alle User auslesen
 
Zitat:

Zitat von ste_ett
Benutzerspezifische Ordner bekommst du mit
Delphi-Quellcode:
SHGetSpecialFolderLocation()
. :)

Ja ich weiß, aber hier geht es um die benutzerspezifischen Ordner von anderen Benutzern, nicht unbedingt die des aktuellen Benutzers :wink:

Martin K 11. Jul 2006 16:32

Re: Alle User auslesen
 
Hab noch mal genauer (auf einem Rechner, auf dem mehrere Benutzer sind) in die Registry geschaut und festgestellt:
Unter HKEY_USERS sind doch nicht alle Benutzer zu finden.
:(
...sind doch nur: aktueller User, LocalService und NetworkService.

Frage:
Kann man denn überhaupt nicht über die Registry an die Einträge anderer User dran kommen ?
Hat denn jeder User seine "eigene Registry" ?

Wäre nett, wenn mir einer die einzelnen Schlüssel unter HKU genauer erklären könnte.
Zitat:

Zitat von Martin K
S-1-5-19 //LocalService
S-1-5-20 //NetworkService

Meine zweite Frage:
Kann man die auch verallgemeinern?
(Also dass S-1-5-19 für LocalService und S-1-5-20 für NetworkService steht)?
Auch ältere Win-Versionen?


Christian Seehase 11. Jul 2006 18:00

Re: Alle User auslesen
 
Moin Martin,

Zitat:

Zitat von Martin K
Nein, es sollte schon irgendwie mit den AppData abhängig von den ausgelesenen Usernamen (Luckies Code) gehen...

Ich habe nicht gesagt, dass Du einfach jede Datei löschen sollst, die so heisst, wie die Konfigurationsdatei Deines Programmes ;-)

Du kannst doch einfach durch "Dokumente und Einstellungen" gehen, baust Dir damit eine Liste der möglichen "echten" User auf (also ohne "All Users", "Default User" usw.), und gehst dann durch, ob sich dort ein entsprechender Pfad befindet, wie ihn Dein Programm angelegt hat.

Wenn sich das Programm nur userspezifisch installieren lässt, kannst Du fast schon das Filtern weglassen.
Es ist allerdings nicht unüblich bei der Grundkonfiguration, zumindest von Firmenrechnern, alle Programme als lokaler Administrator zu installieren, und zum Schluss dann das Administratorprofil in das Defaultuser-Profil zu kopieren, damit jeder Anwender bei der Anmeldung die Grundkonfiguration zur Verfügung hat. Bei entsprechend erstellten MSI-Installationen kann man sich das zwar sparen, aber die sind nun auch nicht so zahlreich ;-)

Trotzdem:
Ich halte nichts davon einfach solche Dateien zu löschen.

Übrigens hilft Dir "Logon User Name" nicht unbedingt, da der Anmeldename nicht als Profilname auftauchen muss.
Befindet sich der Rechner in einer Domäne, und wird ein Account umbenannt, so ändert sich nicht der Name im Profil, da der Profilpfad durch die User-SID zugeordnet wird, und nicht durch den Anmeldenamen.

Martin K 11. Jul 2006 18:35

Re: Alle User auslesen
 
Danke erstmal für Deine Antwort.
Aber das mit dem Durchsuchen überhaupt gefällt mir nicht so gut.

Ich glaube mit dem auslesen der Shell Folders aus HKU komme ich auch nicht weiter.
Oder gibt es irgendwie die Möglichkeit, spezielle Ordner anderer Benutzer über die Registry zu erhalten ?
Kann man überhaupt auf Einträge anderer Benutzer in der Registry zugreifen???


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