10

Benutzer automatisch abmelden bei Inaktivität

Das automatische Abmelden eines Benutzers bei Inaktivität ist oft ein Problem. Windows beherrscht mit Bordmitteln nur die Aufgabenplanung. Dort gibt es zwar die Option den Bildschirm zu sperren, wenn der Benutzer inaktiv ist, aber nicht das automatische Abmelden. Doch mit PowerShell ist es möglich den Benutzer automatisch abmelden zu lassen. Im privaten Gebrauch ist das oft un relevant. Doch in Unternehmen gibt es viele Server auf dem ein User angemeldet ist, sich aber nicht abmeldet, sondern einfach die Verbindung trennt.

Warum ist es sinnvoll einen Benutzer automatisch von Windows abmelden zu lassen?

Das ist eine interessante Frage. Hierzu gibt es viele Gründe. Es gibt oft den Fall, dass sich ein User an einem Windows-System anmeldet, darauf arbeitet, aber danach die Verbindung trennt, ohne sich abzumelden. Das ist in erster Linie kein Problem. Doch es gibt viele Mechanismen oder Agents zur Softwareverteilung, welche vor einem Neustart des Computers prüfen, ob noch Benutzer angemeldet sind. Ist das der Fall, so wird der Neustart verschoben oder abgebrochen. Das Verschieben des Neustarts, oder eine Warnmeldung ist somit ein Resultat daraus, dass sich der User getrennt hat, aber nicht vom System abgemeldet hat.

Hier kommt das PowerShell Script zum Einsatz. Dieses lässt den User nach einer bestimmten Zeit, in der er inaktiv ist, automatisch von Windows abmelden. Möglich sind hier folgende Zeit-Intervalle:

  • Sekunden
  • Minuten
  • Stunden
  • Tage

Diese Intervalle können in Zeile 53 angepasst werden.

Einen Benutzer automatisch abmelden bei Inaktivität – das PowerShell Script

Wie oben genannt, nutzt man hierfür am Besten ein PowerShell Script, um die Inaktivität eines Benutzers zu messen. Egal ob die letzte Maus-Bewegung oder Tastatur-Anschlag, es wird immer ein Zeitstempel geschrieben. Diesen Zeitstempel vergleicht man mit der Aktuellen Zeit und bekommt somit eine Zeitspanne. Ist diese Zeitspanne größer als ein angegebener Wert, so lässt man den Benutzer abmelden mit der shutdown.exe. Der logoff in Windows wird also erst dann ausgeführt, wenn der User wirklich inaktiv ist, und nicht einfach nur seine Arbeitsstation gesperrt hat.

# 
Add-Type @'
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace PInvoke.Win32 {

    public static class UserInput {

        [DllImport("user32.dll", SetLastError=false)]
        private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);

        [StructLayout(LayoutKind.Sequential)]
        private struct LASTINPUTINFO {
            public uint cbSize;
            public int dwTime;
        }

        public static DateTime LastInput {
            get {
                DateTime bootTime = DateTime.UtcNow.AddMilliseconds(-Environment.TickCount);
                DateTime lastInput = bootTime.AddMilliseconds(LastInputTicks);
                return lastInput;
            }
        }

        public static TimeSpan IdleTime {
            get {
                return DateTime.UtcNow.Subtract(LastInput);
            }
        }

        public static int LastInputTicks {
            get {
                LASTINPUTINFO lii = new LASTINPUTINFO();
                lii.cbSize = (uint)Marshal.SizeOf(typeof(LASTINPUTINFO));
                GetLastInputInfo(ref lii);
                return lii.dwTime;
            }
        }
    }
}
'@


while ($true) {
    $Last = [PInvoke.Win32.UserInput]::LastInput
    $Idle = [PInvoke.Win32.UserInput]::IdleTime


    # if idle time 24 Hours
    if ($idle.Minutes -ge 1440) {

    #logoff user
    Start-Process shutdown.exe -ArgumentList "/l"


    #stop script
    exit
    }


    #check every minute
    Start-Sleep -Seconds 60
}

Ab Zeile 47 beginnt die eigentliche Konfiguration. In meinem Beispiel-Script sind folgende Werte gesetzt:

  • Zeile 53: IF-Statement wird ausgeführt, wenn die Idle-Time größer als 24 Stunden (1440 Minuten) ist. (PowerShell Operatoren beachten)
  • Zeile 56: Die shutdown.exe wird mit dem Parameter “/l” ausgeführt, welcher ein Abmelden bewirkt.
  • Zeile 60: Wenn das Abmelden ausgeführt wurde, das Script beenden.
  • Zeile 65: Jede 60 Sekunden die Schleife durchlaufen.

Benutzer automatisch abmelden powershell

