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

Kapacb

Новичок
Есть кто нибудь кто пользовался кодом, приведенным Vetal?
Код работает, все отлично, вот только после него перестают передаваться переменные методом POST :(
Начинает передаваться только после открытия заново IE? Проблема судя по всему в заголовках, а вот в чем именно - хз...
 

kinrew

Новичок
Добрый день!
Спасибо, код приведённый Vetal работает, но только для пользователей, которые не в домене (показывает окошко браузера с запросом на логин и пароль, после ввода которых пишет "Votre navigateur Internet n'est pas compatible avec le NTLM, utiliser IE...Merci", хотя используется IE).
Примечание: иногда приходится включать опцию настроек безопасности "Автоматический вход в сеть с текущим именем пользователя и паролем", иначе показывает окошко браузера с запросом на логин и пароль, после ввода которых пишет "Votre navigateur Internet n'est pas compatible avec le NTLM, utiliser IE...Merci", хотя используется IE

Скачал mod_ntlm, но вот инструкций по настройке не нашёл. Помогите пожалуйста с настройкой (не совсем понял приведённые на форуме отрывки). mod_ntlm поможет с автоматической авторизацией доменных пользователей?
 

kinrew

Новичок
Код, приведённый Vetal, полностью рабочий и работает без дополнительных модулей.
Иногда браузер выдаёт окошко с запросом логин+пароль, тогда нужно добавить сайт или страницу, где выполняется этот код в список надёжных узлов.
 

GRisly

Новичок
Автор оригинала: Kapacb
Есть кто нибудь кто пользовался кодом, приведенным Vetal?
Код работает, все отлично, вот только после него перестают передаваться переменные методом POST :(
Начинает передаваться только после открытия заново IE? Проблема судя по всему в заголовках, а вот в чем именно - хз...
Та же проблема :(
 

boban

Новичок
Автор оригинала: 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.         
*
***********************************************************************/

$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";
        
        }

    }

}


?>
У меня не получается сравнить $login со своим логином ($login2):
Значит: if ($login==$login2) {echo ("login = login2");} else {echo ("login не равен login2");}
Всегда выдается сообщение о том что логины не равны. Даже выважу их на экран вижу что равны, а скрипт говорит что не равны!
В чем м/б проблема, подскажите, плз!
З.Ы. Локалка, AD, скрипт выдает правильные: Домен, логин и хост.
 

GRisly

Новичок
Автор оригинала: boban
У меня не получается сравнить $login со своим логином ($login2):
Значит: if ($login==$login2) {echo ("login = login2");} else {echo ("login не равен login2");}
Всегда выдается сообщение о том что логины не равны. Даже выважу их на экран вижу что равны, а скрипт говорит что не равны!
В чем м/б проблема, подскажите, плз!
З.Ы. Локалка, AD, скрипт выдает правильные: Домен, логин и хост.
PHP:
$strLogin ='';
              for($i=0;$i<strlen($login);$i++)
              {
                      if(ord($login[$i])!="0x00")
                         $strLogin.=$login[$i];
              }
Мой выход из этого положения
 

zerkms

TDD infected
Команда форума
GRisly
какой ужасный выход...
наверное лучше бы вы и не выходили
 

boban

Новичок
Автор оригинала: GRisly
PHP:
$strLogin ='';
              for($i=0;$i<strlen($login);$i++)
              {
                      if(ord($login[$i])!="0x00")
                         $strLogin.=$login[$i];
              }
Мой выход из этого положения
Спасиба!
ВЫход хороший, подскажи пож-та как сделать так чтобы скрипт все буквы преобразовал в прописные или в строчные,
бывает что получаемый логин начинается с заглавной буквы, а базе-сравнения логин прописан строчными буквами и на выходе разные получаются логины. :confused:
 

GRisly

Новичок
Автор оригинала: boban
ВЫход хороший, подскажи пож-та как сделать так чтобы скрипт все буквы преобразовал в прописные или в строчные,
бывает что получаемый логин начинается с заглавной буквы, а базе-сравнения логин прописан строчными буквами и на выходе разные получаются логины. :confused:
PHP:
strcasecmp($login,$login2);
-~{}~ 12.10.06 18:27:

Ситуация: Пользователь зашел с помощью NTLM а после этого вышел и зашел с помощью пароля не закрывая окна. POST запросы работать перестают. Может там можно как-нибудь убить информацию о том, что нужен NTLM? Хедер какой послать может можно?
 

Daemon.XP

Новичок
Автор оригинала: boban
Спасиба!
ВЫход хороший, подскажи пож-та как сделать так чтобы скрипт все буквы преобразовал в прописные или в строчные,
бывает что получаемый логин начинается с заглавной буквы, а базе-сравнения логин прописан строчными буквами и на выходе разные получаются логины. :confused:
$login = strtolower($login)

-~{}~ 05.04.08 19:42:

Кто знает как заставить IE 7 посылать Authorization в headers? в ie 6 прекрасно все работает
 

berkut

Новичок
слушай, ты-же слово давал... так ты уйдёшь наконец или так и будешь ныть?
 

GRisly

Новичок
После обновления KB963027 от Microsoft :http://support.microsoft.com/kb/963027 слетает авторизация NTLM.
решается добавлением в реестр на машине клиента HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0 key:BackConnectionHostNames
value: ИМЯ_СЕРВЕРА
добавляем строчку "IP_СЕРВЕРА ИМЯ_СЕРВЕРА" в файл %windir%\system32\drivers\etc\hosts
 
Сверху