[英]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中也可以進行單點登錄。
-克雷格
我們的環境中有多個域,因此我將preg_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,以便用戶可以維護一組憑據
您可以說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>
如果您需要該模塊,則此鏈接很有用:
使用此代碼:
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.