Was ist die Windows-Entsprechung von pwd.getpwnam (Benutzername) .pw_dir?

8

Das Python pwd-Modul bietet Zugriff auf die getpwnam(3) POSIX-API, die verwendet werden kann, um das Home-Verzeichnis für einen bestimmten Benutzer nach Benutzernamen zu ermitteln und festzustellen, ob der Benutzername überhaupt gültig ist. pwd.getpwnam löst eine Ausnahme aus, wenn sie mit einem nicht existierenden Benutzernamen aufgerufen wird.

Zunächst scheint es, als ob das gleiche Ergebnis plattformübergreifend über os.path.expanduser('~username') erreicht werden kann. Es scheint jedoch, dass dies mit Python 2.6 unter Windows XP nicht zu einem Fehler für einen nicht existierenden Benutzernamen führt. Außerdem scheint es auf Python 2.5 unter Windows XP sogar für gültige Benutzer nicht zu funktionieren.

Können diese Informationen unter Windows zuverlässig abgerufen werden? Wie?

    
Jean-Paul Calderone 22.07.2010, 04:30
quelle

4 Antworten

4

Das Lesen der Dokumentation 2.6 zeigt, dass os.path.expanduser() ist unter Windows defekt:

  

Unter Windows wird HOME und USERPROFILE angezeigt   verwendet werden wenn gesetzt, sonst a   Kombination von HOMEPATH und HOMEDRIVE   wird verwendet. Ein anfänglicher ~ Benutzer ist   behandelt, indem man den letzten strippt   Verzeichniskomponente aus dem erstellten   Benutzerpfad oben abgeleitet.

Sagen Sie whaat ? Dies setzt voraus, dass sich alle Benutzerhomes im selben übergeordneten Verzeichnis befinden müssen. Nuh-ugh!

Es war ein bisschen schwierig zu graben, aber hier ist eine Lösung, die einen lokalen Benutzer nach einem bestimmten Namen sucht:

%Vor%     
Nas Banov 22.07.2010, 06:32
quelle
3

Ich bin neu in der Windows-Sicherheit ... aber beim Lesen von MSDN und einigen Blogs scheint mir, dass die Art, wie MS möchte, dass wir mit anderen benutzerspezifischen Daten umgehen, ein Benutzer-Token ist.

Es gab ein nettes Wiki von Keith Brown .Net-Entwicklerhandbuch für Windows-Sicherheit ... Sie finden es immer noch im Google-Cache für "pluralight keith.guidebook"

Fall 1: Wenn Sie kein Benutzerpasswort haben:

Bei lokalen Konten können Sie versuchen, die Windows-Registrierung zu lesen, wie Nas Banov bereits vorgeschlagen hat, und es gibt einige andere Rezepte auf SO oder im Internet.

Ich bin mir nicht sicher, wie sich verschiedene Windows-Versionen für neu erstellte Benutzer verhalten ... diejenigen, die noch nie eine interaktive Sitzung-Anmeldung durchgeführt haben ... erstellt sie automatisch ihre Registrierungs-, Stammordner- und Profildaten? Ich habe einige Tests unter Windows XP durchgeführt und diese Registrierungsschlüssel waren nach dem Erstellen eines lokalen Kontos nicht vorhanden ... aber in diesem Fall können Sie versuchen, es auf Basis der Registrierungswerte All Users zu erraten ... oder einfach fehlschlagen :)

Für Desktop-Anwendungen, wenn die Anwendung als angemeldeter Benutzer ausgeführt wird, benutze ich so etwas, um den Home-Ordner zu erhalten .... und um das Äquivalent von ~ / .local zu erhalten, benutze ich CSIDL_APPDATA für Roaming Profile oder nur CSIDL_LOCAL_APPDATA.

%Vor%

Lesen von Keith Brown Artikel " So erhalten Sie ein Token für einen Benutzer " .. Sie können nach weiteren Möglichkeiten suchen, ein Benutzer-Token ohne Passwort zu erhalten ...

Fall 2: Wenn Sie das Benutzerpasswort haben:

Lesen der MSDN Ich habe das beeindruckende Gefühl, dass ich, wenn ich ein Benutzer-Token habe, seine Ordner bekommen kann, indem ich etwas wie den Code unten anrufe ... aber es hat nicht für mich funktioniert. (nicht sicher warum)

%Vor%

Das ist der Grund, warum ich diesen Code bekommen habe ... was alles andere als perfekt ist, da er Benutzername und Passwort erfordert.

%Vor%

Diese Frage hängt irgendwie zusammen: So finden Sie das echte Benutzer-Home-Verzeichnis mit Python?

    
Adi Roiban 05.03.2011 11:02
quelle
0

Sie könnten die win32api.GetUserName() (nur aktueller Benutzer) oder win32net.NetUserGetInfo() aufrufen. (Jeder Benutzer auf einem Server, einschließlich localhost) route. Letzteres könnte ein wenig langsam sein, da es einige Zeit dauern kann, um diese Informationen vom Betriebssystem zurück zu bekommen.

%Vor%

Alternativ können Sie die Umgebungsvariable USERPROFILE für Windows oder HOME für Unix erweitern, um Informationen über den aktuell angemeldeten Benutzer zu erhalten:

%Vor%     
akira 22.07.2010 04:46
quelle
0

Dies scheint nur für den aktuellen Benutzer zu gelten, aber auf meinem (winxp) Rechner gibt os.path.expanduser('~') mein Home-Verzeichnis zurück.

    
Wayne Werner 22.07.2010 13:07
quelle

Tags und Links