MichaelB: NT-User herausbekommen

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

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

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

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

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

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

    • oder wenigstens in _jeder_ Seite einen Mechanismus
      einbinden, der im Falle der Noch-Nicht-Erfassung der
      Benutzerkennung eine JavaScript-Weiterleitung auf
      concat (denselben URL, die Benutzerkennung) realisiert,
      wobei dann Dein Server einen Cookie mit dem Inhalt
      der Benutzerkennung zurücksendet. Denn wenn Du auf
      dem Server die Benutzerkennung auswerten willst, dann
      muß diese bei _jedem_ Zugriff vom Browser mitgesendet
      werden - dies ist aber nur dann der Fall, wenn sie
      entweder in _jeden_ Link eincodiert oder als Cookie
      gespeichert ist.

    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

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

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