Entwickler-Ecke

Windows API - Pfad (CSIDL_PERSONAL) eines anderen Users ermitteln


sa2728 - Di 23.02.10 12:31
Titel: Pfad (CSIDL_PERSONAL) eines anderen Users ermitteln
Hallo,

weiss jemand wie man den Pfad für eigene Dateien eines bestimmten (nicht des eigenen) Users ermitteln kann?

Mit CSIDL_PERSONAL findet man ja nur den Pfad des eigenen Users.

Gruss Andreas


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Di 23.02.2010 um 11:41


delphi10 - Di 23.02.10 13:19

Auf dem gleichen Rechner? Wofür? Wenn das OS rechtemäßig richtig aufgesetzt ist, kannst Du da weder lesen noch schreiben, mein ich.


Narses - Di 23.02.10 13:37

Moin!

user profile icondelphi10 hat folgendes geschrieben Zum zitierten Posting springen:
Auf dem gleichen Rechner? Wofür? Wenn das OS rechtemäßig richtig aufgesetzt ist, kannst Du da weder lesen noch schreiben, mein ich.
Warum sollte das nicht gehen? Wenn dein Programm ein Dienst ist oder Admin-Rechte hat, geht das problemlos. ;)

Aber mir fällt auf anhieb auch nur der Weg über die Registry ein (also User-SID rauspopeln und die Pfad-Ersetzungs-Keys aus der Registry durcharbeiten). Ist aber nicht wirklich gut. :? Warten wir mal auf einen Vorschlag von user profile iconLuckie. ;)

cu
Narses


jaenicke - Di 23.02.10 13:42

Das geht ganz normal über SHGetFolderLocation [http://msdn.microsoft.com/en-us/library/bb762180(VS.85).aspx], nur dass man eben nicht das Token des eigenen Benutzers angibt, sondern das des gewünschten Benutzers. Das muss man sich vorher holen.


sa2728 - Di 23.02.10 13:42

Hallo,

ja, auf dem gleichen Rechner. Ich brauche das, weil ich als Admin mir ein kleines Tool schreiben will, mit dem ich die Daten von Usern (inkl. eigene Dateien, Favoriten, Bookmarks, Outlook.pst, ...) von einem PC auf einen anderen kopieren kann.

Gruss Andreas

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Das geht ganz normal über SHGetFolderLocation [http://msdn.microsoft.com/en-us/library/bb762180(VS.85).aspx], nur dass man eben nicht das Token des eigenen Benutzers angibt, sondern das des gewünschten Benutzers. Das muss man sich vorher holen.


Und wie geht das genau?

Ich habe momentan folgende Funktion, die gut für den eigenen User funktioniert:

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:
function GetSpecialFolder(hWindow: HWND; Folder: Integer): String;
var
  pMalloc: IMalloc;
  pidl: PItemIDList;
  Path: PChar;

begin
  // get IMalloc interface pointer
  if (SHGetMalloc(pMalloc) <> S_OK) then
  begin
    MessageBox(hWindow, 'Couldn''t get pointer to IMalloc interface.',
               'SHGetMalloc(pMalloc)'16);
    Exit;
  end;

  // retrieve path
  SHGetSpecialFolderLocation(hWindow, Folder, pidl);
  GetMem(Path, MAX_PATH);
  SHGetPathFromIDList(pidl, Path);
  Result := Path;
  FreeMem(Path);

  // free memory allocated by SHGetSpecialFolderLocation
  pMalloc.Free(pidl);
end;

Wie müsste ich die ergänzen, um noch den gewünschten Usernamen mit anzugeben?

Gruss Andreas

Moderiert von user profile iconNarses: Zitat- durch Delphi-Tags ersetzt


delphi10 - Di 23.02.10 18:54

user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Moin!

user profile icondelphi10 hat folgendes geschrieben Zum zitierten Posting springen:
Auf dem gleichen Rechner? Wofür? Wenn das OS rechtemäßig richtig aufgesetzt ist, kannst Du da weder lesen noch schreiben, mein ich.
Warum sollte das nicht gehen? Wenn dein Programm ein Dienst ist oder Admin-Rechte hat, geht das problemlos. ;)

cu
Narses

Hmm, von Admin war oben nicht die Rede. Ich bin von einem normalen User ausgegangen.


BenBE - Mi 24.02.10 21:19

Such bei der WinAPI mal nach ImpersonateToken oder wie die Funktion hieß. Und damit den eigenen Prozess- oder Thread-Token auf den anderen User biegen. Nicht probiert; reine Vermutung.