Wie viele Benutzer angemeldet
Re: Wie viele Benutzer angemeldet
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?
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?
Re: Wie viele Benutzer angemeldet
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.
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.
Re: Wie viele Benutzer angemeldet
Hi purebas,
http://msdn.microsoft.com/en-us/library ... 56986.aspx

aber zurueck zu deiner start frage:
bei Vista oder höher wird geprüft ob die anzahl der sitzungen mehr als 2 sind bie xp mehr als 1
Die Routine zeigt schon an welche Benutzer angemeldet sind aber zeigt nicht an in welcher Sitzung.
Ciao
jpd
purebas hat geschrieben: Was ist der Unterschied von XP und späteren Windows-Versionen?
hier mehrere details: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.
http://msdn.microsoft.com/en-us/library ... 56986.aspx
ja genaupurebas hat geschrieben: Ahhh.... Die Funktion WTSEnumerateSessionsEx gibt es erst seit Win7...

aber zurueck zu deiner start frage:
diese neue Variante überprüft wie viele sitzungen offen sindpurebas 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.
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)
das ist falsch, Shardik hatte schon recht.purebas hat geschrieben: NetWkstaUserEnum gibt die Anzahl der angelegten Benutzerkonten zurück.
Die Routine zeigt schon an welche Benutzer angemeldet sind aber zeigt nicht an in welcher Sitzung.
Ciao
jpd
Vielen Dank!ts-soft hat geschrieben:
Ich hab es auch noch ein bissel angepasst, jetzt klappts auch mit 64-Bit und EnableExplicit.
PB 5.10 Windows 7 x64
Re: Wie viele Benutzer angemeldet
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.
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.
Re: Wie viele Benutzer angemeldet
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.
Was bedeutet es eigentlich, wenn bei dieser Funktion ein User mehrfach vorkommt?
Ich hatte durch das viele Testen wohl beim ersten mal übersehen, dass mehrere Benutzer angemeldet waren.

Was bedeutet es eigentlich, wenn bei dieser Funktion ein User mehrfach vorkommt?
Re: Wie viele Benutzer angemeldet
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
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

Ciao und schönes Wochenende
jpd
PB 5.10 Windows 7 x64
Re: Wie viele Benutzer angemeldet
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.
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.
Ich nehme doch besser WTSEnumerateSessions.

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.
Re: Wie viele Benutzer angemeldet
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.
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.

Re: Wie viele Benutzer angemeldet
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.
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.
