Anmeldestatus von Benutzern im Active Directory speichern
Speichern des Anmelde-Status der Benutzer im Active-Directory
Der grobe Ablauf ist folgender: Die Informationen werden jeweils mit einem Anmelde- und Abmeldescript im Kommentarfeld (Tab: Rufnummern) des jeweiligen Benutzerobjekts in folgendem Format abgelegt:
(Nachtrag: Wie man ein anderes Feld für diese Informationen nutzt steht unter Punkt 5 des Beitrags)
Beispiel:
Dazu öffnet man den ADSI-Editor auf dem Server mit WIN+R -> ADSIedit.msc. Jetzt navigiert man in den Container in denen sich die User befinden, dann Rechtsklick > Eigenschaften. Im Dialog wechselt man auf den Tab Sicherheit und wählt unten Erweitert.
Nun fügt man im Dialog einen neuen Eintrag mit dem Benutzer SELBST hinzu, wählt unter "Übernehmen für": Untergeordnete "Benutzer"-Objekte aus, setzt einen Haken bei Zulassen für "Kommentar" schreiben .
Damit erben alle Benutzerobjekte in diesem Container das Recht ihr eigenes Kommentar zu aktualisieren, was für die Scripte benötigt wird. Diesen Vorgang wiederholt man für die Container oder einzelner Benutzer dessen Status man im AD veröffentlichen möchte.
Nach dem routinemäßigen Aktualisieren der GPOs, sollten ab jetzt die An- und Abmeldevorgänge im Benutzerobjekt korrekt hinterlegt werden.
Nun nützen einem die Informationen wenig wenn man sie nicht wieder mit einem Script nutzen kann. Dazu habe ich hier eine Powershell-Funktion geschrieben die diese Daten im AD abfragt und so für Automatisierungsaufgaben nutzbar macht:
Dass Script speichert ihr dann mit der Endung *.ps1, z.B. als Show-UserState.ps1.
Das Script bietet folgende Möglichkeiten:
Die Daten werden als Powershell-Objekte ausgegeben dessen Eigenschaften wie "Benutzername,Status,Computer,Zeit" auch separat abgefragt werden können.
Beispiel zum Abfragen des Status für den Benutzer hmustermann
Dies gibt dann entweder
Hinweis: Es werden natürlich nur die User von der Funktion aufgelistet bei denen ein entsprechend formatierter Eintrag im Kommentarfeld vorhanden ist. D.h die User müssen sich mindestens einmal angemeldet haben.
Zuerst müssen wir die Schreib-Berechtigungen wie bereits oben beschrieben auf das jeweilige Feld setzen welches wir dafür nutzen wollen. Als Beispiel wähle ich das frei belegbare Attribut extensionAttribute10
Zur Info: Möchte man ein eigenes Attributes dafür erstellen kann dies in folgender Schritt-für-Schritt Anleitung nachgelesen werden: Erstellen eines neuen Attributes für Benutzerobjekte im Active Directory Schema
Dann muss das AD-Feld in den An- und Abmeldescripten jeweils in Zeile 4 der Scripte angepasst werden:
Beispiel für das Logon-Script und der Nutzung des AD-Feldes extensionAttribute10
Für das Powershell-Script muss dann noch die Zeile 14 des Scriptes durch diese ersetzt werden
Selbstverständlich muss die Frage des Datenschutzes dieser Informationen im eigenen Unternehmen geklärt sein bevor man dies so umsetzt.
Hoffe diese Anleitung nützt dem ein oder anderen bei der Realisierung seines Projektes
Grüße @colinardo
Updates
Inhaltsverzeichnis
1. Beschreibung der Vorgehensweise
Wer vor der Aufgabe steht den aktuellen Status der Benutzer (aktuell angemeldet oder abgemeldet) abzufragen, fragt sich sicherlich zuerst wie und wohin speichere ich diese Daten mit einem Logon/Logoff-Script am besten. Diese Anleitung gibt einen Leitfaden zum Speichern dieser Informationen im Active Directory bzw. im jeweiligen Benutzerobjekt.Der grobe Ablauf ist folgender: Die Informationen werden jeweils mit einem Anmelde- und Abmeldescript im Kommentarfeld (Tab: Rufnummern) des jeweiligen Benutzerobjekts in folgendem Format abgelegt:
(Nachtrag: Wie man ein anderes Feld für diese Informationen nutzt steht unter Punkt 5 des Beitrags)
Status#[LoggedIn|LoggedOut]#[COMPUTER DISTINGUISHED NAME]#[DATUM ZEIT]
Status#LoggedIn#CN=VM7-001,CN=Computers,DC=domain,DC=local#06.09.2013 15:30:35
2. Vorarbeiten: Berechtigungen der Nutzer im AD setzen
Damit die Scripte die nötigen Rechte haben die Informationen ins AD zu schreiben, müssen wir den Nutzern Schreibrechte auf das Kommentarfeld ihres Benutzerobjektes gewähren.Dazu öffnet man den ADSI-Editor auf dem Server mit WIN+R -> ADSIedit.msc. Jetzt navigiert man in den Container in denen sich die User befinden, dann Rechtsklick > Eigenschaften. Im Dialog wechselt man auf den Tab Sicherheit und wählt unten Erweitert.
Nun fügt man im Dialog einen neuen Eintrag mit dem Benutzer SELBST hinzu, wählt unter "Übernehmen für": Untergeordnete "Benutzer"-Objekte aus, setzt einen Haken bei Zulassen für "Kommentar" schreiben .
Damit erben alle Benutzerobjekte in diesem Container das Recht ihr eigenes Kommentar zu aktualisieren, was für die Scripte benötigt wird. Diesen Vorgang wiederholt man für die Container oder einzelner Benutzer dessen Status man im AD veröffentlichen möchte.
3. An- und Abmeldeskripte
Nun setzt man in den GPOs der entsprechenden User folgende An- und Abmeldescripte (VBS)a) Anmeldescript
On Error Resume Next
Set objSysInfo = CreateObject("ADSystemInfo")
Set objUser = GetObject("LDAP://" & objSysInfo.UserName)
objUser.put "info","Status#LoggedIn#" & objSysInfo.Computername & "#" & Date() & " " & Time()
objUser.SetInfo
b) Abmeldescript
On Error Resume Next
Set objSysInfo = CreateObject("ADSystemInfo")
Set objUser = GetObject("LDAP://" & objSysInfo.UserName)
objUser.put "info","Status#LoggedOut#" & objSysInfo.Computername & "#" & Date() & " " & Time()
objUser.SetInfo
Nach dem routinemäßigen Aktualisieren der GPOs, sollten ab jetzt die An- und Abmeldevorgänge im Benutzerobjekt korrekt hinterlegt werden.
Nun nützen einem die Informationen wenig wenn man sie nicht wieder mit einem Script nutzen kann. Dazu habe ich hier eine Powershell-Funktion geschrieben die diese Daten im AD abfragt und so für Automatisierungsaufgaben nutzbar macht:
4. Abfragen der Status-Daten via Script:
Powershell-Script
param(
[Parameter(mandatory=$true)][string]$baseDN,
[Parameter()][string]$filter = "*"
)
$objUserList = @()
$objSearch = New-Object System.DirectoryServices.DirectorySearcher
$objSearch.PageSize = 100000
$objSearch.Filter = "(&(objectCategory=User)(objectCategory=Person)(info=*#*#*#*))"
$objSearch.SearchRoot = "LDAP://$baseDN"
$users = $objSearch.FindAll()
foreach ($user in $users) {
$itm = $user.GetDirectoryEntry()
$username = $itm.SamAccountName
$info = $itm.info.toString()
$details = $info.Split("#")
$userState = $details[1]
$userComputer = $details[2]
$userTime = $details[3]
$objUserList += new-object PSObject -Property @{"Benutzer" = $userName;"Status" = $userState;"Computer" = $userComputer;"Zeit" = $userTime}
}
$objUserList | ?{$_.Benutzer -like $filter} | select Benutzer,Status,Computer,Zeit
Das Script bietet folgende Möglichkeiten:
Beispiel 1: Den Status des Benutzers hmustermann in der OU Vertrieb abfragen
.\Show-UserState.ps1 -baseDN "OU=Vertrieb,dc=domain,dc=local" -filter "hmustermann"
Beispiel 2: Den Status aller Nutzer der Domain anzeigen lassen
.\Show-UserState.ps1 -baseDN "dc=domain,dc=local"
Beispiel zum Abfragen des Status für den Benutzer hmustermann
(.\Show-UserState.ps1 -baseDN "dc=domain,dc=local" -filter "hmustermann").Status
LoggedIn
oder LoggedOut
aus.Hinweis: Es werden natürlich nur die User von der Funktion aufgelistet bei denen ein entsprechend formatierter Eintrag im Kommentarfeld vorhanden ist. D.h die User müssen sich mindestens einmal angemeldet haben.
5. Nutzung eines anderen AD-Feldes für die Speicherung der Informationen
Ist man in der Situation das man ein anderes Feld für die Hinterlegung dieser Informationen nutzen möchte oder muss, kann dies wie folgt geändert werden:Zuerst müssen wir die Schreib-Berechtigungen wie bereits oben beschrieben auf das jeweilige Feld setzen welches wir dafür nutzen wollen. Als Beispiel wähle ich das frei belegbare Attribut extensionAttribute10
Zur Info: Möchte man ein eigenes Attributes dafür erstellen kann dies in folgender Schritt-für-Schritt Anleitung nachgelesen werden: Erstellen eines neuen Attributes für Benutzerobjekte im Active Directory Schema
Dann muss das AD-Feld in den An- und Abmeldescripten jeweils in Zeile 4 der Scripte angepasst werden:
Beispiel für das Logon-Script und der Nutzung des AD-Feldes extensionAttribute10
objUser.put "extensionAtribute10","Status#LoggedIn#" & objSysInfo.Computername & "#" & Date() & " " & Time()
$info = $itm.extensionAttribute10.toString()
6. Hinweise
Was man natürlich beachten sollte ist, das wenn der PC eines Users abstürzt und kein Abmeldevorgang stattgefunden hat auch die Informationen im AD nicht aktuell sind bzw. erst beim nächsten Anmelden wieder aktualisiert werden. Diese Situation ließe sich aber mit einer zusätzlichen PING-Prüfung des zuletzt geloggten PCs beheben.Selbstverständlich muss die Frage des Datenschutzes dieser Informationen im eigenen Unternehmen geklärt sein bevor man dies so umsetzt.
Hoffe diese Anleitung nützt dem ein oder anderen bei der Realisierung seines Projektes
Grüße @colinardo
Updates
Datum | Beschreibung |
---|---|
19.08.2014 | Powershell-Funktion für die Verwendung ohne AD-Modul umgeschrieben |
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 216323
Url: https://administrator.de/contentid/216323
Ausgedruckt am: 22.11.2024 um 01:11 Uhr
2 Kommentare
Neuester Kommentar
Hallöchen,
Super Arbeit!! Gefällt mir sehr gut, die Idee und auch die Art der Umsetzung. Nur eine Sache würde ich ändern: Du nutzt den Kommentar dafür, aber dieser ist in manchen Firmen belegt durch andere Informationen. Ich würde also vorschlagen, dass man das Ganze auf einen "benutzerdefinierten Wert" legt, diesen kann man dann zwar nicht direkt in der Standard-AD-Übersicht anschauen, aber per Script, macht es keinen Unterschied.
Gruß
Chris
Super Arbeit!! Gefällt mir sehr gut, die Idee und auch die Art der Umsetzung. Nur eine Sache würde ich ändern: Du nutzt den Kommentar dafür, aber dieser ist in manchen Firmen belegt durch andere Informationen. Ich würde also vorschlagen, dass man das Ganze auf einen "benutzerdefinierten Wert" legt, diesen kann man dann zwar nicht direkt in der Standard-AD-Übersicht anschauen, aber per Script, macht es keinen Unterschied.
Gruß
Chris