NT-User herausbekommen
MichaelB
- programmiertechnik
Sehr geehrter Forumsbesucher,
Gegebenheiten:
Ein Intranet mit (Linux Apache-)Webserver. Die (WindowsNT-)Clients haben wahlweise IE (ab 5) oder Mozilla (ab 1.0).
Problem:
Ich würde gerne durch ein serverseitiges Skript/Programm herausfinden wie der NT-Benutzername von dem jeweiligen Client ist, der gerade auf die Seite surft.
Die Umgebungsvariable REMOTE_USER ist ja nur ausgefüllt, wenn sich der User nochmals an der Webseite authentifiziert. Aber gerade das möchte ich vermeiden.
Vielleicht hat ja jemand eine Idee. *hoff*
Grüße
von MichaelB
Sehr geehrter Forumsbesucher,
Gegebenheiten:
Ein Intranet mit (Linux Apache-)Webserver. Die (WindowsNT-)Clients haben wahlweise IE (ab 5) oder Mozilla (ab 1.0).
Problem:
Ich würde gerne durch ein serverseitiges Skript/Programm herausfinden wie der NT-Benutzername von dem jeweiligen Client ist, der gerade auf die Seite surft.
Die Umgebungsvariable REMOTE_USER ist ja nur ausgefüllt, wenn sich der User nochmals an der Webseite authentifiziert. Aber gerade das möchte ich vermeiden.
Vielleicht hat ja jemand eine Idee. *hoff*
Grüße
von MichaelB
Hallo Michael,
ich weiss nicht, ob das die beste/einzige Lösung ist, aber es ist zumindestens eine Möglichkeit, wenn Du einen IIS zur Verfügung hast.
Du kannst mit der ASP Servervariablen LOGIN_USER den NT Usernamen abgreifen und diesen dann für weitere Authentifizierungen in einem Cookie speichern. Dann machst Du aus dem ASP-Skript eine automatische Weiterleitung zu Deinem PHP-Skript.
Hi susanne,
ich weiss nicht, ob das die beste/einzige Lösung ist,
aber es ist zumindestens eine Möglichkeit, wenn Du
einen IIS zur Verfügung hast.
Du kannst mit der ASP Servervariablen LOGIN_USER den
NT Usernamen abgreifen und diesen dann für weitere
Authentifizierungen in einem Cookie speichern.
wie soll der IIS bzw. ein via ASP gestartetes Programm
diese Information besitzen können, wenn der Browser
(es war Mozilla gefordert) sie nicht via HTTP mitgesen-
det hat?
Ich traue ASP ja durchaus den Zugriff auf die Windows-
Einstellungen des Servers zu - nicht aber auf diejeni-
gen des Client.
Dazu müßte das ASP-Skript nämlich eine Netzwerkverbin-
dung zu diesem Client aufbauen - und das erste, was es
dazu bräuchte, wäre eine Benutzerkennung ... also genau
das, was es eigentlich berechnen will.
Viele Grüße
Michael
Hallo Michael,
Gegebenheiten:
Ein Intranet mit (Linux Apache-)Webserver. Die (WindowsNT-)Clients haben wahlweise IE (ab 5) oder Mozilla (ab 1.0).
Vielleicht hat ja jemand eine Idee. *hoff*
Wenn auf dem Server Samba läuft und der Server in der gleichen Domäne gängt, wie der Windows-Client und die Windows-Clients mit dem gleichen Benutzernamen auf diesen Rechner zugreifen, wie auf den Domänencontroller (oder dieser Server der Domänencontroller ist) - dann könntest Du Samba patchen, so dass Du evtl. den Usernamen zu dieser IP herausbekommst, sofern Samba Dir das nicht sowieso schon liefern kann.
Susannes Vorschlag mit ASP läuft aufs gleiche hinuas, in ASP ist das ganze schon "eingebaut", funktioniert aber auch nur unter den Umständen, die ich oben genannt habe. (was jedoch bei Winnt/2k-Servern mit IIS meistens der Fall ist)
Grüße,
Christian
Hi Christian,
Wenn auf dem Server Samba läuft und der Server in
der gleichen Domäne gängt, wie der Windows-Client
und die Windows-Clients mit dem gleichen Benutzer-
namen auf diesen Rechner zugreifen, wie auf den
Domänencontroller (oder dieser Server der
Domänencontroller ist) - dann könntest Du Samba
patchen, so dass Du evtl. den Usernamen zu dieser
IP herausbekommst, sofern Samba Dir das nicht
sowieso schon liefern kann.
wenn Dein Vorschlag darauf beruht, daß der Apache-Ser-
ver die Konfiguration des gesamten Windows-Netzwerkes
kennen muß, dann wäre es doch viel einfacher, wenn er
eine statische Tabelle halten würde, welche aus der
IP-Adresse des Client die erforderliche Berechtigung
schließen würde. Denn _das_ kann der Apache ganz
allein.
Und wenn der Client-PC nur mit einem erfolgreichen
Login verwendet werden kann _und_ dort nur jeweils eine
Benutzerkennung konfiguriert ist, dann sind IP-Adresse
und WinNT-Benutzerkennung semantisch äquivalent.
Natürlich muß dann jemand diese IP-Tabelle pflegen ...
aber vielleicht gibt es im Netz einen DNS-Controller,
der das tut, und vielleicht sind die DNS-Namen ja
irgendwie generisch verwandt zu den Benutzernamen ...
Viele Grüße
Michael
Hi Michael,
Ein Intranet mit (Linux Apache-)Webserver. Die
(WindowsNT-)Clients haben wahlweise IE (ab 5) oder
Mozilla (ab 1.0).
damit sind M$-proprietäre Methoden gestorben, ja?
(Siehe unten.)
Ich würde gerne durch ein serverseitiges
Skript/Programm herausfinden wie der NT-Benutzername
von dem jeweiligen Client ist, der gerade auf die
Seite surft.
Ich sehe keine Chance, das Problem allein mit einer
serverseitigen Intelligenz zu lösen. (Und mit einer
client-seitigen auch nicht - das aber liegt an Deinem
Szenario.)
Alles, was Deine serverseitige Intelligenz bei der
Kommunikation via HTTP-GET empfangen wird, sind HTTP-
Header.
Wenn der Client (Browser) die Information, welche Du
benötigst, nicht dort mit sendet, hast Du verloren.
Die Umgebungsvariable REMOTE_USER ist ja nur
ausgefüllt, wenn sich der User nochmals an der
Webseite authentifiziert.
Genau. Also brauchst Du anscheinend etwas Anderes.
Vielleicht hat ja jemand eine Idee. *hoff*
Wenn Du nicht Mozilla unterstützen müßtest, dann
hätte ich Dir empfohlen, im M$IE etwas Proprietäres
einzusetzen - sagen wie mal, JScript oder ActiveX
oder irgendwas in dieser Art.
Denn Deine Aufgabe besteht ja darin, auf dem Client
die Dir fehlende Information überhaupt erst mal ir-
gendwie zu _erfassen_.
Mozilla ist allerdings kein Programm, dessen Aufgabe
es ist, Windows-Systemschnittstellen abzufragen und
deren Informationen der JavaScript-Schnittstelle zur
Verfügung zu stellen. Das würde seinem Sicherheits-
konzept fundamental widersprechen.
An Mozilla wird Dein Vorhaben also wohl scheitern.
Die Benutzerkennung an den Server zu senden, wenn Du
sie einmal in JavaScript hast, das wäre in Form eines
Parameters im Query-String möglich. Dabei müßtest Du
allerdings sämtliche Links in allen Seiten so um-
schreiben, daß sie mit JavaScript ausgeführt werden
In beiden Fällen realisierst Du also ein Session-Kon-
zept - das ist ein enormer Aufwand dafür dem Benutzer
gerade mal eine einzige Eingabe zu ersparen, die zudem
auch noch sein Browser speichern könnte (Passwort-
Manager). Überlege Dir also: Muß das wirklich sein?
Windows ist nicht das Internet.
Viele Grüße
Michael
Hallo
Ich würde gerne durch ein serverseitiges
Skript/Programm herausfinden wie der NT-Benutzername
von dem jeweiligen Client ist, der gerade auf die
Seite surft.
Ich sehe keine Chance, das Problem allein mit einer
serverseitigen Intelligenz zu lösen. (Und mit einer
client-seitigen auch nicht - das aber liegt an Deinem
Szenario.)
Jo .... das ist leicht einzusehen.
Wenn Du nicht Mozilla unterstützen müßtest, dann
hätte ich Dir empfohlen, im M$IE etwas Proprietäres
einzusetzen - sagen wie mal, JScript oder ActiveX
oder irgendwas in dieser Art.
Das hab ich mir auch schon überlegt. Denkbar wäre auch ein signiertes JavaApplet (signiert deshalb, weil man ihm dann erweiterte Rechte geben kann) womit dann sogar der Mozilla wieder im Rennen wäre.
Denn Deine Aufgabe besteht ja darin, auf dem Client
die Dir fehlende Information überhaupt erst mal ir-
gendwie zu _erfassen_.
Genau das ist mein Problem. Erfassen und übersenden.
Mozilla ist allerdings kein Programm, dessen Aufgabe
es ist, Windows-Systemschnittstellen abzufragen und
deren Informationen der JavaScript-Schnittstelle zur
Verfügung zu stellen. Das würde seinem Sicherheits-
konzept fundamental widersprechen.
Dächt ich mir doch.
Die Idee mit der "Session" ist mir tatsächlich zu aufwendig. Das muss nun wirklich nicht sein.
Allerdings fand' ich Christians Idee mit der IP-Adresse recht interessant. Mir ist nur noch nicht ganz klar wie ich dem "Windows-Netz" (also Samba) zu einer IP-Adresse den Benutzer entlocken kann.
Mit einer statischen Tabelle arbeiten geht leider nicht, da an einem PC mal der und mal der Benutzer sich einloggen kann. Man müsste also schon irgendwie rausbekommen, wer gerade angemeldet ist.
Leider gibts ja standardmäßig kein ident-Daemon unter Windows.
Schaun wir mal was ich noch so herausfinde.
Vielen Dank erstmal an alle
Gruss
MichaelB
Hallo,
Vielleicht hat ja jemand eine Idee. *hoff*
Mir würden da zwei Möglichkeiten einfallen. Ob sie gangbar und/oder praktikabel sind, sei einmal dahingestellt
1.) Es gibt ja mit NT die Möglichkeit, Logon- bzw. Logoff-scripts ausführen zu lassen. Das Logon-Script könnten auf dem Web-Server die Zuordnung IP-Adresse-User ablegen, während das Logoff-Script diese Information wieder löscht. Das muß ja nicht zwangsläufig per HTTP passieren, sondern könnte auch von einem eigens dafür geschriebenen Binärprogramm erledigt werden (eventuell auch mit Verschlüsselung).
Anwendungen am Webserver könnten dann aufgrund der IP-Adresse des Clients den entsprechenden User raussuchen und mit dieser Information weiter arbeiten.
2.) Ein Programm/Dienst auf einem Windowsrechner, günstigenfalls ein Server, verwendet die Win-API-Funktion NetWkstaUserEnum() um die angemeldeten Benutzer einer Workstation (geht auch mit IP-Adressen) zu ermitteln. Dieses Programm/Dienst kann dann von einer Web-Applikation über eine Socketverbindung angesprochen werden, um diese Informationen abzufragen.
So etwas könnte u.a. auch mit Perl realisiert werden:
<code>
use Win32::NetAdmin qw(LoggedOnUsers);
my @users;
LoggedOnUsers('192.168.130.3', @users) or die "LoggedOnUsers() failed: $^E";
print join(',',@users);
</code>
Dummerweise liefert diese Funktion nicht nur Interaktive Benutzer sondern auch die von Services und Batch-Prozessen, sofern diese nicht unter dem System-Account laufen. Bei Anmelde-Servern liefert sie anscheinend auch die User, die sich darüber an die Domain angemeldet haben. Aber das sollte in Deinem Falle egal sein, wenn kein Anwender auf einem Anmeldeserver interaktiv arbeitet.
Ein Nachteil all dieser Lösungen ist, daß sie nicht mit Terminalservern funktionieren.
So, jetzt hoffe ich, daß Du einige Anhaltspunkte hast, Dein Problem zu lösen.
Grüße
Klaus