你可以在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,以便用户可以维护一组凭据
查看Apache https://github.com/rsim/mod_ntlm的已修补的NTLM身份validation模块;
基于Apache / Unix的NTLM授权模块http://modntlm.sourceforge.net/
资料来源: 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库可以让事情变得更简单:
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>
如果你需要模块,这个链接是有用的:
试试这个代码:
$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;
这是我终于能够获得用户的活动目录用户名的唯一方法。 如果以上答案都没有成功,请尝试一下。