Page 1 sur 1

acceder un domaine windows 2003

Posté : 30 janv. 2012, 13:38
par salento9
Bonjour,

j'essaye avec le code suivant de faire un accès vers un A.D. Windows et je reçois l'erreur "access is denied" le module ldap foncionne,
je ne comprend pas :roll: pouvez-vous m'aider a vérifier ce script?

Code : Tout sélectionner

session_start(); $creatorparts = explode('\\',$_SERVER["REMOTE_USER"]); $creator = $creatorparts[1]; if($_SESSION['memberof']){ $memberof = $_SESSION['memberof']; }else{ $memberof = get_memberships($creator); $_SESSION['memberof'] = $memberof; } $page = basename($_SERVER["PHP_SELF"]); $page = substr($page,0,strpos(basename($_SERVER["PHP_SELF"]),'.')); if(strpos(basename($_SERVER["PHP_SELF"]),'-')){ $page = substr($page,0,strpos(basename($_SERVER["PHP_SELF"]),'-')); } $bimAuth = false; $cpoAuth = false; $pageAllowed = false; if($memberof){ foreach($memberof as $group){ //echo $group.'*<br>'; if($group == $bimSecurityGroup){ $bimAuth = true; if(array_search($page,$bimSecurity,1)){ $pageAllowed = true; } } if($group == $cpoSecurityGroup){ $cpoAuth = true; if(array_search($page,$cpoSecurity,1)){ $pageAllowed = true; } } } } ?>
Merci d'avance.

Salento

Re: acceder un domaine windows 2003

Posté : 30 janv. 2012, 14:59
par xTG
Tu n'as aucun accès LDAP dans ce code, donc l'erreur vient de plus haut.
La fonction get_memberships() par exemple ?

Re: acceder un domaine windows 2003

Posté : 30 janv. 2012, 15:46
par salento9
Merci pour la réponse,
ça doit être ici:

Code : Tout sélectionner

<?php include('adodb-time.inc.php'); function dirNameToUserName($dirname){ $start = strpos($dirname,'=')+1; $end = strpos($dirname,','); return(substr($dirname,$start,$end-$start)); } function sfile($file){ $tmp = file($file); foreach($tmp as $line){ $ttmp = explode(';',$line); $result[$ttmp[0]] = $ttmp[1]; } return $result; } function showoptions($options,$selectedoption){ natcasesort($options); foreach($options as $optionname => $anoption){ if(trim($anoption)){ if(strtolower(trim($optionname))==strtolower($selectedoption)){ $selected = ' selected'; $seloptexists = 1; }else{ $selected = ''; } $result .= '<option'.$selected.' value="'.$optionname.'">'.trim($anoption)."\n"; } } if($selectedoption == ''){ $result = '<option selected value="">'.$result; } if(($selectedoption)and($seloptexists == '')){ $result = '<option selected value="">[unknown] '.$selectedoption.$result."\n"; } return($result); } function createrandompassword(){ $chars = "abcdefghijkmnpqrstuvwxyz23456789"; srand((double)microtime()*1000000); $i = 0; $pass = '' ; while ($i <= 8) { $num = rand() % 33; $tmp = substr($chars, $num, 1); $pass = $pass . $tmp; $i++; } return $pass; } function createreasypassword(){ $chars = "AEIUY"; $chars1 = "BCDFGHJKMNPQRSTVWXZ"; srand((double)microtime()*1000000); $pass = substr($chars1,(rand() % 33),1).substr($chars,(rand() % 33),1).substr($chars1,(rand() % 33),1).substr($chars,(rand() % 33),1); return $pass; } function get_ldap_users(){ $cachefile = 'cache/users.txt'; // GET LDAP DATA CONFIG $user_dn = $GLOBALS['ldapUserDn']; $ldappass = $GLOBALS['ldapUserPwd']; $base_dn = $GLOBALS['domain']; $server = $GLOBALS['ldapserver']; $ou = $GLOBALS['userou'].','.$GLOBALS['domain']; $cache_timeout = 15; // In seconds // CHECK AGE and EXISTENCE OF CACHE $filename = $cachefile; if (file_exists($filename)) { if(($cache_timeout) > (time() - filemtime($filename))){ $cached = 1; }else{ $cached = 0; } }else{ $cached = 0; } // GET DATA if($cached){ // READ CACHE FILE TO ARRAY $users = sfile($cachefile); }else{ // READ ALL INFO DIRECTLY FROM LDAP/AD $ds=ldap_connect($server); if ($ds) { // binding to ldap server $r = ldap_bind($ds, $user_dn, $ldappass); // verify binding if (!$r) { echo "LDAP bind failed..."."\n"; } // Search surname entry $sr=ldap_search($ds, $ou, "sn=*"); // Get entries $info = ldap_get_entries($ds, $sr); // Get all entries for ($i=0; $i<$info["count"]; $i++) { $users[$info[$i]['cn'][0]] = $info[$i]['sn'][0].', '.$info[$i]['givenname'][0]; } ldap_close($ds); } else { echo "<h4>Unable to connect to LDAP server</h4>"."\n"; } // WRITE CACHE FILE FROM ARRAYS $cfile = fopen($cachefile,"w"); foreach($users as $n => $dn){ fwrite($cfile, $n.';'.$dn."\n"); } fclose($cfile); } return($users); } function get_ldap_users_details(){ // GET LDAP DATA CONFIG $user_dn = $GLOBALS['ldapUserDn']; $ldappass = $GLOBALS['ldapUserPwd']; $base_dn = $GLOBALS['domain']; $server = $GLOBALS['ldapserver']; $ou = $GLOBALS['userou'].','.$GLOBALS['domain']; // READ ALL INFO DIRECTLY FROM LDAP/AD $ds=ldap_connect($server); if ($ds) { // binding to ldap server $r = ldap_bind($ds, $user_dn, $ldappass); // verify binding if (!$r) { echo "LDAP bind failed..."."\n"; } // Search surname entry $sr=ldap_search($ds, $ou, "sn=*"); // Get entries $info = ldap_get_entries($ds, $sr); ldap_close($ds); } else { echo "<h4>Unable to connect to LDAP server</h4>"."\n"; } return($info); } function get_ldap_groups($ou){ $cachefile = 'cache/groups.txt'; // GET LDAP DATA CONFIG $user_dn = $GLOBALS['ldapUserDn']; $ldappass = $GLOBALS['ldapUserPwd']; $base_dn = $GLOBALS['domain']; $server = $GLOBALS['ldapserver']; $ou = $ou.','.$GLOBALS['domain']; $cache_timeout = 15; // In seconds // CHECK AGE and EXISTENCE OF CACHE $filename = $cachefile; if (file_exists($filename)) { if(($cache_timeout) > (time() - filemtime($filename))){ $cached = 1; }else{ $cached = 0; } }else{ $cached = 0; } // GET DATA if($cached){ // READ CACHE FILE TO ARRAY $groups = sfile($cachefile); }else{ // READ ALL INFO DIRECTLY FROM LDAP/AD $ds=ldap_connect($server); if ($ds) { // binding to ldap server $r = ldap_bind($ds, $user_dn, $ldappass); // verify binding if (!$r) { echo "LDAP bind failed..."."\n"; } // Search groupname entry $sr=ldap_search($ds, $ou, "cn=*"); // Get entries $info = ldap_get_entries($ds, $sr); // Get all entries for ($i=0; $i<$info["count"]; $i++) { $groups[$info[$i]['cn'][0]] = $info[$i]['cn'][0]; } ldap_close($ds); } else { echo "<h4>Unable to connect to LDAP server</h4>"."\n"; } // WRITE CACHE FILE FROM ARRAYS $cfile = fopen($cachefile,"w"); foreach($groups as $n => $dn){ fwrite($cfile, $n.';'.$dn."\n"); } fclose($cfile); } return($groups); } function get_ldap_user_details($userCn){ // GET LDAP DATA CONFIG $user_dn = $GLOBALS['ldapUserDn']; $ldappass = $GLOBALS['ldapUserPwd']; $base_dn = $GLOBALS['domain']; $server = $GLOBALS['ldapserver']; $ou = $GLOBALS['userou'].','.$GLOBALS['domain']; // READ ALL INFO DIRECTLY FROM LDAP/AD $ds=ldap_connect($server); if ($ds) { // binding to ldap server $r = ldap_bind($ds, $user_dn, $ldappass); // verify binding if (!$r) { echo "LDAP bind failed..."."\n"; } // Search surname entry $sr=ldap_search($ds, $ou, "cn=".$userCn); // Get entries $info = ldap_get_entries($ds, $sr); // Get all details in simple array foreach($info[0] as $detailname => $detail){ for ($i=0; $i<$detail["count"]; $i++) { $userdetails[$detailname][$i] = $detail[$i]; } } ldap_close($ds); } else { echo "<h4>Unable to connect to LDAP server</h4>"."\n"; } return($userdetails); } function ldap_user_exists($userCn){ // GET LDAP DATA CONFIG $user_dn = $GLOBALS['ldapUserDn']; $ldappass = $GLOBALS['ldapUserPwd']; $base_dn = $GLOBALS['domain']; $server = $GLOBALS['ldapserver']; $ou = $GLOBALS['userou'].','.$GLOBALS['domain']; // READ ALL INFO DIRECTLY FROM LDAP/AD $ds=ldap_connect($server); if ($ds) { // binding to ldap server $r = ldap_bind($ds, $user_dn, $ldappass); // verify binding if (!$r) { echo "LDAP bind failed..."."\n"; } // Search surname entry $sr=ldap_search($ds, $ou, "cn=".$userCn); // Get entries $info = ldap_get_entries($ds, $sr); // Get all details in simple array foreach($info as $user){ $result .= $user; } ldap_close($ds); } else { echo "<h4>Unable to connect to LDAP server</h4>"."\n"; } return($result); } function get_memberships($user){ $userdetails = @get_ldap_user_details($user); foreach($userdetails['memberof'] as $group){ //echo '<b>=='.$group.'==</b><br>'; $gr = substr($group,0,strpos($group,',')); $grou = substr($group,strpos($group,',')+1); $subgroups = array_merge((array)get_groups_memberships($gr,$grou),(array)$subgroups); } $result = @array_merge($userdetails['memberof'],$subgroups); return $result; } function get_groups_memberships($gr,$grou){ $groupdetails = get_ldap_group_details($gr,$grou); if(is_array($groupdetails['memberof'])){ foreach($groupdetails['memberof'] as $subgroup){ $subgroups[] = $subgroup; $sgr = substr($subgroup,0,strpos($subgroup,',')); $sgrou = substr($subgroup,strpos($subgroup,',')+1); $subsubgroups = array_merge((array)get_groups_memberships($sgr,$sgrou),(array)$subsubgroups); } $result = array_merge($subgroups,$subsubgroups); return $result; } } function get_ldap_group_details($group,$ou){ //echo '<font color="red"><b>'.$group.'#'.$ou.'</b></font><br>'; // GET LDAP DATA CONFIG $user_dn = $GLOBALS['ldapUserDn']; $ldappass = $GLOBALS['ldapUserPwd']; $base_dn = $GLOBALS['domain']; $server = $GLOBALS['ldapserver']; // READ ALL INFO DIRECTLY FROM LDAP/AD $ds=ldap_connect($server); if ($ds) { // binding to ldap server $r = ldap_bind($ds, $user_dn, $ldappass); // verify binding if (!$r) { echo "LDAP bind failed..."."\n"; } // Search surname entry if($sr=@ldap_search($ds, $ou, $group)){ // Get entries $info = ldap_get_entries($ds, $sr); // Get all details in simple array foreach($info[0] as $detailname => $detail){ for ($i=0; $i<$detail["count"]; $i++) { $groupdetails[$detailname][$i] = $detail[$i]; } } } ldap_close($ds); } else { echo "<h4>Unable to connect to LDAP server</h4>"."\n"; } return($groupdetails); }

Re: acceder un domaine windows 2003

Posté : 30 janv. 2012, 17:19
par xTG
Commences par supprimer les @ qui trainent dans ton code et tu auras surement un message d'erreur plus compréhensible qui pourra nous guider.
Cacher les erreurs est une très mauvaise manie et pose toujours un tas de problème en cas de debug.

Re: acceder un domaine windows 2003

Posté : 01 févr. 2012, 16:31
par salento9
Désolé pour le retard,

j'ai beaucoup d'erreurs maintenant:

1) erreur, undefinet offset dans,

Code : Tout sélectionner

$creatorparts = explode('\\',$_SERVER["REMOTE_USER"]); $creator = $creatorparts[1];
:roll:

Re: acceder un domaine windows 2003

Posté : 01 févr. 2012, 17:01
par salento9
ok j'ai trouvé c'est comme ça:

Code : Tout sélectionner

$creatorparts = explode('\\',$_SERVER["REMOTE_USER"]); $creator = (isset($creatorparts[1]));
Par contre pouvez-vous m'aider pour ce code ci:

Code : Tout sélectionner

foreach(isset($info[0] as $detailname => $detail)){
Merci d'avance.

Re: acceder un domaine windows 2003

Posté : 01 févr. 2012, 17:38
par xTG
Euh non là tu casses tout. ^^

La fonction isset() renvoie un booléen selon que la variable existe ou non.
Donc :
$creator = (isset($creatorparts[1])) ? $creatorparts[1] : 'valeur par défaut ici';
Mais à priori ton script enchaîne les variables manquantes (cf ta boucle foreach).
$info[0] semble ne pas exister (tout du moins si c'est aussi un undefined offset).
Donc il est impossible de faire le traitement de la boucle.

C'est comme mettre dans un panier des pommes puis prendre les pommes une à une dans le panier pour les éplucher.
Mais s'il n'y a pas de pommes dans le panier... Bah pas d'épluchage possible. ;)

Re: acceder un domaine windows 2003

Posté : 02 févr. 2012, 14:11
par salento9
Je ne comprend plus rien, trop compliqué pour moi :shock:

pour l'instant j'ai le message d'erreur suivant:

Parse error: syntax error, unexpected T_AS, expecting, dans cette ligne de code:

Code : Tout sélectionner

foreach(isset($info[0] as $detailname => $detail))
si je comprend bien il ne reconnais pas AS ?

Merci de votre patience.

pour l'instant j'ai un site qui fonctionne avec IIS6, et php 5.1.6, aspnet 2
mon plus grand soucis est que mon site fait fréquemment de requêtes LDAP et souvent il se bloque comme si il n'avait pas beaucoup de temps pour faire ça requête et au même temps si qlq d'autre fait aussi une autre requête ldap il se plante définitivement.
j'ai donc pensé d’essayé par ex. Xampp avec php 5.3.9 et apache2.xxx et je me retrouve face a ces problèmes de langages php sur mon site qui me semble un peut vieux.

Re: acceder un domaine windows 2003

Posté : 02 févr. 2012, 14:19
par moogli
parce que tu n'a pas fermé la parenthèse du isset qui d'ailleurs ne devrais pas être la !!!

je sais bien qu'il y a une ) à la fin mais isset test une variable pas tout le script !

d'ailleurs la doc http://www.php.net/isset indique clairement
Avertissement

isset() fonctionne uniquement avec des variables car l'utilisation de toute autre chose aura comme conséquence une erreur d'analyse. Pour vérifier si une constants est définie, utilisez la fonction defined().
utilise un IDE pour coder ça t'évitera ce type problème (zend studio, netbeans, eclipse et surement d'autre que je ne connais pas !).

donc au final
<?php
if (isset($info[0]))
foreach( $info[0] as $detailname => $detail)
?>

@+