Wie viele Benutzer angemeldet

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
purebas
Beiträge: 127
Registriert: 11.03.2008 23:59
Wohnort: München

Re: Wie viele Benutzer angemeldet

Beitrag von purebas »

Hey Danke nochmal!

Habe den Code noch nicht komplett durchschauen können.
Was ist der Unterschied von XP und späteren Windows-Versionen?

Was für State's würdet ihr zählen, um die Anzahl zu ermitteln?
Sehe ich das mit der SessionId "0" richtig, dass diese nie mitgezählt werden sollte, weil das was mit dem System zu tun hat?
Benutzeravatar
purebas
Beiträge: 127
Registriert: 11.03.2008 23:59
Wohnort: München

Re: Wie viele Benutzer angemeldet

Beitrag von purebas »

Ahhh.... Die Funktion WTSEnumerateSessionsEx gibt es erst seit Win7...

Bei WTSEnumerateSessions ist mir aufgefallen, dass ich alle Einträge mit
pWinStationName = "Console" und mit State "0" und State "1" oder
pWinStationName = "" und mit State "4" zählen muss.

Ich muss aber erst noch mit Win8 testen, ob das dort auch so der Fall ist.
Benutzeravatar
jpd
Beiträge: 380
Registriert: 14.02.2005 10:33

Re: Wie viele Benutzer angemeldet

Beitrag von jpd »

Hi purebas,
purebas hat geschrieben: Was ist der Unterschied von XP und späteren Windows-Versionen?
Brief Description

In Windows XP®, Windows Server® 2003, and earlier versions of the Windows® operating system, all services run in the same session as the first user who logs on to the console. This session is called Session 0. Running services and user applications together in Session 0 poses a security risk because services run at elevated privilege and therefore are targets for malicious agents that are looking for a means to elevate their own privilege levels.
The Windows Vista® and Windows Server® 2008 operating systems mitigate this security risk by isolating services in Session 0 and making Session 0 non-interactive. In Windows Vista and Windows Server 2008, only system processes and services run in Session 0. The first user logs on to Session 1, and subsequent users log on to subsequent sessions. This approach means that services never run in the same session as users' applications and are therefore protected from attacks that originate in application code.
hier mehrere details:

http://msdn.microsoft.com/en-us/library ... 56986.aspx

purebas hat geschrieben: Ahhh.... Die Funktion WTSEnumerateSessionsEx gibt es erst seit Win7...
ja genau :-)

aber zurueck zu deiner start frage:
purebas hat geschrieben: Mit welcher API kann ich herausbekommen, wie viele Benutzer am System angemeldet sind?
Die genaue Anzahl brauche "ich" nicht zu wissen. Mich interessiert nur, ob überhaupt ein
weiterer Benutzer angemeldet ist.
diese neue Variante überprüft wie viele sitzungen offen sind
bei Vista oder höher wird geprüft ob die anzahl der sitzungen mehr als 2 sind bie xp mehr als 1

Code: Alles auswählen

;jpd April 2013

EnableExplicit 

#WTS_CURRENT_SERVER_HANDLE = 0

Prototype  WTSEnumerateSessions(hServer, Reserved, Version, *ppSessionInfo, *pCount)
Prototype  WTSFreeMemory(pMemory)

Global WTSEnumerateSessions.WTSEnumerateSessions
Global WTSFreeMemory.WTSFreeMemory

