За последние 24 часа нас посетили 20788 программистов и 1131 робот. Сейчас ищут 355 программистов ...

PHP: Ldap, сколько дней до истечения срока действия пароля.

Тема в разделе "PHP для новичков", создана пользователем Allanian, 24 мар 2016.

  1. Allanian

    Allanian Новичок

    С нами с:
    24 мар 2016
    Сообщения:
    2
    Симпатии:
    0
    Настраиваю WEB-интерфейс для запросов по ldap. Не понимаю как настроить Срок действия пароля. Получил максимальный срок жизни maxPwdAge и когда сменили пароль pwdlastset(в формате юникс-времени), подскажите как получить это?

    Код (PHP):
    1. <?php   
    2. Error_Reporting(E_ALL & ~E_NOTICE);
    3.         function getUserAccountControlAttributes($inputCode)
    4.         {
    5.             $userAccountControlFlags = array(
    6.             16777216 => "TRUSTED_TO_AUTH_FOR_DELEGATION",
    7.             8388608 => "PASSWORD_EXPIRED",
    8.             4194304 => "DONT_REQ_PREAUTH",
    9.             2097152 => "USE_DES_KEY_ONLY",
    10.             1048576 => "NOT_DELEGATED",
    11.             524288 => "TRUSTED_FOR_DELEGATION",
    12.             262144 => "SMARTCARD_REQUIRED",
    13.             262656    => "Enabled, Smartcard Required",
    14.             262658    => "Disabled, Smartcard Required",
    15.             131072 => "MNS_LOGON_ACCOUNT",
    16.             65536 => "DONT_EXPIRE_PASSWORD",
    17.             8192 => "SERVER_TRUST_ACCOUNT",
    18.             4096 => "WORKSTATION_TRUST_ACCOUNT",
    19.             2048 => "INTERDOMAIN_TRUST_ACCOUNT",
    20.             546    => "Disabled, Password Not Required",
    21.             544    => "Enabled, Password Not Required",
    22.             514 => "Disabled Account",
    23.             512 => "Enabled NORMAL_ACCOUNT",
    24.             256 => "TEMP_DUPLICATE_ACCOUNT",
    25.             128 => "ENCRYPTED_TEXT_PWD_ALLOWED",
    26.             64 => "PASSWD_CANT_CHANGE",
    27.             32 => "PASSWD_NOTREQD",
    28.             16 => "LOCKOUT",
    29.             8 => "HOMEDIR_REQUIRED",
    30.             2 => "ACCOUNTDISABLE",
    31.             1 => "SCRIPT");
    32.  
    33.             $attributes = NULL;
    34.             while($inputCode > 0) {
    35.                 foreach($userAccountControlFlags as $flag => $flagName) {
    36.                     $temp = $inputCode-$flag;
    37.                     if($temp>0) {
    38.                         $attributes[$userAccountControlFlags[$flag]] = $flag;
    39.                         $inputCode = $temp;
    40.                     }
    41.                     if($temp==0) {
    42.                         if(isset($userAccountControlFlags[$inputCode])) {
    43.                             $attributes[$userAccountControlFlags[$inputCode]] = $inputCode;
    44.                         }
    45.                         $inputCode = $temp;
    46.                     }
    47.                 }
    48.             }
    49.             return $attributes;
    50.         }
    51.  
    52.         //обработка времени        
    53.         function adConvert ($ad) {
    54.             $seconds_ad = $ad / (10000000);
    55.             //86400 -- seconds in 1 day
    56.             $unix = ((1970-1601) * 365 - 3 + round((1970-1601)/4) ) * 86400;
    57.             $timestamp = $seconds_ad - $unix; 
    58.             $normalDate = date("d-m-Y H:i:s", $timestamp);
    59.                 return $normalDate;
    60.         }    
    61.  
    62.         //Convert YMD LDAP timestamps
    63.         function convertLdapTimeStamp($timestamp){
    64.             //PHP script to convert a timestamp returned from an LDAP query into a Unix timestamp 
    65.             // The date as returned by LDAP in format yyyymmddhhmmsst
    66.             $date = $timestamp;
    67.  
    68.             // Get the individual date segments by splitting up the LDAP date
    69.             $year = substr($date,0,4);
    70.             $month = substr($date,4,2);
    71.             $day = substr($date,6,2);
    72.             $hour = substr($date,8,2);
    73.             $minute = substr($date,10,2);
    74.             $second = substr($date,12,2);
    75.  
    76.             // Make the Unix timestamp from the individual parts
    77.             $timestamp = mktime($hour, $minute, $second, $month, $day, $year);
    78.  
    79.             // Output the finished timestamp
    80.             return $day."/".$month."/".$year." ".$hour.":".$minute.":".$second;
    81.         }
    82.         
    83. switch ($_REQUEST['action']) {
    84.         //Поиск по имени пользователя
    85.         case 'sample3':
    86.         echo "Поиск пользователя фильтр, <b>".$_REQUEST['usernameLog']."</b>!<br>"; 
    87.             $ldap_host = "int.mechel.corp";    //адрес домена
    88.             $domain = "int.mechel.corp"; //базовое имя домена
    89.             $filter ='(&(objectCategory=person)(objectClass=user)(cn='.$_REQUEST["usernameLog"].'*))'; //ищет по фамилиям + имя +отчество (вводить все параметры не обязательно)
    90.             //$filter ='(&(objectCategory=person)(objectClass=user)(samaccountname='.$_REQUEST["usernameLog"].'*))'; //ищет по фамилиям + имя +отчество (вводить все параметры не обязательно)
    91.             
    92.             $ldap_user  = 'mechel\GilmullinRR'; //логин для подключения
    93.             $ldap_pass = "RR6767ok";            //пароль для подключения
    94.             $connect = ldap_connect($ldap_host, $ldap_port) or exit(">>Невозможно подключиться к LDAP серверу $ldap_host<<"); //подключение удачное/нет
    95.  
    96.             //Обработка Имени домена (переводит из обычного вида в доменный вид (DC))
    97.                 $dc = explode(".", $domain);
    98.                 $base_dn = "";
    99.                 foreach($dc as $_dc) $base_dn .= "dc=".$_dc.",";
    100.                 $base_dn = substr($base_dn, 0, -1); //убирает запятую последнюю "dc=int,dc=mechel,dc=corp,"
    101.             
    102.             //обработчики
    103.             ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3);
    104.             ldap_set_option($connect, LDAP_OPT_REFERRALS, 0);
    105.             ldap_get_option($connect,LDAP_OPT_ERROR_STRING,$error);
    106.             echo $error;
    107.  
    108.             $justthese = array("samaccountname","CN", "Department", "telephoneNumber", "Title","lockouttime","whenchanged","whencreated","lockout","nsaccountlock","badpasswordtime","company","pwdlastset","badpwdcount","accountexpires","objectsid","memberof","lastlogontimestamp","logoncount", "UserAccountControl");
    109.             $bind = ldap_bind($connect, $ldap_user, $ldap_pass) or exit(">>Невозможно подключиться к LDAP серверу $ldap_host<<"); //подключение удачное/нет
    110.  
    111.             $search = ldap_search($connect, $base_dn, $filter, $justthese) or exit(">>Unable to search ldap server<<"); ////чтение удачное/нет
    112.             $search1 = ldap_read($connect, $base_dn, 'objectclass=*');
    113.             $info = ldap_get_entries($connect, $search);
    114.             $infoLR = ldap_get_entries($connect, $search1);    
    115.             echo "Записей возвращено в количестве ".$info["count"]." шт.<p>";    
    116.             
    117.             for ($i=0; $i<$info["count"]; $i++) {
    118.                 
    119.                     echo '<table  border="1" >';
    120.                         echo '<tr><th scope="row" colspan="2" scope="col"><b><center>Дополнительная информация</center></b></th></tr>';
    121.                         echo '<tr><th scope="col">'.$info[$i]["samaccountname"][0].'</th><th scope="col">'.$info[$i]["cn"][0].'</th></tr>';
    122.                     echo "</table>";
    123.  
    124.                     echo "<br>";
    125.                     echo "<br>";
    126.                     echo "<br>";
    127.                     
    128.                     //Обработка времени переменные
    129.                     $lastlogontimestamp = $info[$i]['lastlogontimestamp'][0];
    130.                     $whencreated=$info[$i]["whencreated"][0];
    131.                     $whenchanged=$info[$i]["whenchanged"][0];    
    132.                     $pwdlastset =$info[$i]["pwdlastset"][0];
    133.                     $badpasswordtime=$info[$i]["badpasswordtime"][0];
    134.                     $lockouttime=$info[$i]["lockouttime"][0];
    135.                     
    136.                     $Time_lastlogontimestamp=adConvert($lastlogontimestamp);
    137.                     $Time_whencreated=convertLdapTimeStamp($whencreated);
    138.                     $Time_whenchanged=convertLdapTimeStamp($whenchanged);
    139.                     $Time_pwdlastset =adConvert($pwdlastset);
    140.                     $Time_badpasswordtime=adConvert($badpasswordtime);
    141.                     //$Time_lockouttime=adConvert($lockouttime);    
    142.                     
    143.                     //Обработка кодов  useraccountcontrol    
    144.                     $accountStatus = $info[$i]["useraccountcontrol"][0];
    145.                     if($accountStatus == 514)
    146.                         $accountStatus = "выключен";
    147.                     elseif($accountStatus == 512)
    148.                         $accountStatus =" включен ";
    149.                     else
    150.                         $accountStatus = "не изв.";
    151.                     
    152.                     $accstatus = $info[$i]["useraccountcontrol"][0];
    153.                     
    154.                     
    155.                     $lockout = $info[$i]["lockouttime"][0];
    156.                     if($lockout == 0)
    157.                         $lockout = "не заблокирован";
    158.                     elseif($lockout == 512)
    159.                         $lockout =" заблокирован ";
    160.                     else
    161.                         $lockout = "не изв.";
    162.                     
    163.                 //    $controlOption["useraccountcontrol"][0] = 512 + 2;
    164.                 //    $mod = ldap_modify($ds, $dn, $controlOption);
    165.     
    166.                     //To unlock:
    167.                 //    $acctEntry["lockouttime"][0] = '1';
    168.                 //    $mod = ldap_modify($ds, $dn, $acctEntry);
    169.  
    170.                     //To lock:
    171.                 //    $acctEntry["lockouttime"][0] = '0';
    172.                 //    $mod = ldap_modify($ds, $dn, $acctEntry);
    173.  
    174.                     //To enable:
    175.                 //    $acctEntry["useraccountcontrol"][0] = '512';
    176.                 //    $mod = ldap_modify($ds, $dn, $acctEntry);
    177.  
    178.                     //To disable:
    179.                 //    $acctEntry["useraccountcontrol"][0] = '514';
    180.                 //    $mod = ldap_modify($ds, $dn, $acctEntry);
    181.                 
    182. /*
    183.         //Вычисляет когда последний раз сменили пароль и сколько дней макс живет пароль в домене
    184.             echo "PWD LAST".$info["count"]." шт.<p>";    
    185.             echo $info[0]["cn"][0]."<p>";
    186.             echo $info[0]['pwdlastset'][0];
    187.             echo "<br>";
    188.         $info = ldap_get_entries($connect, $search1);
    189.             echo "MaxPWD".$info["count"]." шт.<p>";    
    190.             echo $info[0]['maxpwdage'][0];
    191.             $maxpwdage = $info[0]['maxPwdAge'][0];
    192.         echo "<br>";
    193.     */    
    194.  
    195.     
    196.         $howLong = int(($pwdLastSet[0]-$expNow )/10000000 )/86400;
    197.     echo $howLong;
    198.         
    199.                     echo '<table  border="1">';
    200.                         echo '<tr><th scope="row" colspan="2" scope="col"><b><center>Дополнительная информация</center></b></th></tr>';
    201.                         echo '<tr><td align="center" width="200px">Должность</td><td>'.$info[$i]["title"][0].'</td></tr>';
    202.                         echo '<tr><td align="center" width="200px">Телефон</td><td>'.$info[$i]["telephonenumber"][0].'</td></tr>';
    203.                         echo '<tr><td align="center" width="200px">Цех</td><td>'.$info[$i]["department"][0].'</td></tr>';
    204.                         echo '<tr><td align="center" width="200px">company</td><td>'.$info[$i]["company"][0].'</td></tr>';
    205.                         echo '<tr><td align="center" width="200px">Последний Логон</td><td>'.$Time_lastlogontimestamp.'</td></tr>';
    206.                         echo '<tr><td align="center" width="200px">Пароль сменен</td><td>'.$Time_pwdlastset.'</td></tr>';
    207.                         echo '<tr><td align="center" width="200px">Когда изменен</td><td>'.$Time_whenchanged.'</td></tr>';
    208.                         echo '<tr><td align="center" width="200px">Когда создан</td><td>'.$Time_whencreated.'</td></tr>';                                                                
    209.                         echo '<tr><td align="center" width="200px">Когда ввели пароль неверно</td><td>'.$Time_badpasswordtime.'</td></tr>';
    210.                         echo '<tr><td align="center" width="200px">Количество неправильно введенных паролей</td><td>'.$info[$i]["badpwdcount"][0].'</td></tr>';
    211.                         echo '<tr><td align="center" width="200px">Путь в АД</td><td>'.$info[$i]["dn"].'</td></tr>';
    212.                         echo '<tr><td align="center" width="200px">Статус Аккаунта</td><td>'.$accountStatus."(код ".$accstatus.")".'</td></tr>';                                                                
    213.                         echo '<tr><td align="center" width="200px">lockouttime</td><td>'.$lockout.'</td></tr>';
    214.                         echo '<tr><td align="center" width="200px">memberof</td><td>'.$info[0]["memberof"][0].'</td></tr>';        
    215.                         echo '<tr><td align="center" width="200px">Пароль истекает</td><td>'.$passwordIstekaet.'</td></tr>';        
    216.                         echo '<tr><td align="center" width="200px">maxpwdage</td><td>'.$infoLR[0]['maxpwdage'][0].'</td></tr>';
    217.                         echo '<tr><td align="center" width="200px">pwdlastset</td><td>'.$info[0]['pwdlastset'][0].'</td></tr>';                    
    218.                         echo "</table>";
    219.                         echo "<br>";
    220.             }
    221.             
    222.         if ($i == 0) {
    223.             echo "Не найдено совпадений";
    224.             }
    225.         echo "Конец запроса";
    226.     ldap_close($connect);
    227.     break;
    228. }
    229. ?>
    Подсказка от модератора:
    Любой код или текст конфигурации пишите между тегом [code=php] и [/code].
    Используйте отступы в коде для форматирования текста.
    Это помогает быстрее понять вас, увеличивает шанс на получение ответа.
    Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.