Dieses PowerShell Script sollte per Aufgabenplanung beim Anmelden des Benutzers ausgeführt werden, oder per Gruppenrichtlinie als StartUp-Script hinterlegt werden. Es sollte aber zuvor darauf geachtete werden, dass das Script signiert wird, oder die PowerShell Script Execution Policy korrekt definiert ist.

Johannes Huber
 

In seiner Freizeit macht Johannes nichts lieber, als für ITnator Beiträge zu schreiben. Input bekommt er hierfür von Problemen in der IT Administration von Servern, Clients und vielen weiteren IT Komponenten.

  • Max sagt:

    Kann man das PowerShell Skript eigentlich auch als Background-Job in der Aufgabenplanung starten, da sonst das PS-Fenster immer offen ist?

    Habe es mal so versucht:

    Programm/Skript:
    C:WindowsSystem32WindowsPowerShellv1.0powershell.exe

    Argument:
    -command “Start-Job -Name AutoLogOff -ScriptBlock { “C:Toolsautologofflogoff-script.ps1″ }”

    Aber leider passiert dann gar nichts mehr.

    • Hallo Max,

      wenn du das Script per Hand startest, dann funktioniert es, oder?
      Ich würde empfehlen das PowerShell Script per Gruppenrichtlinie als Logon-Skript zu starten.

      Script-Name:
      %windir%\System32\WindowsPowerShell\v1.0\powershell.exe

      Parameter:
      -Noninteractive -ExecutionPolicy Bypass –Noprofile -file DEINSCRIPT.ps1

      Gruß Johannes

      • Jonas sagt:

        Hallo Johannes,

        echt cooles Script! Habe deine Anleitung befolgt und das Script als Logon Script eingestellt. Leider funktioniert das nur mit Admin Accounts und nicht mit normalen User Accounts. Was mache ich falsch? 🙁

        Viele Grüße
        Jonas

        • Johannes sagt:

          Hallo Jonas,

          im oberen Teil (1-44) wird die Inaktivitätszeit ausgelesen.
          Im restlichen Script wird jeder Benutzer abgemeldet (mit shutdown /l), wenn die “Idle-Time” überschritten wird.
          Hier gibt es keine Unterscheidung ob Admin oder nicht.

          Ich könnte mir allerdings in deinem Fall vorstellen, dass die Nicht-Admin User keinen Zugriff auf das Script haben. Das würde erklären, warum Admins abgemeldet werden, aber “normale” User nicht.

          Du hast zwar das Logon Script hinterlegt, aber kann es sein, dass die normalen User zu wenig Berechtigung haben, um das Script zu laden?
          Am Besten versuchst du dich als normaler User anzumelden und das Script manuell auszuführen – also mit dem gleichen Pfad aus dem LogonScript.

          Gruß Johannes

  • Oliver sagt:

    Wir haben das Problem, wenn der Bildschirmschoner nach 10 Minuten am Arbeitsplatz aktiviert wird, dass das Script nicht mehr ausgeführt wird (60 Minuten inaktivität). Haben wir eine Chance es trotzdem zum laufen zu bekommen?

    • Hallo Oliver,

      inwiefern weißt du, dass das Script nicht mehr ausgeführt wird?
      Ich kann mir nicht vorstellen, dass das Script einfach “beendet” wird.
      Kannst du mir genauere Informationen geben, oder analysieren, was genau passiert?

      Gruß Johannes

  • Erix sagt:

    Kann für RDP (Server 2016, W10,…) konfiguriert werden:
    “gpedit“,“Computer Configuration”,“Administrative Templates” ,“Windows Components”, “Remote Desktop Services”,“Session Time Limits”

  • Stefan sagt:

    Hallo Johannes,

    dein Skript funktioniert einwandfrei, solange nicht die automatische Bildschirmsperre dazwischen kommt. Nach 15 Minuten Inaktivität wird bspw. automatisch der PC bei mir gesperrt. Dein Skript funktioniert, solange die abgelaufende Zeit unter diesen 15 Minuten liegt, danach kommt die automatische Bildschirmsperre dazwischen, und eine komplette Abmeldung des Benutzers erfolgt nicht mehr. Weißt du hier eine Lösung? Gibt es einen zweiten Status, den man abfragen könnte? Etwas wie “nach x Minuten Bildschirmsperre, melde den Benutzer ab”?

    Lieben Gruß
    Stefan

    • Johannes sagt:

      Hallo Stefan,

      ehrlich gesagt wundert es mich, dass das Script dann nicht mehr funktioniert.
      Es läuft ja weiter. Was passiert denn, wenn du dich nach dem Bildschirmschoner wieder anmeldest?

  • sidebar
    >