Benutzer automatisch abmelden bei Inaktivität - www.itnator.net
4

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

  • 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

  • sidebar
    >