Procedure.i wtsapi32_LoadDLL()
  Protected.i hDLL
  
  hDLL = OpenLibrary(#PB_Any, "wtsapi32.dll")
  If hDLL <> 0
    
    WTSFreeMemory = GetFunction(hDLL, "WTSFreeMemory")
    
    
    CompilerIf #PB_Compiler_Unicode
      
      WTSEnumerateSessions = GetFunction(hDLL, "WTSEnumerateSessionsW")
      
    CompilerElse
      
      WTSEnumerateSessions = GetFunction(hDLL, "WTSEnumerateSessionsA")
      
    CompilerEndIf
    
    ProcedureReturn hDLL
  EndIf
  
  ProcedureReturn #False
EndProcedure

Procedure.b MoreAsOneUser()
  
  Protected WTSHandle.i
  Protected Version=1
  Protected Filter=0
  Protected *SessionInfo
  Protected pCount
  Protected Ret, i
  
  Ret=WTSEnumerateSessions(WTSHandle, #Null, Version,@*SessionInfo,@pCount)
  
  If Ret <> 0
    If OSVersion() > #PB_OS_Windows_XP
      If pCount > 2
        ProcedureReturn #True
      ElseIf OSVersion() = #PB_OS_Windows_XP
        If pCount > 1
          ProcedureReturn #True
        EndIf
      EndIf
    EndIf
    
    WTSFreeMemory(*SessionInfo)
    
  EndIf
  
  ProcedureReturn #False
  
  
EndProcedure


Define.i hDLL



hDLL=wtsapi32_LoadDLL()

If hDLL=0
  End
EndIf


Debug MoreAsOneUser()
CloseLibrary(hDll)


purebas hat geschrieben: NetWkstaUserEnum gibt die Anzahl der angelegten Benutzerkonten zurück.
das ist falsch, Shardik hatte schon recht.
Die Routine zeigt schon an welche Benutzer angemeldet sind aber zeigt nicht an in welcher Sitzung.

Ciao
jpd
ts-soft hat geschrieben: :allright:
Ich hab es auch noch ein bissel angepasst, jetzt klappts auch mit 64-Bit und EnableExplicit.
Vielen Dank!
PB 5.10 Windows 7 x64
Benutzeravatar
purebas
Beiträge: 127
Registriert: 11.03.2008 23:59
Wohnort: München

Re: Wie viele Benutzer angemeldet

Beitrag von purebas »

Merkwürdig. Bei mir zeigt NetWkstaUserEnum die angelegten Benutzerkonten. Ich kann nicht erkennen, ob die nun angemeldet sind oder nicht. ???

Und eben habe ich mitbekommen, dass unter XP WTSEnumerateSessions nur mit Adminrechten korrekt liefert. Aber das wäre in diesem Fall für mich nicht so von Bedeutung, da es sich um ein Deinstall-Prog handelt, welches sowieso unter Adminrechten laufen muss.

Zum genauen Zählen:

Falls ich die genaue Anzahl bräuchte, so müsste man WinStationName prüfen, ob der Wert "" oder "Console" ist. Bei "" müsste man zusätzlich den State auf 4 prüfen. Bei "Console" zählt man die State's 0 und 1. Habe alle Kombinationen getestet. Win8, Win7, XP, XP über Virtual-PC und Win7-Remote-Desktopverbindung. Schöner ist schon, wenn der Hinweis für den Anwender lautet, es sind so und so viele Benutzer angemeldet, als der Hinweis, dass mindestens noch ein weiterer Benutzer.... Aber ein mulmiges Gefühl beim dabei trotzdem, weil ich nicht weiß, warum nur beim aktiven Benutzer beim WinStationName "Console" steht. Wer weiß, ob es weitere Kombinationen gibt, wo WinStationName = "" ist. So ganz kann ich mir das nicht erschließen. Auf alle Fälle muss man ganz schön aufpassen, weil bei Virtual-PC oder Remote-Desktop noch Tcp-Sessions laufen, die zwar die Anzahl erhöhen, wo aber kein weiterer Benutzer dahintersteckt.

Wie auch immer ich bin sehr glücklich über die Hilfe hier.
Benutzeravatar
purebas
Beiträge: 127
Registriert: 11.03.2008 23:59
Wohnort: München

Re: Wie viele Benutzer angemeldet

Beitrag von purebas »

Ach nein.... NetWkstaUserEnum zeigt doch die angemeldeten Benutzer an.
Ich hatte durch das viele Testen wohl beim ersten mal übersehen, dass mehrere Benutzer angemeldet waren. :oops:

Was bedeutet es eigentlich, wenn bei dieser Funktion ein User mehrfach vorkommt?
Benutzeravatar
jpd
Beiträge: 380
Registriert: 14.02.2005 10:33

Re: Wie viele Benutzer angemeldet

Beitrag von jpd »

Hi Purebas,

möglicherweise ist Benutzer A mehrmals angemeldet in unterschiedliche Session?
oder in einer Session von einen anderen Benutzer B wurde ein Prozess gestartet (RunAs) als User A
oder ein dienst ist gestartet das mit den recht des User A arbeitet?

wenn ich wieder mal Zeit habe werde beide Beispiele zusammenfassen und eine GUI spendieren :-) dann könnte man genau erkennen wer wo wie am System angemeldet ist.

Ciao und schönes Wochenende

jpd
PB 5.10 Windows 7 x64
Benutzeravatar
purebas
Beiträge: 127
Registriert: 11.03.2008 23:59
Wohnort: München

Re: Wie viele Benutzer angemeldet

Beitrag von purebas »

Offenbar merkt sich Windows alle "Verbindungen". Die werden immer wieder durch NetWkstaUserEnum aufgelistet, auch wenn die Benutzer längst wieder abgemeldet wurden. Selbst wenn nur ein Programm per RunAs gestartet und wieder beendet wurde, wird anschließend der entsprechende RunAs-Benutzer aufgelistet. Also kann ich NetWkstaUserEnum in meinem Programm nicht einsetzen.

Ich nehme doch besser WTSEnumerateSessions. :mrgreen:

Dabei zähle ich die "Console" mit State 0 und 1 und alle unbenannten WinStationName'n mit State 4.

Ich mache das deshalb so, weil ich feststellte, dass bei aktivierter Remote-Desktop-Option ein weiterer Eintrag "RDP-Tcp" aufgelistet wird. Wenn ich also einfach nur auf >1 oder >2 vergleiche, dann kann es je nach Systemeinstellung bedeuten, dass es falsch ist. Es könnte einfach nur ein Benutzer gestartet und zusätzlich zum Beispiel systemseitig diese Remote-Desktop-Option aktiviert sein. Wer weiß, was es da noch so für Optionen gibt, was die Gesamtanzahl der Sessions erhöht.

Bis jetzt liefen alle Tests einwandfrei.
Benutzeravatar
purebas
Beiträge: 127
Registriert: 11.03.2008 23:59
Wohnort: München

Re: Wie viele Benutzer angemeldet

Beitrag von purebas »

Ich habe noch eine Info zum Thema ergoogeln können:
http://stackoverflow.com/questions/1445 ... tesessions

Dort wird als Lösung vorgeschlagen nach WTSEnumerateSessions zusätzlich mit WTSQuerySessionInformation den Benutzernamen zu ermitteln. Wenn es einen Benutzernamen gibt, dann entspricht die SessionId eindeutig einem angemeldeten Benutzer. Wenn der Benutzername = "" ist, dann zählt man den Eintrag nicht mit.

Jetzt brauche ich die PB-Syntax von WTSQuerySessionInformation. /:->
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Wie viele Benutzer angemeldet

Beitrag von RSBasic »

WTSQuerySessionInformation: http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Googlen: WTSQuerySessionInformation site:purebasic.fr
http://www.purebasic.fr/english/viewtop ... =5&t=50657
http://www.purebasic.fr/german/viewtopi ... =8&t=22802

Da sind zwei Beispielcodes. Du musst nur abschreiben. ;)
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
purebas
Beiträge: 127
Registriert: 11.03.2008 23:59
Wohnort: München

Re: Wie viele Benutzer angemeldet

Beitrag von purebas »

Danke!
Antworten