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

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

检查AUTH_USER请求variables。 如果您的networking应用程序允许匿名访问,这将是空的,但如果您的服务器使用基本或Windows集成身份validation,它将包含已validation用户的用户名。

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

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

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

 $user = $_SERVER['AUTH_USER']; 

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

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

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

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

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

development/apache/httpd-2.2/win32/modules/mod_auth_sspi-1.0.4-2.2.2.html

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

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

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

-Craig

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

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

http://us2.php.net/ldap

查看Apache https://github.com/rsim/mod_ntlm的已修补的NTLM身份validation模块;

基于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是特定域组的一部分; 一个聪明的方法是创build一个带有文本文件的locking文件夹(可以是空白的)。 将安全设置为只有您要validation的安全/发行组。 一旦你运行@file_get_contents(<—将抛出一个警告)…如果用户没有组访问他们将无法获得文件的内容,因此,将不具有该特定的AD组访问。 这很简单,奇妙地工作。

你可以说getenv('USERNAME')

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

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

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

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/

试试这个代码:

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

你得到你的Windows(AD)用户名在PHP中

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

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

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