2008-10-13 6 views
10

Innerhalb eines Dienstes, wie kann ein spezieller Ordnerpfad (z. B. "Eigene Dateien") für einen bestimmten Benutzer am besten ermittelt werden? SHGetFolderPath erlaubt Ihnen, ein Token zu übergeben, also nehme ich an, dass es eine Möglichkeit gibt, die Identität des Benutzers auszugeben, für den Sie sich interessieren.Wie bekomme ich den Pfad eines Windows "speziellen Ordners" für einen bestimmten Benutzer?

Gibt es eine Möglichkeit, dies nur anhand eines Benutzernamens zu tun? Wenn nicht, wie viele Informationen benötigen Sie für das Benutzerkonto? Ich möchte nicht das Passwort des Benutzers erfordern.

(Hier ist ein related question.)

Antwort

2

Ich würde die Registrierungsstruktur des Benutzers bereitstellen und nach dem Pfadwert suchen. Ja, es ist eine suboptimale Lösung, aus allen genannten Gründen (schlechte Vorwärtskompatibilität, etc.). Wie viele andere Dinge in Windows bietet MS jedoch keine API-Möglichkeit, um das zu tun, was Sie tun möchten, also ist es die beste verfügbare Option.

Sie können die SID (nicht GUID) des Benutzers mit LookupAccountName abrufen. Sie können die Registrierungsstruktur des Benutzers mithilfe von LoadUserProfile laden. Dies erfordert jedoch auch ein Benutzer-Token, für das ein Kennwort erforderlich ist. Glücklicherweise können Sie die Struktur manuell mit RegLoadKey an einen beliebigen Ort laden, die Daten lesen und entladen (denke ich).

Ja, es ist ein Schmerz, und ja, es wird wahrscheinlich in zukünftigen Windows-Versionen brechen. Vielleicht hat MS zu diesem Zeitpunkt eine API zur Verfügung gestellt, die es in ältere Windows-Versionen portierte und automatisch über Windows-Update verteilte ... aber ich hielt nicht den Atem an.

P.S.Diese Informationen dienen dazu, die Informationen in Ihrer verwandten Frage, einschließlich der Haftungsausschlüsse, zu verbessern.

-3

Diese Informationen in der Registry im Schlüssel „HKEY_USERS \ S-1-5-21-616815238-485949776-2992451252-3228 \ Software \ Microsoft \ Windows \ gespeichert sind, CurrentVersion \ Explorer \ Benutzer Shell-Ordner ".

Die "S-1-5-21-616815238-485949776-2992451252-3218" ist die GUID des Benutzers. Sie müssen diese GUID abrufen, um den entsprechenden Schlüssel zu finden und ihn zu lesen.

In this Beispiel verwenden sie SHGetFolderPath-Funktion, die Sie erwähnen, und es gibt eine Liste mit allen speziellen Ordnern, die hilfreich sein können.

HINWEIS: Microsoft rät von dem Registrierungsschlüssel zu verwenden, da es immer noch da nur für die Abwärtskompatibilität

+0

Funktioniert das auf allen "aktuellen" Windows-Versionen (ab 2000)? – kgriffs

+0

Ich bin mir nicht sicher, aber da die Funktion von MS unterstützt wird, sollte es funktionieren. In der Praxis lese ich Informationen nur für HKEY_CURRENT USER, nicht für andere. Auch können Sie die Registrierung wie INI-Dateien lesen –

+0

Ich nehme an, die Funktion funktioniert, aber ich fragte mich, ob der Registrierungsschlüssel Pfad der gleiche war ... – kgriffs

11

Bitte ist, gehen Sie nicht in die Registry diese Informationen zu finden. Dieser Speicherort kann sich in zukünftigen Windows-Versionen ändern. Verwenden Sie stattdessen SHGetFolderPath.

http://msdn.microsoft.com/en-us/library/bb762181(VS.85).aspx

Edit: Es sieht aus wie LogonUser das Token für die anderen Benutzer zur Verfügung stellen, die Sie benötigen.

+0

Dies beantwortet jedoch seine Frage nicht wirklich, es sei denn, Sie können eine Möglichkeit bereitstellen, den Ordnerpfad für einen anderen Benutzer als den aktuellen zu erhalten. – Nick

+1

Richtig, ich habe die Antwort bearbeitet. –

3

Sie könnten versuchen, ImpersonateLoggedOnUser() aufrufen, um ein Benutzer-Token für einen anderen Benutzer zu ändern und dann an SHGetFolderPath() übergeben. Basierend auf dem Dokument für ImpersonateLoggedOnUser() scheint es, als könnten Sie LogonUser() aufrufen, um ein Token für einen bestimmten Benutzer abzurufen.

Nur vom Lesen, würde ich vermuten, dass der betreffende Benutzer in irgendeiner Form angemeldet sein muss, damit dies funktioniert. Ich erinnere mich an eine Seite, die besagt, dass die Registrierungsstruktur des Benutzers angehängt werden muss, damit dies funktioniert (was einen gewissen Sinn ergibt).