AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Getallusers-Pfade: Notlösung

Ein Thema von Go2EITS · begonnen am 14. Sep 2006 · letzter Beitrag vom 18. Sep 2006
Antwort Antwort
Seite 2 von 3     12 3      
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#11

Re: Getallusers-Pfade: Notlösung

  Alt 15. Sep 2006, 00:04
Moin Luckie,

es gibt

CSIDL_PROFILES und CSIDL_PROFILE (ohne s)

Letzterer Wert verweist auf CSIDL_PROFILES\<Username> als HOMEPATH

[EDIT]
Ich hatte Deinen Beitrag zuerst falsch verstanden

Aber:
Da CSIDL_PROFILES erst ab XP zur Verfügung steht, kann man sich, als Basis, mit CSIDL_PROFILE und anschliessendem Abschneiden des Unterverzeichnisses behelfen.
Das klappt allerdings leider auch nicht sicher, da das Profil eines Users ja nicht zwingend unter "Dokumente und Einstellungen" liegen muss.

[/EDIT]
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#12

Re: Getallusers-Pfade: Notlösung

  Alt 15. Sep 2006, 00:07
Ja, da sist mir klar:
CSIDL_PROFILES -> "Dokumente und Einstellungen"
CSIDL_PROFILE -> "Dokumente und Einstellungen\<Benutzername>"

Aber was ist die CLSID für "Dokumente und Einstellungen\All Users"? das ist doch die Frage.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#13

Re: Getallusers-Pfade: Notlösung

  Alt 15. Sep 2006, 00:16
Moin Luckie,

nachdem ich mir jetzt noch einmal die verschiedenen CSIDL-Werte angeschaut habe:
Es gibt reichlich CSIDL_COMMON-Werte, die man benutzen kann.
Man erhält dann zwar eine Verzeichnisebene mehr als nötig, aber die abzuschneiden ist da wohl das kleinere Problem.

Oder man nimmt den "alten" Weg über Umgebungsvariablen.
ALLUSERSPROFILE gibt genau den gewünschten Pfad zurück.
Diese gibt es zumindest seit Windows 2000.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#14

Re: Getallusers-Pfade: Notlösung

  Alt 15. Sep 2006, 13:04
im eigentlichen ging es ja darum alle Nutzer zu finden/aufzulisten. Ich finde man sollte ansetzen das ordentlich hinn zu bekommen und nicht einfach nur auflisten welche Nutzerprofile auf dem Rechner noch vorhanden sind. Zum einen können einige Nutzer schon wieder gelöscht sein, zum anderen gibt es auch die Möglichkeit das sich ein Nutzer noch nicht angemeldet hat und dann exisitert auch der Ordner noch nicht.
Oder hab ich den ersten Beitrag missverstanden und es geht gar nicht darum alle nutzer zu finden?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#15

Re: Getallusers-Pfade: Notlösung

  Alt 15. Sep 2006, 13:25
Wie wär's damit:
Code:
BOOL GetProfilesDirectory(
  LPTSTR lpProfilesDir,
  LPDWORD lpcchSize
);
Requires Windows XP, Windows 2000 Professional, or Windows NT Workstation 4.0
Andreas
  Mit Zitat antworten Zitat
Go2EITS

Registriert seit: 25. Jun 2006
519 Beiträge
 
Delphi 7 Personal
 
#16

Re: Getallusers-Pfade: Notlösung

  Alt 15. Sep 2006, 14:18
@ SirThornberry
Eigentlich möchte ich die alle User, einschließlich dem Pfath:
Administrator
<User1>
<User2>
All Users

und
DEFAULT USER

Dabei sind gelöschte User nicht relevant. (Was will ich auch mit denen?)
Mit der "Notlösung" bekomme ich die Pfade. Der Thread zeigt, dass es nicht so einfach ist. Und klar: Zugriff darauf nur als Admin.

Der Sinn und Zweck ist es, z. B. die Inhalte des Recent-Verzeichnisses oder Temp zu löschen. Also nicht nur die Administrator\Recent sondern auch die betreffenden Verzeichnisse von den Benutzern. (z. B. mich selbst). Ob es sinvoll ist, entscheidet der Admin, der ein "Deepclean" oder "normales" Clean verwenden kann. Dies ist für Backup/Images oder ein schlankes System durchaus sinnvoll, oder auch um Trojaner und Viren zu "vertreiben", die sich, wie ich gesehen habe, sich auch als Kopie in der \TEMP und/oder auch als .tmp getarnt tummeln können.

Hier mal die CSIDL, von denen wohl die Rede ist und meiner Ansicht nach in Luckies Artikel der Vollständigkeithalber gehören würde:

