Можете ли вы получить имя пользователя Windows (AD) в PHP?

У меня есть веб-приложение PHP в интрасети, которое может извлекать IP-адрес и имя хоста текущего пользователя на этой странице, но мне было интересно, есть ли способ получить / извлечь их имя пользователя Active Directory / Windows. Это возможно?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
47
0
163 668
16
Перейти к ответу Данный вопрос помечен как решенный

Ответы 16

Нет. Но вы можете сделать так, чтобы ваш администратор Active Directory включил LDAP, чтобы пользователи могли поддерживать один набор учетных данных.

http://us2.php.net/ldap

Вам не нужно включать LDAP, поскольку это основной компонент Active Directory.

VVS 04.10.2008 00:00
Ответ принят как подходящий

Проверьте переменную запроса AUTH_USER. Он будет пустым, если ваше веб-приложение разрешает анонимный доступ, но если ваш сервер использует базовую проверку подлинности или встроенную проверку подлинности Windows, он будет содержать имя пользователя, прошедшего проверку подлинности.

В домене Active Directory, если ваши клиенты работают с Internet Explorer и разрешения вашего веб-сервера / файловой системы настроены правильно, IE будет молча отправить свои учетные данные домена на ваш сервер, а AUTH_USER будет MYDOMAIN\user.name без необходимости явного входа пользователей в вашу сеть. приложение.

только IE передает ваши учетные данные, другие браузеры просто запрашивают, и в этом случае вам просто нужно указать учетные данные своего домена (домен \ имя пользователя и пароль).

CodeMonkey1313 25.08.2009 19:15

Firefox также поддерживает (автоматическую) встроенную аутентификацию. см. developer.mozilla.org/en/Integrated_Authentication

VolkerK 21.03.2010 02:21

Если мое приложение выполняет разумные операции: могу ли я полностью доверять переданному AUTH_USER? Клиенты являются частью хорошо управляемой корпоративной интрасети. Помимо AUTH_USER, мне нужно знать, принадлежит ли пользователь к определенной группе. Будет ли эта информация передана? И, наконец, есть ли у вас URL-адрес, описывающий вашу информацию?

SteAp 10.11.2011 03:40

Спасибо за этот ответ. Не забудьте отключить анонимный доступ в IIS и включить встроенную проверку подлинности Windows. Используя Intraweb, можно получить затем аутентифицированного пользователя с помощью WebApplication.Request.GetFieldByName ('AUTH_USER')

Pieter van Wyk 16.09.2014 19:57

У меня встроенная проверка подлинности Windows, и даже с IE пользователь спрашивает. Я не могу заставить его работать с IIS.

manou 01.06.2015 23:20

@Simurr это возможно не только с IE, большинство других браузеров поддерживают его, но только в IE он включен для всего Интернета по умолчанию, остальные вы должны включить его вручную, прежде чем вы сможете его использовать, для firefox вы можете использовать это дополнение или вручную выставить конфиг addons.mozilla.org/en-GB/firefox/addon/…

MikeT 06.02.2017 14:52

@MikeT, учитывая, что мой комментарий был от '08, вероятно, это было возможно только в IE, хотя я лишь смутно помню, как изучал его. Приятно знать, что сейчас это работает.

Simurr 07.02.2017 00:21

Спасибо команде. Но мой случай другой. У меня много приложений, размещенных на одном сервере. Поэтому я хотел получить учетные данные AD с компьютера локального пользователя только для одного приложения. Если я включу аутентификацию AD и отключу анонимный доступ, все другие приложения также будут заполнять учетные данные AD. Поэтому, пожалуйста, подскажите, что я могу сделать только для индивидуального применения.

Rajan 21.08.2018 12:54

Посмотрите на функции библиотеки PHP LDAP: http://us.php.net/ldap.

Active Directory [в основном] соответствует стандарту LDAP.

Вероятно, вы могли бы подтвердить подлинностьпользователь в Apache с mod_auth_kerb, требуя аутентифицированного доступа к некоторым файлам ... Я думаю, что таким образом имя пользователя также должно быть доступно где-то в переменных среды PHP ... вероятно, лучше всего проверить <?php phpinfo(); ?>, как только вы его запустите.

Если вы используете Apache в Windows, вы можете установить mod_auth_sspi из

https://sourceforge.net/projects/mod-auth-sspi/

Инструкции находятся в файле INSTALL, и есть пример whoami.php. (Это просто случай копирования файла mod_auth_sspi.so в папку и добавления строки в httpd.conf.)

После установки и выполнения необходимых настроек в httpd.conf для защиты желаемых каталогов PHP заполнит $_SERVER['REMOTE_USER'] пользователем и доменом ('USER \ DOMAIN') аутентифицированного пользователя в IE - или запросит и аутентифицируется в Firefox перед его передачей.

Информация основана на сеансе, поэтому однократный вход в систему возможен даже в Firefox ...

-Крейг

Привет! Что делать, если вы используете Apache в Ubuntu и по-прежнему хотите загрузить имя пользователя Windows (AD)?

Gayolomao 20.03.2020 15:03

Можно сказать getenv('USERNAME')

Но вам необходимо установить модуль Apache, чтобы использовать эту функцию. apt-get install libapache2-authenntlm-perl

SatanicGeek 12.05.2016 13:04

Это даст вам только имя компьютера.

Mike 07.07.2016 16:48

Это не даст вам имя пользователя на другом конце, оно даст вам имя пользователя, запустившего процесс Apache 2.

ZaxLofful 05.08.2019 22:29

У меня есть php mysql, работающий в IIS - я могу использовать $_SERVER["AUTH_USER"]если Я включаю проверку подлинности Windows в IIS -> Проверка подлинности и выключаю анонимную проверку подлинности (важно)

Я использовал это, чтобы получить своего пользователя и домен:

$user = $_SERVER['AUTH_USER'];

$user вернет значение вроде: DOMAIN\username в нашей сети, и тогда это просто случай удаления DOMAIN\ из строки.

До сих пор это работало в IE, FF, Chrome, Safari (проверено).

У меня php работает на IIS, и для этого сайта включена только проверка подлинности Windows. У меня нет этой информации. Что я мог перепроверить?

manou 01.06.2015 23:23

После включения проверки подлинности Windows в IIS -> Проверка подлинности и отключения анонимной проверки подлинности это сработало для меня. Спасибо, ура!

user752746 08.05.2019 21:06

Проверьте исправленный модуль аутентификации NTLM для Apache https://github.com/rsim/mod_ntlm

На основе модуля NTLM auth для Apache / Unix http://modntlm.sourceforge.net/

Подробнее на http://blog.rayapps.com/

Источник: http://imthi.com/blog/programming/leopard-apache2-ntlm-php-integrated-windows-authentication.php

get_user_name работает так же, как getenv ('USERNAME');

У меня были проблемы с кодировкой (кириллицей) с использованием getenv ('USERNAME')

Если вы хотите получить IDSID / имя пользователя удаленного пользователя, используйте:

echo gethostbyaddr($_SERVER['REMOTE_ADDR']);

Вы получите что-то вроде iamuser1-mys.corp.company.com

Отфильтруйте остальную часть домена позади, и вы сможете получить только идентификатор.

Для получения дополнительной информации посетите http://lostwithin.net/how-to-get-users-ip-and-computer-name-using-php/

Ссылка на попытку выяснить, является ли AUTH_USER частью определенной доменной группы; умный способ сделать это - создать заблокированную папку с текстовыми файлами (может быть пустой). Установите безопасность только на наличие группы безопасности / дистрибутива, которую вы хотите проверить. Как только вы запустите @file_get_contents (<--- выдаст предупреждение) ... если у пользователя нет доступа к группе, он не сможет получить содержимое файла и, следовательно, не будет иметь доступа к этой конкретной группе AD. Это просто и прекрасно работает.

У нас есть несколько доменов в нашей среде, поэтому я использую preg_replace с регулярным выражением, чтобы получить только имя пользователя без DOMAIN \.

preg_replace("/^.+\/", "", $_SERVER["AUTH_USER"]);

попробуйте этот код:

$user= shell_exec("echo %username%"); 
    echo "user : $user";

вы получаете свое имя пользователя Windows (AD) на php

Это даст вам только имя компьютера

Katia 02.01.2018 16:17

Я пробовал почти все эти предложения, но все они возвращали пустые значения. Если у кого-то еще есть эта проблема, я нашел эту удобную функцию на php.net (http://php.net/manual/en/function.get-current-user.php):

get_current_user();
$username = get_current_user();
echo $username;

Это был единственный способ получить имя пользователя активного каталога пользователя. Если ни один из приведенных выше ответов не помог, попробуйте.

Я думаю, таким образом вы получаете пользователя, который запускает ваш PHP на сервере, а не пользователя, который вошел в систему на своей машине и отправляет запрос из веб-браузера на вашу страницу PHP. В этом случае у вас может быть серьезная дыра в безопасности, поскольку ваша страница PHP работает от имени совершенно другого пользователя с разными разрешениями.

JustAMartin 14.07.2017 15:45

@JustAMartin Я тестировал это в течение последних нескольких месяцев, и я постоянно получаю пользователя, который вошел в систему и получает доступ к веб-сайту, созданному моим PHP, а не наоборот.

Purple Lady 14.07.2017 20:20

Это простой пример интеграции 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>

А если вам нужен модуль, пригодится эта ссылка:

https://www.apachehaus.net/modules/mod_authnz_sspi/

Используйте этот код:

shell_exec("wmic computersystem get username")

Другие вопросы по теме