Вытаскивание имени виндового пользователя

dsa

Новичок
Вытаскивание имени виндового пользователя

Хочется сделать сайт со статистикой наработанного трафика. Есть база с юзерами и их трафиком. Вытащить данные - проблем нет. Но вот не хочется заставлять пользователя вводить логин и пароль. Собственно вопрос: как можно средсвами PHP/HTML вытащить логин пользователя, залогиненого в домен на виндах 2000/XP, если вообще можно...
 

Vetal

Новичок
PHP:
<?php

/***********************************************************************
*    PHP NTLM GET LOGIN 
*    Version 0.2
* ====================================================  
*                                        
* Copyright (c) 2004 Nicolas GOLLET ([email protected])
* Copyright (c) 2004 Flextronics Saint-Etienne
*
* This program is free software. You can redistribute it and/or modify 
* it under the terms of the GNU General Public License as published by 
* the Free Software Foundation; either version 2 of the License.         
*
***********************************************************************/


/*
L'identification par NTLM se fait en 6 etape :

etape: | type:      | Info echange
-------|----------------|--------------------------------------------------
    1   | C --> S       | GET ...                               legende : C = Client
-------|----------------|--------------------------------------------------                     S = Serveur
    2   | C <-- S   | 401 Unauthorized
         |              | WWW-Authenticate: NTLM
-------|----------------|--------------------------------------------------
    3   | C --> S       | GET ...
         |              | Authorization: NTLM <base64-encoded type-1-message>
-------|----------------|--------------------------------------------------
    4   | C <-- S   | 401 Unauthorized
         |              | WWW-Authenticate: NTLM <base64-encoded type-2-message>
-------|----------------|--------------------------------------------------
    5   | C --> S       | GET ...
         |              | Authorization: NTLM <base64-encoded type-3-message>
-------|----------------|-------------------------------------------------- 
    6   | C <-- S        | 200 Ok
-------|----------------|--------------------------------------------------

*/



$headers = apache_request_headers();    // Recuperation des l'entetes client
    

if($headers['Authorization'] == NULL){              //si l'entete autorisation est inexistante
    header( "HTTP/1.0 401 Unauthorized" );          //envoi au client le mode d'identification
    header( "WWW-Authenticate: NTLM" );         //dans notre cas le NTLM
    exit;                           //on quitte

};

if(isset($headers['Authorization']))                //dans le cas d'une authorisation (identification)
{       
    if(substr($headers['Authorization'],0,5) == 'NTLM '){   // on verifit que le client soit en NTLM
    
    
        $chaine=$headers['Authorization'];                  
        $chaine=substr($chaine, 5);             // recuperation du base64-encoded type1 message
        $chained64=base64_decode($chaine);      // decodage base64 dans $chained64
        
        if(ord($chained64{8}) == 1){                    
        //          |_ byte signifiant l'etape du processus d'identification (etape 3)      
    
        // verification du drapeau NTLM "0xb2" a l'offset 13 dans le message type-1-message :
        if (ord($chained64[13]) != 178){
        echo "Votre navigateur Internet n'est pas compatible avec le NTLM, utiliser IE...Merci";
        exit;
        }
            $retAuth = "NTLMSSP";                   
            $retAuth .= chr(0);                  
            $retAuth .= chr(2);
            $retAuth .= chr(0);
            $retAuth .= chr(0);
            $retAuth .= chr(0);
            $retAuth .= chr(0);
            $retAuth .= chr(0);
            $retAuth .= chr(0);
            $retAuth .= chr(0);
            $retAuth .= chr(40);
            $retAuth .= chr(0);
            $retAuth .= chr(0);
            $retAuth .= chr(0);
            $retAuth .= chr(1);
            $retAuth .= chr(130);
            $retAuth .= chr(0);
            $retAuth .= chr(0);
            $retAuth .= chr(0);
            $retAuth .= chr(2);
            $retAuth .= chr(2);
            $retAuth .= chr(2);
            $retAuth .= chr(0);
            $retAuth .= chr(0);
            $retAuth .= chr(0);
            $retAuth .= chr(0);
            $retAuth .= chr(0);
            $retAuth .= chr(0);
            $retAuth .= chr(0);
            $retAuth .= chr(0);
            $retAuth .= chr(0);
            $retAuth .= chr(0);
            $retAuth .= chr(0);
            $retAuth .= chr(0);
            
            $retAuth64 =base64_encode($retAuth);        // encode en base64
            $retAuth64 = trim($retAuth64);          // enleve les espaces de debut et de fin
            header( "HTTP/1.0 401 Unauthorized" );      // envoi le nouveau header
            header( "WWW-Authenticate: NTLM $retAuth64" );  // avec l'identification supplementaire
            exit;
            
        }

        else if(ord($chained64{8}) == 3){
        //               |_ byte signifiant l'etape du processus d'identification (etape 5)
    
        // on recupere le domaine
        
        $lenght_domain = (ord($chained64[31])*256 + ord($chained64[30])); // longueur du domain
        $offset_domain = (ord($chained64[33])*256 + ord($chained64[32])); // position du domain.    
        $domain = substr($chained64, $offset_domain, $lenght_domain); // decoupage du du domain
        
        //le login
        $lenght_login = (ord($chained64[39])*256 + ord($chained64[38])); // longueur du login.
        $offset_login = (ord($chained64[41])*256 + ord($chained64[40])); // position du login.
        $login = substr($chained64, $offset_login, $lenght_login); // decoupage du login
        
        // l'host   
        $lenght_host = (ord($chained64[47])*256 + ord($chained64[46])); // longueur de l'host.
        $offset_host = (ord($chained64[49])*256 + ord($chained64[48])); // position de l'host.  
        $host = substr($chained64, $offset_host, $lenght_host); // decoupage du l'host  
        
        

        echo "Domain is  : $domain";
        echo "<br>Login is : $login";
        echo "<br>host is  : $host";
        
        }

    }

}


