我在内部网上有一个PHP Web应用程序,可以在该页面上提取当前用户的IP和主机名,但我想知道是否有办法获取/提取他们的Active Directory/Windows用户名。这可能吗?
检查AUTH_USER
请求变量。如果 Web 应用允许匿名访问,则此字段将为空,但如果服务器使用基本身份验证或 Windows 集成身份验证,它将包含经过身份验证的用户的用户名。
在 Active Directory 域中,如果您的客户端正在运行 Internet Explorer 并且您的 Web 服务器/文件系统权限配置正确,IE 将以静默方式将其域凭据提交到您的服务器,并且AUTH_USER
将MYDOMAIN'user.name
用户无需显式登录到您的 Web 应用程序。
上运行了 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>
否。 但是您可以做的是让您的Active Directory管理员启用LDAP,以便用户可以维护一组凭据
http://us2.php.net/ldap
与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;
这是我最终能够获得用户的活动目录用户名的唯一方法。如果上述答案都不起作用,请尝试一下。