Можете ли вы получить имя пользователя Windows (AD) в PHP?
У меня есть веб-приложение PHP в интрасети, которое может извлекать IP-адрес и имя хоста текущего пользователя на этой странице, но мне было интересно, есть ли способ получить/извлечь их имя пользователя Active Directory/Windows. Возможно ли это?
15 answers
Проверьте переменную запроса AUTH_USER
. Это поле будет пустым, если ваше веб-приложение разрешает анонимный доступ, но если ваш сервер использует базовую или встроенную проверку подлинности Windows, оно будет содержать имя пользователя, прошедшего проверку подлинности.
В домене Active Directory, если ваши клиенты работают под управлением Internet Explorer и разрешения вашего веб-сервера/файловой системы настроены правильно, IE автоматически отправит свои учетные данные домена на ваш сервер и AUTH_USER
будет MYDOMAIN\user.name
без пользователей необходимость явного входа в ваше веб-приложение.
У меня есть php mysql, работающий на IIS - я могу использовать $_SERVER["AUTH_USER"]
если Я включу проверку подлинности Windows в IIS -> Проверка подлинности и отключу анонимную проверку подлинности (важно)
Я использовал это, чтобы получить своего пользователя и домен:
$user = $_SERVER['AUTH_USER'];
$user
вернет значение типа: DOMAIN\username
в нашей сети, а затем это просто случай удаления DOMAIN\
из строки.
До сих пор это работало в IE, FF, Chrome, Safari (протестировано).
Посмотрите на функции библиотеки LDAP PHP: http://us.php.net/ldap .
Active Directory [в основном] соответствует стандарту LDAP.
Если вы используете Apache в Windows, вы можете установить mod_auth_sspi из
Http://www.gknw.at/development/apache/httpd-2.2/win32/modules/mod_auth_sspi-1.0.4-2.2.2.zip
Инструкции содержатся в файле УСТАНОВКИ, и в нем есть whoami.php пример. (Это просто случай копирования mod_auth_sspi.so файл в папку и добавление строки в httpd.conf.)
После его установки и выполнения необходимых настроек в httpd.conf для защиты каталогов если вы хотите, PHP заполнит $_SERVER['REMOTE_USER']
пользователем и доменом ("ПОЛЬЗОВАТЕЛЬ\ДОМЕН") аутентифицированного пользователя в IE - или запросит и аутентифицирует в Firefox перед его передачей.
Информация основана на сеансе, поэтому одиночный (иш) вход возможен даже в Firefox...
-Крейг
Вероятно, вы могли бы аутентифицировать пользователь в Apache с mod_auth_kerb, требуя аутентифицированного доступа к некоторым файлам … Я думаю, что таким образом имя пользователя также должно быть доступно где-то в переменных среды PHP... вероятно, лучше всего проверить с помощью <?php phpinfo(); ?>
, как только вы запустите его.
Нет. Но что вы можете сделать, так это попросить администратора Active Directory включить LDAP, чтобы пользователи могли поддерживать один набор учетных данных
Проверьте исправленный модуль аутентификации NTLM для Apache https://github.com/rsim/mod_ntlm
На основе модуля аутентификации NTLM для Apache/Unix http://modntlm.sourceforge.net/
Подробнее читайте в http://blog.rayapps.com/
Источник: http://imthi.com/blog/programming/leopard-apache2-ntlm-php-integrated-windows-authentication.php
Если вы хотите получить идентификатор удаленного пользователя/имя пользователя, используйте:
echo gethostbyaddr($_SERVER['REMOTE_ADDR']);
Вы получите что-то вроде iamuser1-mys.corp.company.com
Отфильтруйте оставшуюся часть домена, и вы сможете получить только идентификатор idsid.
Для получения дополнительной информации посетите http://lostwithin.net/how-to-get-users-ip-and-computer-name-using-php/
Вы можете сказать getenv('USERNAME')
Get_user_name работает так же, как getenv('ИМЯ ПОЛЬЗОВАТЕЛЯ');
У меня были проблемы с кодировкой (с кириллицей) с использованием getenv('ИМЯ ПОЛЬЗОВАТЕЛЯ')
Ссылка на попытку также выяснить, является ли AUTH_USER частью определенной доменной группы; разумный способ сделать это - создать заблокированную папку с текстовыми файлами (может быть пустой). Установите безопасность только для группы безопасности/дистрибутива, которую вы хотите проверить. Как только вы запустите @file_get_contents (
В нашей среде есть несколько доменов, поэтому я использую preg_replace с регулярным выражением, чтобы получить только имя пользователя без ДОМЕНА\.
preg_replace("/^.+\\\\/", "", $_SERVER["AUTH_USER"]);
Это простой пример интеграции NTLM AD, позволяет выполнять единый вход в Internet Explorer, требует входа/настройки в других браузерах.
Пример PHP
<?php
$user = $_SERVER['REMOTE_USER'];
$domain = getenv('USERDOMAIN');
?>
В вашем файле apache httpd.conf
LoadModule authnz_sspi_module modules/mod_authnz_sspi.so
<Directory "/path/to/folder">
AllowOverride All
Options ExecCGI
AuthName "SSPI Authentication"
AuthType SSPI
SSPIAuth On
SSPIAuthoritative On
SSPIOmitDomain On
Require valid-user
Require user "NT AUTHORITY\ANONYMOUS LOGON" denied
</Directory>
И если вам нужен модуль, эта ссылка полезна:
Попробуйте этот код:
$user= shell_exec("echo %username%");
echo "user : $user";
Вы получаете свое имя пользователя windows(AD) в php
Я перепробовал почти все эти предложения, но все они возвращали пустые значения. Если у кого-то еще есть эта проблема, я нашел эту удобную функцию на php.net (http://php.net/manual/en/function.get-current-user.php):
get_current_user();
$username = get_current_user();
echo $username;
Это был единственный способ, которым я, наконец, смог получить имя пользователя active directory. Если ни один из вышеперечисленных ответов не сработал, попробуйте это сделать.