?>
 

neko

tеam neko
[с нетерпением ждет когда его возьмут на работу в компанию где таким образом аутентифицируют пользователей]
 

slach

Новичок
такая схема не годится

1) она не выцепляет ЛОГИН+ПАРОЛЬ из заголовков, соответсвенно не дает полной идентификации пользователя

2) нет гарантии того, что переданный NTLM заголовок не является сфабрикованным и что юзер с таким логином в данный момент действительно залогинен..

3) попробуйте mod_ntlm под Apache
 

dsa

Новичок
Что-то странное получается: раньше скрипик работал, сейчас запрашивает имя пользователя/пароль/домен... Это все входе экпериментов, и из-за чего произошло - понять никак не могу. Игрался с галочками в IE "Аутентификация стандартными средствами виндовс". Но сейча убрал...

-~{}~ 09.04.05 15:44:

slach по поводу этого модуля. Нашел под win32, скопировал в папку \modules файли mod_ntlm.so в httpd.conf прописал:

Код:
LoadModule ntlm_module modules/mod_ntlm.so

<IfModule mod_ntlm.c>
    <Location /protected/>
      AuthType NTLM 
      NTLMAuth On 
      NTLMAuthoritative On 
      NTLMOfferBasic On 

      require valid-user
    </Location>
</IfModule>
Но вот
Код:
<?
$tmp = $_SERVER["AUTH_USER"];// имя пользователя
$pas = $_SERVER["HTTP_AUTHORIZATION"];
echo "$tmp + $pas";
?>
ничего не выдает... что не так?
 

neko

tеam neko
концептуально прописал, ничего не скажешь
а как по твоему он должен догадаться откуда юзеров сверять?
 

dsa

Новичок
neko, понятно, на работе буду - попробую, о результатах сообщу.

Только у меня встречный вопрос. Можно ли аутентифицировать пользователя в одноранговой сети? Там-то контролера домена нет, все равноправны, и каждая машина отвечает за пользователей принадлежащих ей. Т.е. нет единой точнки регистрации, как тогда быть? Как распознать в рабочей группе какой пользователь и с какой машины просматривает сайт?

И еще посмотри начало моего предыдущего поста. Почему скрипт, предложенный Vetal, выкидывает окошко аутентификации, а раньше данные о юзере выводил(все это дело происходит в домене w2k3). Дома на XP(она не в домене) этот скрипт данные не выводит, а только окно аутентификации выдает.
 

neko

tеam neko
я ничо не понял что ты пишешь, сорри
ntlm работать может где угодно потому что это схема аутентификации
но mod_ntlm будет работать только при наличии домена на котором он будет проверять юзеров

как там работают эти "рабочие группы"?
iirc, человек может под любым именем в сеть зайти
т.е. сам нету никакого элемента который может авторитетно отвечать на вопросы о правах к доступа к тому или иному сетевому ресурсу.
т.е. это смысла не имеет, если я все помню правильно

