簡體   English   中英

您可以使用PHP獲得Windows(AD)用戶名嗎?

[英]Can you get a Windows (AD) username in PHP?

我在Intranet上有一個PHP Web應用程序,可以在該頁面上提取當前用戶的IP和主機名,但是我想知道是否還有一種方法來獲取/提取其Active Directory / Windows用戶名。 這可能嗎?

檢查AUTH_USER請求變量。 如果您的Web應用程序允許匿名訪問,則此字段為空,但是如果您的服務器使用的是基本身份驗證或Windows集成身份驗證,則它將包含已驗證用戶的用戶名。

在Active Directory域中,如果您的客戶端運行的是Internet Explorer,並且您的Web服務器/文件系統權限配置正確,則IE會以靜默方式將其域憑據提交到您的服務器,而AUTH_USER將為MYDOMAIN\\user.name而無需用戶明確登錄進入您的網絡應用。

我已經在IIS上運行php $_SERVER["AUTH_USER"] 如果在IIS中打開Windows身份驗證->身份驗證,然后關閉匿名身份驗證(重要),則可以使用$_SERVER["AUTH_USER"]

我用它來獲取用戶和域:

$user = $_SERVER['AUTH_USER'];

$user將在我們的網絡上返回一個類似DOMAIN\\username的值,然后只是從字符串中刪除DOMAIN\\的情況。

到目前為止,這已在IE,FF,Chrome,Safari(已測試)中運行。

查看PHP LDAP庫函數: http : //us.php.net/ldap

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

如果您在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中也可以進行單點登錄。

-克雷格

我們的環境中有多個域,因此我將pr​​eg_replace與regex結合使用,僅獲得不帶DOMAIN \\的用戶名。

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

如果您要檢索遠程用戶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/

您可能可以通過要求對某些文件的身份驗證訪問來使用mod_auth_kerb 在Apache中 用戶進行身份驗證……我想這樣,用戶名也應該在某處的PHP環境變量中可用……可能最好用<?php phpinfo(); ?>進行檢查<?php phpinfo(); ?> <?php phpinfo(); ?>一旦獲得運行。

檢出Apache https://github.com/rsim/mod_ntlm修補的NTLM身份驗證模塊

基於適用於Apache / Unix的NTLM身份驗證模塊http://modntlm.sourceforge.net/

http://blog.rayapps.com/上了解更多信息。

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

get_user_name與getenv('USERNAME')的工作方式相同;

我使用getenv('USERNAME')編碼(西里爾字母)問題

否。但是您可以做的是讓您的Active Directory管理員啟用LDAP,以便用戶可以維護一組憑據

http://us2.php.net/ldap

您可以說getenv('USERNAME')

引用嘗試還找出AUTH_USER是否屬於特定域組; 一個聰明的方法是用文本文件創建一個可鎖定的文件夾(可以為空白)。 將安全性設置為僅具有要驗證的安全性/發行版組。 一旦運行@file_get_contents(<---會發出警告)...如果用戶沒有組訪問權限,他們將無法獲取文件內容,因此將沒有該特定的AD組訪問權限。 這很簡單,效果很好。

這是一個簡單的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/

使用此代碼:

shell_exec("wmic computersystem get username")

試試這個代碼:

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

您在php中獲得Windows(AD)用戶名

我嘗試了幾乎所有這些建議,但是它們都返回了空值。 如果還有其他人遇到此問題,我在php.net( http://php.net/manual/en/function.get-current-user.php )上找到了這個方便的功能:

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

這是我最終能夠獲得用戶的活動目錄用戶名的唯一方法。 如果以上答案均無效,請嘗試一下。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM