你可以在PHP中获得Windows(AD)用户名吗?

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

Solutions Collecting From Web of "你可以在PHP中获得Windows(AD)用户名吗?"

检查AUTH_USER请求变量。 如果您的网络应用程序允许匿名访问,这将是空的,但如果您的服务器使用基本或Windows集成身份验证,它将包含经过身份验证的用户的用户名。

在Active Directory域中,如果您的客户端正在运行Internet Explorer,并且您的Web服务器/文件系统权限配置正确,则IE将以静默方式将其域证书提交给您的服务器,而AUTH_USER将为MYDOMAIN\user.name ,用户不必明确地登录进入您的网络应用程序。

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

我用这个来获得我的用户和域名:

 $user = $_SERVER['AUTH_USER']; 

$user会在我们的网络上返回一个类似于DOMAIN\username的值,然后就是从字符串中删除DOMAIN\一个例子。

这在IE,FF,Chrome,Safari(已测试)到目前为止工作。

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

活动目录[主要]符合LDAP标准。

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

http://www.gknw.at/development/apache/httpd-2.2/win32/modules/mod_auth_sspi-1.0.4-2.2.2.zip

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

一旦安装完成并在httpd.conf中进行了必要的设置以保护您所希望的目录,PHP将在IE中使用经过身份验证的用户的用户和域(“USER \ DOMAIN”)填充$_SERVER['REMOTE_USER'] , – 或者在传入之前在Firefox中提示并进行身份验证。

信息是基于会话的,所以即使在Firefox中也可以使用单个(ish)登录。

-Craig

你可以用mod_auth_kerb 验证 用户的 身份,通过验证访问某些文件…我认为这样,用户名应该也可以在PHP环境变量的某处…可能最好检查一下<?php phpinfo(); ?> 一旦你得到它runnning。

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

http://us2.php.net/ldap

查看Apache https://github.com/rsim/mod_ntlm的已修补的NTLM身份验证模&#x5757;

基于Apache / Unix的NTLM授权模块http://modntlm.sourceforge.net/

阅读更多在http://blog.rayapps.com/

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

如果您正在寻找检索远程用户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/

还有一些额外的PEAR库可以让事情变得更简单:

http://pear.php.net/search.php?q=ldap&in=packages&x=0&y=0

get_user_name与getenv('USERNAME')的工作方式相同。

我使用getenv('USERNAME')编码(与西里尔)问题

参考也试图找出如果AUTH_USER是特定域组的一部分; 一个聪明的方法是创建一个带有文本文件的锁定文件夹(可以是空白的)。 将安全设置为只有您要验证的安全/发行组。 一旦你运行@file_get_contents(<—将抛出一个警告)…如果用户没有组访问他们将无法获得文件的内容,因此,将不具有该特定的AD组访问。 这很简单,奇妙地工作。

你可以说getenv('USERNAME')

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

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

这是一个简单的NTLM AD集成示例,允许使用Internet Explorer单点登录,需要在其他浏览器中登录/配置。

PHP示例

 <?php $user = $_SERVER['REMOTE_USER']; $domain = getenv('USERDOMAIN'); ?> 

在你的apache httpd.conf文件中

 Loadmodulee 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/

试试这个代码:

 $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; 

这是我终于能够获得用户的活动目录用户名的唯一方法。 如果以上答案都没有成功,请尝试一下。