-~{}~ 11.04.05 10:36:

что касается окошечек...
скрипты вообще не показывают окошечек!!!!
надо кто-то тебе разобраться с терминологией
 

dsa

Новичок
neko, в рабочей группе каждая машина отвечает за своих пользователей. Мне нужно узнать с какой машины и под каким логином заходит пользователь. И ответить на этот вопрос может только машина пользователя.

скрипты вообще не показывают окошечек!!!!
Согласен ... если не пользовать PHP GTK.

Но у меня окошко наверно выдается виндами из-за невозможности аутентифицировать пользователя через NTLM. Т.е. предлагается basik аутент(пользователь сам вводит пароль/домен). Почему так не знаю... поэтому и спрашиваю, может кто сталкивался....

ЗЫ на работу еще не попал, mod_ntlm не перенастроил...
 

neko

tеam neko
> neko, в рабочей группе каждая машина отвечает за своих пользователей. Мне нужно узнать с какой машины и
> под каким логином заходит пользователь. И ответить на этот вопрос может только машина пользователя.

тут тебе mod_ntlm никаким боком непоможет

> Но у меня окошко наверно выдается виндами из-за невозможности аутентифицировать пользователя через
> NTLM. Т.е. предлагается basik аутент(пользователь сам вводит пароль/домен).

а тут ты все перепутал
во-первых NTLM это схема авторизации, точно так же как и basic
но это никак не связанно с тем кто вводит пароль.
пароль тебя браузер спрашивает потому что твой юзер, под которым ты сидишь не в домене
и автоматически слать ему (браузеру т.е.) нечего.
 

dsa

Новичок
В общем я добрался до работы. Изменил
Код:
<IfModule mod_ntlm.c>
    <Location /protected/>
      AuthType NTLM 
      NTLMAuth On 
      NTLMAuthoritative On 
      NTLMOfferBasic On 
      NTLMDomain pdc.navikur.ru
      require valid-user
    </Location>
</IfModule>
В строке NTLMDomain писал и имя контролера домена и сам домен. Без толку. Всеравно переменные пусты... И без этой директивы пробовал.
NTLMDomain
Set to the name of the domain you want users authenticated agains for basic authentication. If not specified, the local machine, then all trusted domains are checked. [/qoute] всеравно.


У кого работает? Дайте для примера реальный конфиг, или тут ошибки поправьте...
 

neko

tеam neko
бла ты чем документацию читал, каким местом?
в NTLMDomain должно быть имя домена
таких доменов как ты написал небывает!
там точек быть не может

дальше NTLMServer должно быть имя PDC/BDC
у тебя этого вообще нет
 

neko

tеam neko
помоему нет
насколько я знаю все имена доменов на каком-то этапе приводятся к netbios именам
и некоторый софт работает именно с ними

т.е. например AD съест такое имя
а что-то может и не съесть

могу ошибаться
 

MiRacLe

просто Чудо
вообщем я спорить по поводу этого не буду, но имеенно mod_ntlm у меня с netbios именами не работает ни на винде , ни на линухе, а с FQDN успешно справляется с поставленными задачами
 

dsa

Новичок
Задал директиву NTLMServer. Что-то ни с NetBIOS именами ни с FQDN не заработало. Парни давайте так поступим. Стукнитесь кто-нить ко мне в асю:21-39-49-99-2. Я еще раз опишу проблему, дам все конфиги, проверим в чем трабла. А потом причину ошибки и правильное решение я подробно здесь опишу. Чтоб те кому еще понадобится могли все настроить с примера.

-~{}~ 14.04.05 13:42:

Вот кстати откопал в логах апача вот такую ошибку:
Код:
[Thu Apr 14 13:37:17 2005] [error] Cannot remove module mod_ntlm.c: not found in module list
Эта ошибка пишется при старте апача, что это значит?
 

SDN

Guest
А потом причину ошибки и правильное решение я подробно здесь опишу. Чтоб те кому еще понадобится могли все настроить с примера.
Ну и? Что-то получилось в итоге? А то хоцца узнать бы.. ;)
 

dsa

Новичок
Автор оригинала: SDN
Ну и? Что-то получилось в итоге? А то хоцца узнать бы.. ;)
Ничего: тогда маялся - так и не получилось. Оставил авторизацию по логину и паролю.
 
Сверху