代码之家  ›  专栏  ›  技术社区  ›  fuentesjr

你能用PHP获得一个windows(ad)用户名吗?

  •  40
  • fuentesjr  · 技术社区  · 16 年前

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

    15 回复  |  直到 6 年前
        1
  •  41
  •   Sebas    10 年前

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

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

        2
  •  12
  •   Sebas    10 年前

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

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

    $user = $_SERVER['AUTH_USER'];
    

    $user 将返回如下值: DOMAIN\username 在我们的网络上,然后只需要删除 DOMAIN\ 从字符串开始。

    到目前为止,这已经在IE、FF、Chrome、Safari(测试)中得到了应用。

        3
  •  4
  •   warren    16 年前

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

    Active Directory[大部分]符合LDAP标准。

        4
  •  3
  •   Batuhan CrayFishUK    6 年前

    如果您在Windows上使用Apache,则可以从

    https://sourceforge.net/projects/mod-auth-sspi/

    说明在安装文件中,有一个whoami.php示例。(这只是将mod auth_sspi.so文件复制到一个文件夹中,并在httpd.conf中添加一行。)

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

    信息是基于会话的,所以即使在火狐中也可以单点登录…

    -克雷格

        5
  •  2
  •   hangy    16 年前

    你可能会 authenticate the user in Apache 具有 mod_auth_kerb 通过要求对某些文件进行身份验证访问,我认为这样,在PHP环境变量中,用户名也应该是可用的,也许最好检查一下 <?php phpinfo(); ?> 一旦你得到它运行。

        6
  •  1
  •   Peter Bailey    16 年前

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

    http://us2.php.net/ldap

        8
  •  1
  •   Eddy Goh    12 年前

    如果要检索远程用户idsid/username,请使用:

    echo gethostbyaddr($_SERVER['REMOTE_ADDR']);
    

    你会得到 iamuser1-mys.corp.company.com公司

    过滤后面的域的其余部分,您只能获取IDSID。

    有关详细信息,请访问 http://lostwithin.net/how-to-get-users-ip-and-computer-name-using-php/

        9
  •  1
  •   Mike    8 年前

    你可以说 getenv('USERNAME')

        10
  •  1
  •   GMR    7 年前

    我们的环境中有多个域,所以我使用preg_replace with regex只获取没有域\的用户名。

    preg_replace("/^.+\\\\/", "", $_SERVER["AUTH_USER"]);
    
        11
  •  0
  •   Kornilov Ruslan    12 年前

    get_user_name的工作方式与getenv(“用户名”)相同;

    我在使用getenv(“用户名”)时遇到编码(西里尔文)问题。

        12
  •  0
  •   George    9 年前

    引用还试图找出auth用户是否是特定域组的一部分;一个聪明的方法是创建一个带有文本文件的锁定文件夹(可以为空)。将security设置为仅具有要验证的security/disro组。一旦运行@file_get_contents(<---将发出警告)…如果用户没有组访问权限,他们将无法获取文件内容,因此将没有该特定的广告组访问权限。这很简单,而且效果很好。

        13
  •  0
  •   PodTech.io    7 年前

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

        14
  •  -2
  •   UserHelpNeeding02356    7 年前

    试试这个代码:

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

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

        15
  •  -2
  •   Purple Lady    7 年前

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

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

    这是我最终获得用户的Active Directory用户名的唯一方法。如果上述答案都无效,请尝试一下。