Windows angemeldete Nutzer anzeigen

Hallo zusammen,

ich suche eine Möglichkeit, um aktuell angemeldete User auf einem Windows-Client anzuzeigen.
Gibt es dort eine Möglichkeit dies auszulesen und an die CheckMK (RAW [Checkmk 1.6.0p18]) Instanz zu übertragen?

Lieben Dank und Gruß.

Es ist möglich ein Script wie das folgende zu verwenden und daraus einen Lokal Check zu bauen welcher einfach der Reihe nach alle angemeldeten Benutzer auflistet.

function get-loggedonuser () {
    $regexa = '.+Name = "(.+)",.+Domain = "(.+)".+'
    $regexd = '.+LogonId = "(\d+)".+'
    $logontype = @{
        "0"  = "Local System"
        "2"  = "Interactive" #(Local logon)
        "3"  = "Network" # (Remote logon)
        "4"  = "Batch" # (Scheduled task)
        "5"  = "Service" # (Service account logon)
        "7"  = "Unlock" #(Screen saver)
        "8"  = "NetworkCleartext" # (Cleartext network logon)
        "9"  = "NewCredentials" #(RunAs using alternate credentials)
        "10" = "RemoteInteractive" #(RDP\TS\RemoteAssistance)
        "11" = "CachedInteractive" #(Local w\cached credentials)
    }

    $logon_sessions = @(Get-CimInstance -ClassName Win32_LogonSession -Property *)
    $logon_users = @(Get-CimInstance -ClassName win32_loggedonuser -Property *)
    $session_user = @{}
    $logon_users | ForEach-Object {
        $_.antecedent -match $regexa > $nul
        $username = $matches[1] + "\" + $matches[2]
        $_.dependent -match $regexd > $nul
        $session = $matches[1]
        $session_user[$session] += $username
    }

    $logon_sessions | ForEach-Object {
        $starttime = $_.starttime
        $loggedonuser = New-Object -TypeName psobject
        $loggedonuser | Add-Member -MemberType NoteProperty -Name "Session" -Value $_.logonid
        $loggedonuser | Add-Member -MemberType NoteProperty -Name "User" -Value $session_user[$_.logonid]
        $loggedonuser | Add-Member -MemberType NoteProperty -Name "Type" -Value $logontype[$_.logontype.tostring()]
        $loggedonuser | Add-Member -MemberType NoteProperty -Name "Auth" -Value $_.authenticationpackage
        $loggedonuser | Add-Member -MemberType NoteProperty -Name "StartTime" -Value $starttime
        $loggedonuser
    }
}

get-loggedonuser

Das Script ist jetzt nicht besonders schön oder sehr toll programmiert hat aber erstmal bei mir einfach alle Benutzer angezeigt welche angemeldet sind.
Achtung es kann je nach Windows Version passieren, dass die Regex Ausdrücke nicht die gleichen sind. Einfach probieren.

1 Like

Das klingt super. Danke.
Welche Sprache o.ä. ist dies (Dateiformat) und wo müsste ich dies ablegen bzw in CheckMK einbinden?

Das ist erstmal ganz normales Powershell. Erstmal testen und dann einen Lokal Check draus bauen.
Im Moment gibt das Script keinen Lokal Check konformen Output aus.

1 Like

Ok, ich habe es mal copy&paste in den PowerShell ISE eingefügt und gestartet. Es gab auch eine sinnvolle Ausgabe darin.
Wie würde der local check für CheckMK aussehen?
Lieben Dank!
ps: ich bin Neuling in CheckMK

Dann schau dir mal die Doku unter https://checkmk.de/cms_localchecks.html an. Dort wird erklärt was “local checks” sind und wie sie funktionieren.

Danke, das habe ich versucht zum Test nachzubauen, aber leider erscheint bei mir kein neuer Service wie in der Anleitung.

Ich habe nun einen anderen Gedanken entwickelt (Betonung auf Gedanken).
Mit einer .bat Datei und dem Inhalt

query user > C:\temp\win-logins.log | type C:\temp\win-logins.log

wird mir eine .log-Datei und den angemeldeten Usern erstellt.

Ist es nun möglich die .log-Datei mit dem Agenten auszulesen und in CheckMK zu übergeben?
Wäre da “logwatch” das richtige Stichwort?
Vielen Dank weiterhin.

This might help: Windows Monitoring RDP Session

While it was about monitoring people logged in via RDP, it actually shows both the RDP users and local logged in users.

1 Like

Thanks a lot. But unfortunately I don’t know what to do with that script. Where to save and how to run and get a result n CheckMK.

Is it possible to push a .bat file every 5min or so with the “query user” command and send it to CheckMK? The manual for own checks is a bit too complicated for me. :frowning:

All the scripts are normal Powershell scripts and should be no problem inside a Windows environment.
The script from @cjcox already produces the needed output as a local check.
You only need to put this script inside your folder with the local checks and that’s it.

Leider habe ich das mit den Local Checks noch nicht hinbekommen oder verstanden.

Wäre es möglich den Code-Ausschnitt in die inventory vbs zu integrieren und in der Inventur auch eine Ausgabe dazu zubekommen?

Danke für das Script von @cjcox.
Allerdings liefert es nicht die wünschten Ergebnisse, sondern leider nur

OK - Active Users(0): Disconnected Users(0):

Leider stimmt die Aussage nicht, da ich per RDP aktiv drauf bin und ich suche eigentlich auch die aktiven Nutzer.