Zitat:
CSIDL_DESKTOP = $0000;
CSIDL_INTERNET = $0001;
CSIDL_PROGRAMS = $0002;
CSIDL_CONTROLS = $0003;
CSIDL_PRINTERS = $0004;
CSIDL_PERSONAL = $0005;
CSIDL_FAVORITES = $0006;
CSIDL_STARTUP = $0007;
CSIDL_RECENT = $0008;
CSIDL_SENDTO = $0009;
CSIDL_BITBUCKET = $000a;
CSIDL_STARTMENU = $000b;
CSIDL_DESKTOPDIRECTORY = $0010;
CSIDL_DRIVES = $0011;
CSIDL_NETWORK = $0012;
CSIDL_NETHOOD = $0013;
CSIDL_FONTS = $0014;
CSIDL_TEMPLATES = $0015;
CSIDL_COMMON_STARTMENU = $0016;
CSIDL_COMMON_PROGRAMS = $0017;
CSIDL_COMMON_STARTUP = $0018;
CSIDL_COMMON_DESKTOPDIRECTORY = $0019;
CSIDL_APPDATA = $001a;
CSIDL_PRINTHOOD = $001b;
CSIDL_ALTSTARTUP = $001d; // DBCS
CSIDL_COMMON_ALTSTARTUP = $001e; // DBCS
CSIDL_COMMON_FAVORITES = $001f;
CSIDL_INTERNET_CACHE = $0020;
CSIDL_COOKIES = $0021;
CSIDL_HISTORY = $0022;
%HomeDir%

Der Code von Luckie funzt einwandfrei. Aber ich bekomme nur "meine" Pfade und die der "All Users"
wenn ich es richtig gesehen habe. Meine "Notlösung" - nur als Admin - greift darüber.

@shmia
Magst Du nicht ein wenig konkreter werden?
Zitat:
BOOL GetProfilesDirectory(
LPTSTR lpProfilesDir,
LPDWORD lpcchSize
);
damit komme ich nicht klar. Wie muss ich was, wo und wann einbinden und wie dann aufrufen?

Eine Lösung für C:\dokumente und einstellungen\ hätte ich auch.
Ich rufe Lukies Code auf und lese zwischen dem erstem Backslash bis zum zweiten Backslash den Text aus. Et voilá: Da haben wir eine universelle Routine.

Wenn der Thread zu einer sauberen Lösung führen würde, dann hat es sich für uns gelohnt. Sonst bleibt nur die Notlösung.

Beste Grüße an die DP!
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#17

Re: Getallusers-Pfade: Notlösung

  Alt 15. Sep 2006, 14:43
Zitat von Go2EITS:
@shmia
Magst Du nicht ein wenig konkreter werden?
Zitat:
BOOL GetProfilesDirectory(
LPTSTR lpProfilesDir,
LPDWORD lpcchSize
);
damit komme ich nicht klar. Wie muss ich was, wo und wann einbinden und wie dann aufrufen?
Na das ist eine Windows API Funktion, die man benutzen kann/sollte.
http://windowssdk.msdn.microsoft.com.../ms713356.aspx
Delphi-Quellcode:
function GetProfilesDirectory(lpProfilesDir:PChar; var lpcchSize:DWORD):wordbool;

function GetProfilesDirectory; external 'userenv.dllname 'GetProfilesDirectoryA';

function LeseBenutzerProfilVerzeichnis:string;
var
   len : DWORD;
begin
   len := 264;
   SetLength(result, len);
   if not GetProfilesDirectory(Pchar(benutzerprofilverz), len) then
      RaiseLastWin32Error;
   SetLength(Result, len);
end;
Das wäre dann der Ersatz für "C:\dokumente und einstellungen", denn das Verzeichnis könnte ja auch "C:\Documents and Settings" oder sonstwie heisen.

PS:
man kann auch NetUserEnum benützen, dann ist es keine Notlösung mehr:
http://www.nldelphi.com/forum/showth...&threadid=6308
Andreas
  Mit Zitat antworten Zitat
Go2EITS

Registriert seit: 25. Jun 2006
519 Beiträge
 
Delphi 7 Personal
 
#18

Re: Getallusers-Pfade: Notlösung

  Alt 15. Sep 2006, 14:56
@Shmia
Vielen Dank!
Das probiere ich in Kürze aus und versuche es in der "Notlösung" einzubauen. Wenn es geht, davon gehe ich aus, sind es klasse Beiträge zum Problem. Super!

Beste Grüße
Go2EITS
  Mit Zitat antworten Zitat
Go2EITS

Registriert seit: 25. Jun 2006
519 Beiträge
 
Delphi 7 Personal
 
#19

Re: Getallusers-Pfade: Notlösung

  Alt 15. Sep 2006, 15:28
Also so geht es leider nicht:
Nach Implementation habe ich:
Function GetProfilesDirectory; external 'userenv.dll' name 'GetProfilesDirectoryA';
Der Compiler meckert: Die Funktion benötigt Ereignistyp...
Das funktioniert also nicht.
Aber
function GetProfilesDirectory(lpProfilesDir:PChar; var lpcchSize:DWORD):Wordbool;external 'userenv.dllname 'GetProfilesDirectoryA'; eingebunden.

Nun Deine Funktion eingefügt:
Delphi-Quellcode:
function LeseBenutzerProfilVerzeichnis:string;
var
   len : DWORD;
   begin
   len := 264;
   SetLength(result, len);
   if not GetProfilesDirectory(PChar(benutzerprofilverz), len) then
      RaiseLastWin32Error;
   SetLength(Result, len);
end;
Benutzerprofilverz ist nicht definiert, also schnell benutzerprofilverz als STRING und als PCHAR
unter Var eingefügt. Compililierung ok. Aber die Ausführung wird mit Exceptions beendet.
Ich habe dann stdcall vor external eingefügt. Aber auch das funzt nicht.

Kannst Du mir bitte weiterhelfen? So können wohl nur die Profis damit etwas anfangen.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#20

Re: Getallusers-Pfade: Notlösung

  Alt 15. Sep 2006, 17:51
Guck mal in der Registry: HLKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 17:31 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