Solucionado

Obtener usuario logado de Windows con php

6156 visitas 12 respuestas

Buenos dias, se que estoy programando en codigo viejito, pero es lo que tengo conocimiento por ahora pasa que desarrolle un modulo y se requiere que cuando inicialice el pc ingresa con el correspondiente usuario y automaticamente se loguea en mi modulo con el respectivo usario de wihdows.

por desde Colombia

Registrado desde: 21 May 14

Respuestas

1 0

Hola GreeDony,

No llego a entender tu problema. ¿En qué consiste el módulo? ¿qué tipo de aplicación es? ¿corre en un servidor web Apache?

por desde España

Registrado desde: 02 Jul 02
0 0

Si corre en xampp. sucede que necesito que en mi modulo que es de eventos x me imprima en nombre del usuario de windows que inicio sesión, para que cualquier evento, que este usuario atendió quede registrado en la base de datos de mi modulo, pero no he podido obtener el nombre del usuario que ingreso al iniciar windows. Podría poner un formulario al ingresar a mi modulo y ya lo tiene pero se quiere es quitar ventanas y inicie automáticamente mi modulo ya logueado pero con el usuario y que inicio sesión en windows. Agradezco su atención.

por desde Colombia

Registrado desde: 21 May 14
2 0

Veamos,

Puedes obtener el usuario que inició sesión, simplemente ejecutando desde la consola de windows:

echo %username%

Si lo quieres obtener desde PHP, puedes usar la función shell_exec

http://www.php.net/manual/es/function.shell-exec.php

que te permite lanzar una orden de comando, y obtener la salida. Pero eso sí, asegúrate que la configuración de PHP que tengas te permite ejecutar ese comando.

por desde España

Registrado desde: 02 Jul 02
0 0

Gracias Javier por su atención prestada voy a intentar jugar con sus ayudas.

por desde Colombia

Registrado desde: 21 May 14
0 0

Me quedo grande Javier, no logro asimilar esto, bueno ejecuto estas instrucciones en cmd y me aloja en USERNAME de la cuenta y lo que necesito son las instrucciones para php, de tal manera que yo las pegue en mi pagina web y me ponga el username que inicio sesion. En varios foros me dicen que no se puede por seguridad de windows y mas que el servidor web quien lo pregunta, pero mi aplicacion es para una intranet o mas bien es para determinado pc que ingresan diferentes usuarios y es necesarios descriminar quien responde los eventos, Javier me puede ofrecer mas ayuda sobre esto, la verdad esta en juego mi empleo. gracias por su atención y le envio un cordial saludo,

por desde Colombia

Registrado desde: 21 May 14
4 0

Veamos, he estado investigando un poco, ya que nunca me he enfrentado al problema que comentas.

Según he visto, usando IIS (Internet Information Server) en lugar de Apache no habría problema, ya que se accedería simplemente a través de la variable

 $_SERVER['AUTH_USER'];

En el caso de Apache no resulta tan sencillo, pero parece que se puede hacer realizando una autenticación de tipo NTLM mediante el uso de header

He encontrado el siguiente código que seguro te puede venir bien. Lo que hace es pedirte usuario y contraseña y autenticarte contra el sistema de windows. Una vez identificado tienes acceso a los valores que necesitas.

<?php

// loune 25/3/2006, updated 22/08/2009
// For more information see:
// http://siphon9.net/loune/2007/10/simple-lightweight-ntlm-in-php/
//
// This script is obsolete, you should see
// http://siphon9.net/loune/2009/09/ntlm-authentication-in-php-now-with-ntlmv2-hash-checking/
//

// NTLM specs http://davenport.sourceforge.net/ntlm.html

$headers = apache_request_headers();

if (!isset($headers['Authorization'])){
    header('HTTP/1.1 401 Unauthorized');
    header('WWW-Authenticate: NTLM');
    exit;
}

$auth = $headers['Authorization'];

if (substr($auth,0,5) == 'NTLM ') {
    $msg = base64_decode(substr($auth, 5));
    if (substr($msg, 0, 8) != "NTLMSSP\x00")
        die('error header not recognised');

    if ($msg[8] == "\x01") {
        $msg2 = "NTLMSSP\x00\x02\x00\x00\x00".
            "\x00\x00\x00\x00". // target name len/alloc
            "\x00\x00\x00\x00". // target name offset
            "\x01\x02\x81\x00". // flags
            "\x00\x00\x00\x00\x00\x00\x00\x00". // challenge
            "\x00\x00\x00\x00\x00\x00\x00\x00". // context
            "\x00\x00\x00\x00\x00\x00\x00\x00"; // target info len/alloc/offset

        header('HTTP/1.1 401 Unauthorized');
        header('WWW-Authenticate: NTLM '.trim(base64_encode($msg2)));
        exit;
    }
    else if ($msg[8] == "\x03") {
        function get_msg_str($msg, $start, $unicode = true) {
            $len = (ord($msg[$start+1]) * 256) + ord($msg[$start]);
            $off = (ord($msg[$start+5]) * 256) + ord($msg[$start+4]);
            if ($unicode)
                return str_replace("\0", '', substr($msg, $off, $len));
            else
                return substr($msg, $off, $len);
        }
        $user = get_msg_str($msg, 36);
        $domain = get_msg_str($msg, 28);
        $workstation = get_msg_str($msg, 44);

        print "You are $user from $domain/$workstation";
    }
}

?>

Lo he probado y funciona perfectamente.

Más info aquí: http://siphon9.net/loune/2007/10/simple-lightweight-ntlm-in-php/

por desde España

Registrado desde: 02 Jul 02
0 0

Gracias Javier por el interés que me ha prestado con respecto a mi pregunta, voy a aplicarlo y le estaré contando,

por desde Colombia

Registrado desde: 21 May 14
0 0

GRACIAS JAVIER ME A DADO LA RESPUESTA MUY CLARA LE AGRADEZCO SU ATENCIÓN Y SOLUCIÓN.

por desde Colombia

Registrado desde: 21 May 14
0 0

Javier, qué has estudiado? tienes respuesta para todo! increíble!

por

Registrado desde: 02 Jun 14
0 0

Jaja, hice Ingeniería Informática, pero no tengo respuesta para todo, ya me gustaría! Hay muchas cosas que sé, pero muchas otras que desconozco y tengo que investigar un poco para cómo funcionan ;)

por desde España

Registrado desde: 02 Jul 02
0 0

ya bueno pero lo que está bien es que si no lo sabes te documentas. Que me encontrado con muchos informáticos que te dicen que de ese tema no saben y se desentienden! Un saludo :)

por

Registrado desde: 02 Jun 14
0 0

algo simple si entendi el tema seria...

<?php echo $user = getenv('USERNAME'); ?>

Pueden usar cualquier variable del phpinfo con esta cadena...

saludos!

por

Registrado desde: 1 mes