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.
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.