2017-12-10 4 views
1

Ich habe das gleiche Python-Skript für verschiedene Benutzer auf meinem PC (Windows 10). Dieses Skript muss den Benutzer abrufen, der tatsächlich angemeldet ist. Beispielsweise funktioniert getpass.getuser() nicht, da es nur den Benutzer zurückgibt, für den das Python-Skript ausgeführt wird. Wie kann ich das bekommen? Danke für die Hilfe!Python - Holen Sie sich die Sitzung Benutzer

+0

Was meinen Sie, wo der 'Python-Benutzer läuft'? – user1767754

+0

Nein welcher Benutzer tatsächlich angemeldet ist – Frostie

Antwort

2

Der ganze Sinn der Ausführen als ... ist die Umgebung eines anderen Benutzers so, natürlich zu imitieren, wenn Sie für den Benutzernamen abfragen (die Sie im Wesentlichen erhält den Wert von %USERNAME% env. Variable) erhalten Sie, der, unter dem Sie das Skript ausführen.

Um den aktuell angemeldeten Benutzer zu erhalten, müssen Sie die aktuelle Sitzung starten, und dazu müssen Sie mindestens WMIC abfragen (oder direkt auf die Win32-API zugreifen). Etwas wie:

import subprocess 

def get_session_user(): 
    res = subprocess.check_output(["WMIC", "ComputerSystem", "GET", "UserName"], 
            universal_newlines=True) 
    _, username = res.strip().rsplit("\n", 1) 
    return username.rsplit("\\", 1) 

Beachten Sie, dass dies ein Tupel zurück, sowohl die System/Domain des aktuell angemeldeten Benutzer und den Benutzernamen selbst enthalten, so nennen es als:

system, username = get_session_user() 

beide Um .

+0

Wenn Sie PyWin32 installiert haben, können Sie auch 'username = win32ts.WTSQuerySessionInformation (None, -1, win32ts.WTSUserName)' verwenden. – eryksun

+0

Oder verwenden Sie ctypes, wenn PyWin32 nicht installiert ist: 'wtsapi32 = ctypes.WinDLL ('wtsapi32', verwenden_letzter_fehler = True);' 'WTSUserName = 5;' 'pbuf = ctypes.c_wchar_p();' 'n = ctypes.c_ulong(); 'success = wtsapi32.WTSQuerySessionInformationW (Keine, -1, WTSUserName, ctypes.byref (pbuf), ctypes.byref (n));' und dann 'falls nicht erfolgreich: raise ctypes.WinError (ctypes.get_last_error ()); 'und schließlich' username = pbuf.value; '' wtsapi32.WTSFreeMemory (pbuf) ' – eryksun

Verwandte Themen