Ich habe es nun mit einer .bat Datei geschustert und in local abgelegt, die den query user Befehl nutzt.

Aktive:

@echo off
for /F “tokens=1,2,3,4,5,6,7” %%A in (’“query user | find “Aktiv””’) DO (
echo 0 logins-aktiv - User: %%A, Status: %%D, Datum: %%F, %%G
)

Dies zeigt auch CheckMK an.

Allerdings werden mit query user nur die Benutzernamen angezeigt, eine Domain\Username Ausgabe wäre wichtiger, bei Domäne-User.

Mit whoami kommt in CheckMK leider nur nt-autorität\system an.
Welche Alternativen gäbe es noch?

Besten Dank.

Keep it simple.

In meiner logins.bat im local Ordner steht nun ganz einfach und knapp folgendes, welches auch Domain\Username ausgibt und an CheckMK weitergibt.

@echo off
echo 0 logins-aktiv - User: %USERDOMAIN%\%USERNAME%

Damit sehe ich, wer aktiv am PC arbeitet und wen ich ansprechen kann.
Nutzer die im Hintergrund noch angemeldet sind (zum Glück) in meinem Fall nicht relevant.

Kleiner Schönheitsfehler: CheckMK hängt immer das $ bei domain\user$ in der Ausgabe hinten ran. Woher kommt das und wie bekomme ich das weg?

Nachtrag: leider hat CheckMK statt USERNAME immer den COMPUTERNAME im Browser angezeigt, obwohl bei lokaler Ausführung der bat alles stimmte.
Daher habe ich die bat nun verfeinert und zusätzlich query user in Teilen benutzt, sowie einen Zeitstempel des Checks hinzugefügt. Kann interessant sein, wenn der Host aus ist oder alle abgemeldet sind (grau hinterlegt in CheckMK), so sieht man den zuletzt aktiven User.

Lange Rede, hier der Quelltext:

@echo off
for /F  %%A in ('"query user | find "Aktiv""') DO (
echo 0 logins-aktiv - Aktiv: %%A, Domain: %USERDOMAIN%, Host: %COMPUTERNAME%, Check: %date% %time%
)

Ergebnisausgabe in CheckMK nun:

OK - Aktiv: username, Domain: Arbeitsgruppe, Host: computername, Check: 14.11.2020 11:48:03,82

In knapp 2 Wochen werde ich dies noch mit einer “richtigen” Domäne (Server mit Domaincontroller) probieren. Wenn das Ergebnis auch dann stimmig ist, ist meine Anfrage beantwortet. :slight_smile:

Tja schon mal auf nem System mit mehreren Benutzern probiert?
Das wird nix, es kommen dann X local Checks alle mit dem gleichen Namen raus und CMK nimmt sich irgend einen davon für die Anzeige.

Ja, bis zu 3 und es funktioniert.
Allerdings immer per RDP. Mit abmelden oder nur via “Trennen” (also “Sperren”).

In query user erscheint dann immer der angemeldete Account als “>aktiv”. Die anderen sind getrennt oder bei Abmeldung nicht mehr in der Liste. Selbe Bild im Task Manager unter “Benutzer”.
Ich könnte es verifizieren, in dem ich das nicht mit RDP mache und jemanden vor Ort An- und Abmelde, aber ich würde behaupten da kommt das selbe Ergebnis raus.

Ich sehe daher aktuell kein Problem mit der Konfiguration.
Bessere Lösungen sind mir bis jetzt auch noch nicht untergekommen.

Ja und zwei aktive RDP Sitzungen? (oder eine lokale + eine RDP)
Gibt zwei Zeilen Ausgabe mit jeweils dem gleichen Titel - das ist das Problem :slight_smile:

Verstehe. Danke für den Hinweis.
Allerdings würde ich diesen Fall zu 99% im produktiven Einsatz für ArbeitsplatzPCs für mich ausschließen, da dort meist nur eine Person aktiv an einem PC arbeitet.
Über das Monitoring möchte ich nur erfahren, ob der Host a) an ist b) welche Probleme bestehen um c) mit der batch zu sehen wer gerade aktiv am PC sitzt, um diese Person anzurufen o.ä.
Und auf WIn 10 Pro ist es ja eine Standardeinstellung, dass User abgemeldet werden, wenn eine (neue) RDP-Verbindung aufgebaut wird.

Auf Server-Umgebung kann der Fall mit 2+ Session natürlich mal eintreten, aber auch da ist die Abstimmung mit den überschaubaren Kollegen schnell gemacht und auf die Server haben nur die Kollegen Zugriff und ein Auge, es geht hauptsächlich um Mitarbeiter-Clients. :slight_smile:

Update & finaler Test: funktioniert auch auf einem Domain-Controller bzw. in einer Domain.

Allerdings wird dabei nur die Ausgabe bis zur “TLD”, also nach dem . wird gekürzt (domain statt domain.lan). Schade, dass CheckMK den Befehl “%USERDNSDOMAIN%” nicht auslesen kann, lokal funktioniert dieser und gibt auch die .lan Adresse mit an.

Für meinen Zweck ist das aber erst mal in Ordnung, da der Check hauptsächlich prüfen soll, ob ein User überhaupt in der Domäne ist oder sich “aus Versehen” lokal angemeldet hat.

Vielen Dank für die Tipps und ich freue mich, falls hier jemand die Lösung ebenfalls benötigt. Feel free to use.

Ich denke, das Thema kann nun geschlossen werden. :slightly_smiling_face: