你能在PHP中获得一个Windows(AD)用户名吗?


Can you get a Windows (AD) username in PHP?

我在内部网上有一个PHP Web应用程序,可以在该页面上提取当前用户的IP和主机名,但我想知道是否有办法获取/提取他们的Active Directory/Windows用户名。这可能吗?

检查AUTH_USER请求变量。如果 Web 应用允许匿名访问,则此字段将为空,但如果服务器使用基本身份验证或 Windows 集成身份验证,它将包含经过身份验证的用户的用户名。

在 Active Directory 域中,如果您的客户端正在运行 Internet Explorer 并且您的 Web 服务器/文件系统权限配置正确,IE 将以静默方式将其域凭据提交到您的服务器,并且AUTH_USERMYDOMAIN'user.name用户无需显式登录到您的 Web 应用程序。

我已经在 IIS

上运行了 php mysql - 如果我在 IIS 中打开 Windows 身份验证,我可以使用$_SERVER["AUTH_USER"] ->身份验证并关闭匿名身份验证(重要)

我用它来获取我的用户和域:

$user = $_SERVER['AUTH_USER'];

$user将返回一个值,例如:在我们的网络上DOMAIN'username,然后只是从字符串中删除DOMAIN'的情况。

到目前为止,这在IE,FF,Chrome,Safari(测试)中已经有效。

看看 PHP LDAP 库函数: http://us.php.net/ldap。

Active Directory [大部分] 符合 LDAP 标准。

我们的环境中有多个域,所以我使用正则表达式的preg_replace来获取没有 DOMAIN'' 的用户名。

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

如果您在Windows上使用Apache,则可以从以下位置安装mod_auth_sspi

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

说明在 INSTALL 文件中,还有一个 whoami.php 示例。(这只是将 mod_auth_sspi.so 文件复制到文件夹中并在 httpd.conf 中添加一行的情况。

一旦它被安装并在httpd.conf中进行必要的设置以保护你想要的目录,PHP将使用IE中经过身份验证的用户的用户和域('USER''DOMAIN')填充$_SERVER['REMOTE_USER'] - 或者在传入之前在Firefox中提示并进行身份验证。

信息是基于会话的,因此即使在 Firefox 中也可以进行单点登录...

-克雷格

您可以通过要求对某些文件进行经过身份验证的访问来使用 Apache 中的用户进行身份验证mod_auth_kerb...我认为这样,用户名也应该在某处的 PHP 环境变量中可用......可能最好在运行后与<?php phpinfo(); ?>核实。

如果要检索远程用户 IDSID/用户名,请使用:

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

你会得到类似的东西iamuser1-mys.corp.company.com

过滤后面的其余域,您只能获得 idsid。

欲了解更多信息,请访问 http://lostwithin.net/how-to-get-users-ip-and-computer-name-using-php/

使用以下代码:

shell_exec("wmic computersystem get username")

查看 Apache 修补的 NTLM 身份验证模块https://github.com/rsim/mod_ntlm

基于 Apache/Unix 的 NTLM 身份验证模块http://modntlm.sourceforge.net/

阅读更多内容,请访问 http://blog.rayapps.com/

来源: http://imthi.com/blog/programming/leopard-apache2-ntlm-php-integrated-windows-authentication.php

你可以说getenv('USERNAME')<</p>

div class="answers">

否。 但是您可以做的是让您的Active Directory管理员启用LDAP,以便用户可以维护一组凭据

http://us2.php.net/ldap

get_user_name的工作方式

与getenv('USERNAME')相同;

我在使用 getenv('用户名')时遇到编码(西里尔文)问题

引用试图

确定AUTH_USER是否属于特定域组;一个聪明的方法是创建一个带有文本文件的锁定文件夹(可以是空白)。 将安全性设置为仅具有要验证的安全性/发行版组。 一旦你运行了一个@file_get_contents(<---会抛出一个警告)...如果用户没有组访问权限,他们将无法获取文件内容,因此将不具有该特定的 AD 组访问权限。 这很简单,效果很好。

这是一个简单的 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/

让我们试试这个,它将从Windown登录中获取用户名

<?php
echo getenv('username');
?>

试试这段代码:

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

您以PHP格式获取Windows(AD)用户名

我尝试了几乎所有这些建议,但它们都返回空值。如果其他人有这个问题,我在 php.net (http://php.net/manual/en/function.get-current-user.php) 上找到了这个方便的功能:

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

这是我最终能够获得用户的活动目录用户名的唯一方法。如果上述答案都不起作用,请尝试一下。