Welcome to PHPClub
В эти выходные на LinuxFest v.12! Поляна от PHPClubа Мастер-классы по Javascript, AJAX/COMET, jQuery!
Боишься нашего дизайна?
поиск:
   
 Начало | Настройки | Расширенный поиск | РегистрацияПосмотреть новые сообщения 
  
PHP Club форумы: > Разное > PHP & W$NDOWS > Вытаскивание имени виндового пользователя
Страниц (2): [1] 2 » |  

Автор
Тема ОТВЕТИТЬ
dsa
Новичок

На форуме с: Feb 2005
Cообщений: 10
Город: Kursk, Russia
Вытаскивание имени виндового пользователя

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

__________________
Disce, sed а doctis, indoctos ipse doceto - у знающих учись, а незнающих сам учи.

Old Post 08.02.05 07:38 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
Vetal
Продвинутый новичок

На форуме с: Jul 2003
Cообщений: 114
Город: Sevastopol


<?php

/***********************************************************************
*    PHP NTLM GET LOGIN 
*    Version 0.2
* ====================================================  
*                                        
* Copyright (c) 2004 Nicolas GOLLET (Nicolas.gollet@secusquad.com)
* 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($chaine5);             // 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";
        
        }

    }

}


?>

Old Post 08.02.05 07:53 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
dsa
Новичок

На форуме с: Feb 2005
Cообщений: 10
Город: Kursk, Russia

Проверил, все работает, спасибо!

__________________
Disce, sed а doctis, indoctos ipse doceto - у знающих учись, а незнающих сам учи.

Old Post 08.02.05 08:21 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
neko
tеam neko

На форуме с: May 2004
Cообщений: 2624
Город:

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

Old Post 08.02.05 08:31 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
slach
Старожил PHPCluba

На форуме с: Nov 2001
Cообщений: 1902
Город: Chelyabinsk, Russia

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

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

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

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

Old Post 08.02.05 08:47 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
dsa
Новичок

На форуме с: Feb 2005
Cообщений: 10
Город: Kursk, Russia

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

-~{}~ 09.04.05 15:44:

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

code:
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>

Но вот
code:
<? $tmp = $_SERVER["AUTH_USER"];// имя пользователя $pas = $_SERVER["HTTP_AUTHORIZATION"]; echo "$tmp + $pas"; ?>


ничего не выдает... что не так?


__________________
Disce, sed а doctis, indoctos ipse doceto - у знающих учись, а незнающих сам учи.
Old Post 09.04.05 12:43 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
neko
tеam neko

На форуме с: May 2004
Cообщений: 2624
Город:

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

Old Post 09.04.05 21:53 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
dsa
Новичок

На форуме с: Feb 2005
Cообщений: 10
Город: Kursk, Russia

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

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

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


__________________
Disce, sed а doctis, indoctos ipse doceto - у знающих учись, а незнающих сам учи.
Отредактировано dsa 10.04.05 в 16:36

Old Post 10.04.05 16:31 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
neko
tеam neko

На форуме с: May 2004
Cообщений: 2624
Город:

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

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

-~{}~ 11.04.05 10:36:

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

Old Post 11.04.05 07:34 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
dsa
Новичок

На форуме с: Feb 2005
Cообщений: 10
Город: Kursk, Russia

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

 
скрипты вообще не показывают окошечек!!!!


Согласен ... если не пользовать PHP GTK.

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

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


__________________
Disce, sed а doctis, indoctos ipse doceto - у знающих учись, а незнающих сам учи.

Old Post 11.04.05 12:55 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
neko
tеam neko

На форуме с: May 2004
Cообщений: 2624
Город:

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

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

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

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

Old Post 11.04.05 13:01 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
dsa
Новичок

На форуме с: Feb 2005
Cообщений: 10
Город: Kursk, Russia

В общем я добрался до работы. Изменил

code:
<IfModule mod_ntlm.c> <Location /protected/> AuthType NTLM NTLMAuth On NTLMAuthoritative On NTLMOfferBasic On NTLMDomain pdc.navikur.ru require valid-user </Location> </IfModule>

В строке NTLMDomain писал и имя контролера домена и сам домен. Без толку. Всеравно переменные пусты... И без этой директивы пробовал.[quote]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] всеравно.


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


__________________
Disce, sed а doctis, indoctos ipse doceto - у знающих учись, а незнающих сам учи.
Old Post 12.04.05 10:02 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
neko
tеam neko

На форуме с: May 2004
Cообщений: 2624
Город:

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

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

Old Post 13.04.05 12:05 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
MiRacLe
просто Чудо

На форуме с: Jun 2003
Cообщений: 1074
Город: Moscow, Russia

 
там точек быть не может


?

NTLMDomain intranet.my_work.com
NTLMServer pdc.intranet.my_work.com

neko это не правильно ?

Old Post 13.04.05 12:11 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
neko
tеam neko

На форуме с: May 2004
Cообщений: 2624
Город:

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

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

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

Old Post 13.04.05 12:31 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
MiRacLe
просто Чудо

На форуме с: Jun 2003
Cообщений: 1074
Город: Moscow, Russia

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

Old Post 13.04.05 12:35 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
dsa
Новичок

На форуме с: Feb 2005
Cообщений: 10
Город: Kursk, Russia

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

-~{}~ 14.04.05 13:42:

Вот кстати откопал в логах апача вот такую ошибку:

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

__________________
Disce, sed а doctis, indoctos ipse doceto - у знающих учись, а незнающих сам учи.
Old Post 14.04.05 09:46 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
SDN
Guest

На форуме с: Not Yet
Cообщений: N/A
Город:

 
А потом причину ошибки и правильное решение я подробно здесь опишу. Чтоб те кому еще понадобится могли все настроить с примера.


Ну и? Что-то получилось в итоге? А то хоцца узнать бы..

Old Post 09.09.05 12:04 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
dsa
Новичок

На форуме с: Feb 2005
Cообщений: 10
Город: Kursk, Russia

 
Автор оригинала: SDN
Ну и? Что-то получилось в итоге? А то хоцца узнать бы..

Ничего: тогда маялся - так и не получилось. Оставил авторизацию по логину и паролю.


__________________
Disce, sed а doctis, indoctos ipse doceto - у знающих учись, а незнающих сам учи.

Old Post 09.09.05 21:19 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
SDN
Guest

На форуме с: Not Yet
Cообщений: N/A
Город:

 
Ничего: тогда маялся - так и не получилось. Оставил авторизацию по логину и паролю.


Абыдна..

Old Post 19.09.05 10:05 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
Время GMT. Текущее время 23:26. Подписаться на Тему | Версия для Печати
Страниц (2): [1] 2 » |  

PHP Club форумы: > Разное > PHP & W$NDOWS > Вытаскивание имени виндового пользователя
 
Оценить:
 
 
 
 

 © 1997-2010 PHPClubTeam      

Powered by vBulletin Copyright © 2000-2010 Jelsoft Enterprises Limited.