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

时间:2008-10-03 19:53:13

标签: php windows authentication

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

16 个答案:

答案 0 :(得分:44)

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

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

答案 1 :(得分:16)

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

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

$user = $_SERVER['AUTH_USER'];

$user会在我们的网络上返回类似DOMAIN\username的值,然后只是从字符串中删除DOMAIN\的情况。

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

答案 2 :(得分:4)

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

Active Directory [主要]符合LDAP标准。

答案 3 :(得分:3)

如果您在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中也可以进行单点(ish)登录...

-Craig

答案 4 :(得分:2)

您可能authenticate the user in Apache mod_auth_kerb要求对某些文件进行身份验证访问...我想这样,用户名也应该在某些地方的PHP环境变量中可用...可能最好一旦你得到它就检查<?php phpinfo(); ?>

答案 5 :(得分:2)

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

答案 6 :(得分:2)

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

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

答案 7 :(得分:1)

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

http://us2.php.net/ldap

答案 8 :(得分:1)

您可以说getenv('USERNAME')

答案 9 :(得分:1)

答案 10 :(得分:0)

get_user_name与getenv('USERNAME');

的工作方式相同

我使用getenv('USERNAME')

编码(有西里尔语)问题

答案 11 :(得分:0)

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

答案 12 :(得分:0)

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

答案 13 :(得分:0)

使用此代码:

shell_exec("wmic computersystem get username")

答案 14 :(得分:-2)

试试这段代码:

class PhotoDetail(DetailView):

    def get_queryset(self):
        queryset = super(PhotoDetail, self).get_queryset()
        return queryset.filter(photoextended__user=self.request.user)

你在php中获得了你的windows(AD)用户名

答案 15 :(得分:-2)

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

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

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