Anzahl der angemeldeten User

  • Hallo zusammen,

    ich brauch die Ausgabe, wie viele User gerade auf einem Server eingeloggt sind.
    Also theoretisch die Zahl, der angemeldeten User.

    Wie im Windows Taskmanager:

    [Blockierte Grafik: http://i57.tinypic.com/33u7gg5.png]

    Code hab ich bisher das. Funktioniert auch meistens aber halt nicht immer. Außerdem hängt es sich auf, wenn ich das länger in einer Schleife abfrage.
    Gibt es da eine bessere Lösung?

    [autoit]

    Func sessions()
    Global $PID, $Ret = ""
    $PID = Run('"' & @ComSpec & '" /c quser', '', @SW_HIDE, 0x2)

    [/autoit][autoit][/autoit][autoit]

    While 1
    $Ret &= StdoutRead($PID)
    If @error Then ExitLoop
    WEnd

    [/autoit][autoit][/autoit][autoit]

    $aAnzahl = StringSplit($Ret, @CRLF, 1) ;$aAnzahl[0]-2 = anzahl der angemeldeten User
    $aAnzahl = $aAnzahl[0] - 2

    [/autoit][autoit][/autoit][autoit]

    EndFunc ;==>sessions

    [/autoit]

    ===========================================
    Friedrich Schiller - Einfachheit ist das Resultat der Reife.

    Einmal editiert, zuletzt von traumhaeftling (20. August 2014 um 09:49)

  • Dass es sich aufhängt wenn du es länger laufen lässt ist normal. Bau mal einen kleinen Sleep(100) oder so in die Schleife, dann stürzt es nicht mehr ab.

    Bist du dir sicher, dass das ausgelesene durch StdoutRead immer mit @CR endet? Das könnte das Ergebnis möglicherweise verfäschen. Bei mir funktioniert es nicht und er schreibt der Befehl ist entweder falsch oder konnte net gefunden werden. Hab grad aber auch keine Zeit das auszubessern weil ich da auch immer ein wenig für brauche bei diesem ComSpec gedöns. Ich denke jedenfalls du solltest vll. die Stdout Ausgabe erstmal in der Console ausgeben lassen und dann schauen ob du so einfach nen Stringplit machen kannst.

    Grüße Yaerox

    Grüne Hölle

  • Alternative wäre über WMI:

    [autoit]

    MsgBox(64, "", "Anzahl eingeloggter User: " & getSessionCount())

    [/autoit][autoit][/autoit][autoit]

    Func getSessionCount()
    Local Static $o_WMI = ObjGet("winmgmts:{impersonationLevel=impersonate}!//.")
    Return $o_WMI.InstancesOf("Win32_ComputerSystem", 0x10).count
    EndFunc

    [/autoit]

    bzw. etwas CPU-freundlicher (vor allem bei Mehrfachaufrufen):

    [autoit]

    MsgBox(64, "", "Anzahl eingeloggter User: " & getSessionCount())

    [/autoit][autoit][/autoit][autoit]

    Func getSessionCount()
    Local Static $o_WMI = ObjGet("winmgmts:\\.\root\cimv2")
    Local Static $o_WMIRefresher = ObjCreate("WbemScripting.Swbemrefresher")
    Local Static $o_ComputerSystem = $o_WMIRefresher.AddEnum($o_WMI, "Win32_ComputerSystem").objectSet

    [/autoit][autoit][/autoit][autoit]

    $o_WMIRefresher.Refresh
    Return $o_ComputerSystem.count
    EndFunc

    [/autoit]

    Ich habe die Objekte mal alle als Static deklariert, da ich ja weiß, dass du die Funktion mehrfach aufrufen willst.
    Bin mir aber nicht 100% sicher ob in Win32_ComputerSystem die Sessions stehen oder nicht. Hab das irgendwo mal gelesen. Ich würde empfehlen, es noch einmal gegen zu checken.

  • AspirinJunkie

    Mit WMI funktioniert das leider nicht. Hab es damals schon selbst probiert und jetzt auch noch deine Skripte.
    Kommt immer 1 raus. Also wahrscheinlich nur ich selbst. Trotzdem danke!

    @Rynow danke! Ich werde das mal durchlaufen lassen und schauen, ob es sich immer noch aufhängt.

    ===========================================
    Friedrich Schiller - Einfachheit ist das Resultat der Reife.

  • Du must das Script natürlich auch auf dem Server starten !

    Oder Zeile 4 (Local Static $o_WMI = ObjGet("winmgmts:\\.\root\cimv2")) in

    Local Static $o_WMI = ObjGet("winmgmts:\\[servername]\root\cimv2")

    ändern. Ausreichende Rechte für "Remote WMI" auf dem Server vorrausgesetzt !

    Edit: Kann ich bestätigen. Script gibt immer 1 zurück, obwohl deutlich mehr Clients verbunden sind.

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

    Einmal editiert, zuletzt von Micha_he (18. August 2014 um 15:09)

  • Ich werde das jetzt mal bis morgen mit dem Sleep durchlaufen lassen und schauen, ob es sich wieder aufhängt. Gebe dann Rückmeldung!

    ===========================================
    Friedrich Schiller - Einfachheit ist das Resultat der Reife.

  • Hallo Zusammen,

    mit dem Sleep scheint es jetzt gut zu funktionieren und es hängt sich nicht mehr auf!
    Vielen Dank an alle!

    ===========================================
    Friedrich Schiller - Einfachheit ist das Resultat der Reife.