Viele Firmen und Organisation haben ein Intranet, in dem Informationen für
die Belegschaft hinterlegt sind. Meistens sind diese Informationen aber sehr
allgemein gehalten, denn in den wenigsten Fällen findet eine Identifizierung
des Benutzers statt, die die Möglichkeit bieten würde die Informationssammlung
auf die Mitarbeiter und deren Bedürfnisse zuzuschneiden. Dabei ist die Erkennung
des Benutzers recht einfach.
Die Basis dieses Beispiels fungiert der Internet Information Server 6.0 (IIS)
des Windows Server 2003 in Zusammenarbeit mit dem Active-Directory, in dem alle
Benutzer erfasst sind.
Erstellt man auf dem IIS eine neue Website, so ist der anonyme Zugriff standardmäßig
aktiviert, d.h. jeder darf Seiten dieser Site abrufen; eine Validierung findet
nicht statt. Genau dies muss man nun ändern, will man erfahren welcher Benutzer
die Website gerade aufgerufen hat. Zu diesem Zweck ruft man die Eigenschaften
der Website im Internetinformationsdienste-Manager des Web-Servers auf
und wechselt auf den Karteireiter Verzeichnissicherheit. Dort findet
man unter "Authentifizierung und Zugriffssteuerung" die Schaltfläche "Bearbeiten",
mit der man auf den Dialog Authentifizierungsmethoden gelangt.
In diesem Dialog entfernt man zunächst den Haken vor dem Eintrag Anonymen
Zugriff aktivieren und setzt ihn anschließend vor dem Eintrag Integrierte
Windows-Authentifizierung. Das war's. Jeder der nun nicht zum Benutzerkreis
der Windows-Domäne gehört, bekommt beim Aufruf der Site einen Anmeldedialog
angezeigt, an dem er sich mit einem gültigen AD-Konto anmelden muss.
Mit dieser Server-Konfiguration und ein wenig ASP-Code kann man nun den Benutzernamen
des Intranet-Betrachters identifizieren und mit diesem weitere Informationen
aus dem Active-Directory ermitteln. Der Einfachheit halber sollte man den Code
in einer externen ASP-Datei kapseln, die man später nur in andere APS-Seiten
einbinden braucht.
Die Funktion GetUserInfo im Einzelnen:
Als erstes müssen wir den Benutzernamen ermitteln. Dies geschieht durch einen
Zugriff auf die Server-Variable LOGON_USER, in der der voll qualifizierten Domänennamen
steht, wenn der Zugriff nicht anonym ist.
strUser = Trim(Request.ServerVariables("LOGON_USER"))
Wir erhalten z.B. MYDOMAIN\kristof. Da wir den Domänennamen nicht mehr brauchen,
schneiden wir ihn ab:
If InStr(strUser,"\") then strUser = Mid(strUser,InStr(strUser,"\") + 1)
Damit hätten wir den User-Namen. Um nun mehr Informationen über den Benutzer
zu erhalten, z.B. den Vor- und Nachnamen, verwenden wir das LDAP-Protokoll um
das Active-Directory abzufragen. Der einfachste Weg führt dabei über ADO. Hierzu
initialisieren wir zunächst eine entsprechende Verbindung. Wichtig ist hierbei
der richtige Provider, um auf das AD zu kommen. Anstelle der Platzhalter "<Kontoname>"
bzw. "<Passwort>" müssen natürlich die Informationen eines abfrageberechtigten
Benutzers eingetragen werden.
Set objConn = CreateObject("ADODB.Connection")
objConn.Provider = "ADsDSOObject"
objConn.Properties("User ID") = "<Kontoname>"
objConn.Properties("Password") = "<Passwort>"
objConn.Open "Active Directory Provider"
Als nächstes müssen wir die Abfrage definieren. Dies geschieht in drei Teilen:
1. Teil (strBase) = Definition des AD-Knotes ab dem gesucht werden soll. In
diesem Fall der Hauptst "Benutzer" in der Domäne "test.de"
2. Teil (strFilter) = Eingrenzung der Objekte auf die Objekteigenschaften Personen
und User und den Account-Namen des zuvor ermittelten Benutzers
3. Teil (strAttributes) = Welche Active-Directory-Felder sollen zurückgegeben
werden:
| sAMAccountName | Account-Name |
sn | Nachname |
givenName | Vorname |
department | Abteilung |
Diese drei Teile hängen wird anschließend zu einem Abfrage-String zusammen
und initialisieren damit ein neues ADO-Command-Objekt.
strBase = "<LDAP://OU=benutzer,DC=test,DC=de>"
strFilter = "(&(objectCategory=person)(objectClass=user)(sAMAccountName=" &
strUser & "*))"
strAttributes = "sAMAccountName,sn,givenName,department"
strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";subtree"
Set objCmd = CreateObject("ADODB.Command")
Set objCmd.ActiveConnection = objConn
objCmd.CommandText = strQuery
objCmd.Properties("Page Size") = 100
objCmd.Properties("Timeout") = 30
objCmd.Properties("Cache Results") = False
Über das ADO-Command-Objekt erhalten wir schließlich ein Recordset, in dessen
einzigem Datensatz die gewünschten Informationen enthalten sind. Um diese global
verfügbar zu machen, werden sie in Session-Variablen gespeichert.
Set objRS = objCmd.Execute
If Len(Trim(objRS.Fields("sAMAccountName").value)) = 0 then
Session("UserAccount") = ""
Session("UserFirstName") = ""
Session("UserLastName")= ""
Session("UserDepartment") = ""
Else
Session("UserAccount") = objRS.Fields("sAMAccountName").value
Session("UserFirstName") = objRS.Fields("givenName").value
Session("UserLastName") = objRS.Fields("sn").value
Session("UserDepartment") = objRS.Fields("department").value
End if
Bleibt schließlich nur noch, das abschließende Aufräumen.
objRS.Close
Set objRS = Nothing
Set objCmd = Nothing
objConn.Close
Set objConn = Nothing
Vorstellbar ist nun den Benutzer gleich auf der ersten Seite mit einer persönlichen
Ansprache á la "Willkommen Herr Müller" zu begrüßen. Die Eindeutigkeit eines
Accounts in einer Domäne bietet weitere Möglichkeiten, wie die Speicherung persönlicher
Präferenzen in einer Datenbank oder ähnliches.
Downloads
GetUserInfo.txt