SessionID eines Nutzers auslesen (Windows)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Coder94
User
Beiträge: 6
Registriert: Donnerstag 21. Juni 2018, 12:26

Hallo Leute :)

Ich möchte eine Funktion schreiben die die mir Rückgabewert die aktuelle ID eines beliebigen Nutzers liefert. Ich habe auch schon eine Lösung gefunden.

Code: Alles auswählen

'''
------------------------------------------------------------
Funktion: GetSessionId_User
------------------------------------------------------------

Die Funktion sucht die aktuelle ID eines beliebigen User
aus der Liste aller aktuellen User heraus und gibt diese 
als Rückgabewert zurück.

Anmerkung: Der aktuelle aktive User wird mit einem > vor
           dem Namen gekennzeichnet.

:param user: Name des User dessen SessionID gesucht
             werden soll

:return user_id: Aktuelle SessionID des User

'''


def GetSessionId_User(user: str) -> int:
    os.system('query user > user.txt')
    with open('user.txt', 'r', encoding='UTF-8') as file:
        data = file.read()
    data = data.split()
    index = data.index(user) + 2
    user_id = int(data[index])
    return user_id
Mein Problem liegt darin, mir nicht vorstellen zu können, dass es so umständlich sein muss. Das os Modul bietet zwar einige Funktion für das Problem, die aber leider alle Unix spezifisch sind.

Konkret lautet meine Frage: Kennt jemand einen eleganteren Weg?
"Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live." - John Woods
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das query wirst du benutzen müssen, zumindest ohne größere Mengen an Win32 calls in ctypes zu wrappen. Aber wenn du das in der Doku seit >10 Jahren als überholt markierte os.system mit subprocess ersetzt, kannst du die Daten abgreifen über die Standardausgabe statt eine extra Datei anlegen und auslesen zu müssen. Und wenn du das doch tun musst (Windows kann komisch sein mit stdin/out), dann nimm besser eine temporäre Datei die zufällig benannt ist.
Benutzeravatar
__blackjack__
User
Beiträge: 13080
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Also eleganter wäre zumindest schon einmal nicht `os.system()` zu verwenden und eine Datei anzulegen. Mit dem `subprocess`-Modul kann man die Ausgabe direkt vom Prozess auslesen und kann ``query`` direkt starten, ohne eine unnötige Shell dazwischen. Und man könnte die Abfrage schon auf den gewünschten Benutzer beschränken, statt alle abzufragen. Und dann nicht einfach nach dem Benutzer suchen und zwei Felder weiter gehen, denn wenn der Benutzer einen ”komischen” Namen hat, kann man da locker mal den falschen Wert erwischen.

Noch eleganter wäre es nicht die Textausgabe von externen Programmen zu parsen, sondern die Programmierschnittstelle zu verwenden, die dafür vorgesehen ist. WTSEnumerateSessionsExA() sieht dafür nicht uninteressant aus. Das ist übrigens ”umständlicher”, aber eben auch *sicher*, weil man nicht vom Textformat einer externen Anwendung abhängig ist, sondern die Schnittstelle benutzt die für Programmierer vorgesehen ist.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Coder94
User
Beiträge: 6
Registriert: Donnerstag 21. Juni 2018, 12:26

__blackjack__ hat geschrieben: Montag 23. Juli 2018, 11:06 Und man könnte die Abfrage schon auf den gewünschten Benutzer beschränken, statt alle abzufragen. Und dann nicht einfach nach dem Benutzer suchen und zwei Felder weiter gehen, denn wenn der Benutzer einen ”komischen” Namen hat, kann man da locker mal den falschen Wert erwischen.
Das Problem kann ich zum Glück umgehen, weil ich in meiner Anwendung kontrolliere, welcher Nutzer explizit gesucht wird.

Vielen Dank für den Tipp mit subprocess. Dadurch wird der Code gleich nochmal 3 Zeilen kürzer.
"Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live." - John Woods
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Die WTS-Api ist beim Standard-PyWin32 mit dabei, man muß nur WTSEnumerateSessions aufrufen.
Antworten