|
|
|
|
Bonjour,
Après près de 8 Heures de recherches sur la toile, plus de 800 pages web consultées, je vous demande votre aide à nouveau.
Je travaille sur un Intranet avec serveur Apache. Je récapitulerai tout en fin de message.
Je cherche à obtenir le nom d'utilisateur de la session Windows connecté. En gros le nom d'utilisateur que l'on entre pour ouvrir la session windows.
Le but étant de récupérer ce nom d'utilisateur windows pour faire des recherches dans l'Active Directory ou la base de données sans proposer de formulaire de login.
J'ai testé beaucoup de solutions, mais rien ne satisfait toutes mes conditions.
La solution doit :
- Fonctionner sur Internet Explorer (à partir de la version 6 - la 8 je m'en fous un peu)
- Fonctionner sur Firefox.
- Ne pas demander à l'utilisateur de saisir des informations.
- Pas d'ASP
- Pas d'ActiveX, JScript ou VBscript qui ne fonctionne que sur IE.
- Fonctionne tout le temps. (Pas un poste sur 3 par exemple)
Je vous dis ce que j'ai déjà testé :
* Utiliser le protocole NTLM :
Souci : Sur Firefox demande de saisir des informations. Sur IE, NTLM tue le POST (Mon précédent TOPIC où j'ai galéré à trouver la cause d'ailleur)
* Utiliser les variables de serveur :
$_SERVER['REMOTE_USER']
$_SERVER['PHP_AUTH_USER']
$_SERVER['AUTH_USER']
$_SERVER['LOGON_USER']
Mais elles sont toutes vide.
Même avec ceci (voir ci-dessous) dans un .htaccess
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization},L]
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
</IfModule>
J'ai testé avec le module sspi_auth mais il en change rien. J'ai vérifié sur le phpinfo, il était bien "loadé" pourtant.
Également testé le mod ntlm mais il faut le compiler, j'ai rien compris et même pas sûr sur ça marchera.
* Utiliser ce bout de code :
$ip = getenv("REMOTE_ADDR");
$nbtstat = "nbtstat -a ".$ip;
$username = "";
exec ($nbtstat, $result);
foreach ($result as $row)
{
if (strpos($row, "<03>"))
{
$username = strtok($row, " ");
}
}
Souci : Très loin de fonctionner tout le temps.
Puis j'ai testé beaucoup d'autre chose mais qui me retournait le username du Serveur et nom de l'utilisateur.
Donc je vous demande si quelqu'un connait une solution.
Peut-être en executant une commande windows avec exec. Je ne sais pas trop.
Je pensais faire un echo %USERNAME% sur le poste du client, mais je ne sais pas si c'est possible.
Je dispose de :
Nom de la machine du client.
Son IP réseau.
Récapitulatif technique :
Serveur Apache : Windows NT APPACHE 5.0 build 2195
PHP : Version 5.2.3
OS des utilisateurs : Windows 2000 à XP
N'hésitez pas à demander plus d'informations si besoin et faire des propositions même farfelu tant qu'elle sont possible sans faille de sécurité énorme (mais dites toujours). J'ai vraiment besoin de ce username.
Je remercie déjà ceux qui ont eu le courage de tout lire et ceux qui proposeront des solutions.
Merci.
Configuration: Windows 2000 Firefox 3.0.10
Bonjour,
|
Kerberos est le choix à faire si l'on dispose d'un annuaire ex: Active Directory. Cela suppose la création de jeton.
|
Pour le dernier lien que tu as mis, c'est ce que j'ai utilisé, mais ça me bloquait mes POST. Toutes mes variables POST étaient vide. Cela a d'ailleur était le sujet d'une autre question que j'ai posé ici mais je ne savais pas que c'était ntlm qui me les bloquaient.
|
Impossible de faire fonctionner le module pour apache mod_auth_sspi. Apache refuse de redémarrer.
|
J'ai réussi à faire fonctionner le module mod_auth_sspi.
|
En faisant la modification dont vous parliez Panoramix sur FireFox, la récupération du username windows fonctionne bien. Mais comme ça ne marche pas sans la modif, (chose que les utilisateurs ne feront pas), je ne peux pas utiliser ce mod. Il aurai au moins fallu que sous IE (Navigateur majoritaire ici) l'authentification soit transparente.
|
Bonjour,
|
Bien la technique du user.js marche bien, sauf que j'ai un peu changé la manière de procéder.
|
Enfin, il reste un petit détail à corriger, ceux qui vont télécharger FireFox (avant le déploiement) n'auront pas cette pref avec la valeur par défaut que je souhaite. Il faut trouver un moyen pour que de nouveau utilisateurs de FF ne soit pas dérangé avec cette fenêtre d'authentification. Ils ont déjà fait un beau geste en passant d'IE à FF alors il ne faut pas les faire revenir sur leur décision.
|
Bonjour,
' Récupération du nom de la Machine sous TSE '
Dim WshShell
Dim ComputerName
Dim objNetwork
Set objNetwork = WScript.CreateObject("WScript.Network")
ComputerName = objNetwork.ComputerName
' Récupération du username '
Dim strUserName
strUserName = objNetwork.UserName
' Initialisation des paramètres pour la création et l'écriture dans le fichier'
Dim oFSO, oFile
Dim f
Dim strDirectory, strFile
strDirectory = "\\serveur\ou_chemin\repertoire\"
strFile = ComputerName & ".txt"
' Création du fichier et écriture du username '
Set oFSO = CreateObject("Scripting.FileSystemObject")
If oFSO.FolderExists(strDirectory) Then
Set oFile = oFSO.CreateTextFile(strDirectory & strFile, true)
oFile.write(UCase(strUserName))
End if
Je peux ensuite avec une fonction PHP récupérer le contenu du fichier. Pour cela j'utilise gethostbyaddr($_SERVER['REMOTE_ADDR']); qui me retourne nom_machine.nom_domaine.domaine Exemple : pc_1.mondomaine.com Voici cette fonction - il faudra l'adapter à votre situation si vous l'utilisez :
/**
* Retourne le Username de la session windows ouverte d'un utilisateur.
* @return NULL si le username n'a pas pu être récupéré.
* Ou le Username de la session windows ouverte d'un utilisateur.
*/
function getRemoteUser()
{
$host = gethostbyaddr($_SERVER['REMOTE_ADDR']);
$ComputerName = explode('.', $host);
// Chemin du fichier dans lequel il faut lire.
$path_file = 'http://domaine_serveur/repertoire_ou_sont_cree_les_fichier/'.$ComputerName[0].'.txt';
// Valeur par défaut si le username ne peut pas être lu.
$REMOTE_USER = NULL;
// Valeur par défaut de retour de la fonction fopen.
$rsc_file = FALSE;
// Si fopen ne fonctionne pas, $rsc_file contiendra la valeur par défaut. Sinon $rsc_file contiendra TRUE.
$rsc_file = @fopen($path_file, 'r');
//Si $rsc_file ne vaut pas FALSE on peut continuer.
if($rsc_file)
{
$REMOTE_USER = '';
//Tant que l'on est pas à la fin du fichier.
while(!feof($rsc_file))
{
//Récupère la ligne en cours et l'ajoute au contenu de la variable $REMOTE_USER
$REMOTE_USER .= fgets($rsc_file);
}
// Fermeture du fichier.
fclose($rsc_file);
}
// On retourne le résultat.
return $REMOTE_USER;
}
Et voilà. Avec cela j'arrive à me démerder. Et j'ai pas de NTLM qui me bousille mes POST. Je voudrais aussi revenir sur la pref de firefox. J'ai également un logon script pour le fichier user.js Au départ il contenait la ligne pour l'authentification automatique. Mais maintenant elle est inutile mais contient des lignes pour réactivé le protocole file. Pour ceux que ça interesse, voila le contenu de user.js :
// Politique de sécurité.
user_pref("capability.policy.policynames", "localfilelinks");
user_pref("capability.policy.localfilelinks.sites", "http://votreDomaine");
user_pref("capability.policy.localfilelinks.checkloaduri.enabled", "allAccess");
Et voici el logon script qui copie le fichier seulement si il n'existe pas :
Dim stRep 'Nom du répertoire à parcourir
Dim oFSO,oFld, oPrN
Set oFSO = CreateObject("Scripting.FileSystemObject")
dim WshShell
Set WshShell = CreateObject("WScript.Shell")
stRep = WshShell.ExpandEnvironmentStrings("%APPDATA%") & "\Mozilla\Firefox\Profiles"
If oFSO.FolderExists(stRep) Then
Set oFld = oFSO.GetFolder(stRep).SubFolders
For each oFld in oFSO.GetFolder(stRep).SubFolders
If oFSO.FileExists(stRep & "\" & oFld.Name & "\user.js") Then
Else
oFSO.CopyFile "\\appache\intranet\intranet\Ressources\user.js", stRep & "\" & oFld.Name & "\user.js", True
End If
Next
End If
Désolé pour tous ce blabla, mais je ne veux pas que d'autre galère comme moi. Bon voilà en espérant que j'en aiderai certain et si ce n'est pas fait, je vous invite à lire les réponses de Panoramix qui m'ont permise d'arriver là. ça aura été compliqué mais là ça marche. Moi je te remercie encore Panoramix, Ciao tous le monde. |