За последние 24 часа нас посетили 17869 программистов и 1610 роботов. Сейчас ищут 896 программистов ...

ldap_add и подобное

Тема в разделе "Прочие вопросы по PHP", создана пользователем Mortgoroth, 14 янв 2014.

  1. Mortgoroth

    Mortgoroth Новичок

    С нами с:
    14 янв 2014
    Сообщения:
    23
    Симпатии:
    0
    Всем здравствовать да процветати :)
    Помогите, никак не могу
    1. завести в AD юзера с userAccountControl = 0x10200 (NORMAL_ACCOUNT | DON`T_EXPIRE_PASSWD). Максимально близко получается только 0х10220 (PASSWD_NOTREQD|NORMAL_ACCOUNT|DON`T_EXPIRE_PASSWD).
    Код (PHP):
    1. $info['userAccountControl'] = "66080"; // =65536+512+32 (10200=10000+200+20) http://support.microsoft.com/default.aspx?scid=kb;en-us;305144
    2.  
    Если userAccountControl не передавать, то создается с 0х222 (отключено|пароль не ннада|нормальный запись)
    Может, кто в курсе, как оно должно работать? Может, сначала надо создать по дефолту, потом
    2. грамотно задать пароль? Инфы полно, пробовал разное, но с флагом PASSWD_NOTREQD неактуально... К тому же, если юзера заводить с помощью консоли mmc, то в ADSI поле userPassword - <не задано> (по факту это не так), если же юзать ldap_add(), то в ADSI увидим именно то, что скормили...
    Варианты, которые пробовал:
    Код (PHP):
    1. //1
    2. $replace = array('userpassword' => "{MD5}".base64_encode(pack("H*",md5($passw))));
    3. //2
    4. $replace = array('userpassword' => "{SHA}".base64_encode(pack("H*",sha1($passw))));
    5. //3
    6.     $newPassword = "\"" . $passw . \"";
    7.     $len = strlen($newPassword);
    8.     $newPassw = "";
    9.     for ($i = 0; $i < $len; $i++){
    10.             $newPassw .= "{$newPassword{$i}}\000";  // тут я вообще не понял... что делает эта строка?
    11.     }
    12. $replace = array('userpassword' => base64_encode($newPassw));
    13.  
    во всех случаях пароль не подходит...

    В общем, помогите, кто чем может :)
     
  2. Mortgoroth

    Mortgoroth Новичок

    С нами с:
    14 янв 2014
    Сообщения:
    23
    Симпатии:
    0
    UPD: создал юзера с ldap_add() без параметра userAccountControl (юзер завелся со значением параметра 0х222), руками в mmc сменил пароль юзеру на требуемый, и только тогда получилось с ldap_mod_replace() задать userAccountControl=0x10200...
    В общем, вопрос теперь сводится к тому, как в php грамотно задать юзеру нужный пароль...
     
  3. Mortgoroth

    Mortgoroth Новичок

    С нами с:
    14 янв 2014
    Сообщения:
    23
    Симпатии:
    0
    UPD: пароль и useraccountcontrol получилось запилить посредством ldapmodify c ldif-файлом...
     
  4. Mortgoroth

    Mortgoroth Новичок

    С нами с:
    14 янв 2014
    Сообщения:
    23
    Симпатии:
    0
    продолжу монолог...
    научился добавлять юзера в группу:
    Код (PHP):
    1. $group_info['member'] = $userdn;
    2. ldap_mod_add($dc, $group_name, $group_info); 
    теперь не могу понять, как его оттуда удалить...
     
  5. Mortgoroth

    Mortgoroth Новичок

    С нами с:
    14 янв 2014
    Сообщения:
    23
    Симпатии:
    0
    победил. Но, поскольку общался сам с собой, то только себе и расскажу :)
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Эй! Мы столько серий смотрели, чтобы так и не узнать, в чем фишка? =(
     
  7. Mortgoroth

    Mortgoroth Новичок

    С нами с:
    14 янв 2014
    Сообщения:
    23
    Симпатии:
    0
    ну так в реалити-шоу участников поощряют хотя бы дружескими "Давай, бро! Мы за тебя!" :)
    ладно, нарисовал как сумел, не профессионал всё же...
    функция со всякими добавлениями/переименовываниями/удалениями/сменами_группы юзера:
    Код (PHP):
    1. <?php
    2. function ldp($basedn,$ident,$arg1 = '',$arg2 = '',$arg3 = ''){
    3.     global $base, $ou, $grp;
    4.  
    5.     $ldaphost = "dc01.domain.local";
    6.     $domain = "@domain.local";
    7.  
    8.     if ($ident == "ldapsearch"){
    9.         $srv_login = "ldap".$domain;
    10.         $srv_password = "ldap";
    11.     } else {
    12.         $srv_login = "Админ".$domain;
    13.         $srv_password = "mEg@pAs$w0rD";
    14.     }
    15.  
    16.     $dc = ldap_connect($ldaphost);
    17.     ldap_set_option($dc, LDAP_OPT_PROTOCOL_VERSION, 3);
    18.     ldap_set_option($dc, LDAP_OPT_REFERRALS, 0);
    19.     if ($dc) {
    20.         $resq = ldap_bind($dc,$srv_login,$srv_password);
    21.  
    22.         switch($ident){
    23.             case "ldapsearch":    // поиск в каталоге по фильтру
    24.                 $attr = array("department","cn","title","telephonenumber","mobile","homePhone","pager","ipphone","mail","description","info");
    25.                 $fltr1 = '(&(objectCategory=group)(cn='.$grp.'))';
    26.                 $attr1 = array("description");
    27.                 $result = ldap_search($dc,$arg2,$arg1,$attr);
    28.                 $res_grp = ldap_search($dc,$arg2,$fltr1,$attr1);
    29.                 ldap_sort($dc, $result, $arg3);
    30.                 $result_entries = ldap_get_entries($dc,$result);
    31.                 $resgrp = ldap_get_entries($dc,$res_grp);
    32.                 $errdc = ldap_error($dc);
    33.             break;
    34.             case "ldapadd":        // добавление пользователя
    35.                 $radd = ldap_add($dc, $basedn, $arg1); 
    36.                 $errdc = ldap_error($dc);
    37.             break;
    38.             case "ldaprename":    // переименование пользователя
    39.                 ldap_rename($dc, $basedn, $arg1, $arg2, true);
    40.                 $errdc = ldap_error($dc);
    41.             break;
    42.             case "ldapaddgrp":
    43.                 if($arg1){    // добавление юзера в группу
    44.                     $group_name = "CN=".$arg1.",".$ou.",".$base;
    45.                     $group_info['member'] = $basedn;
    46.                     ldap_mod_add($dc, $group_name, $group_info);
    47.                     $errdc = ldap_error($dc);
    48.                 }
    49.             break;
    50.             case "ldapdelgrp":
    51.                 if($arg1){    // удаление юзера из группы
    52.                     $group_name = "CN=".$arg1.",".$ou.",".$base;
    53.                     $group_info['member'] = $basedn;
    54.                     ldap_mod_del($dc, $group_name, $group_info);
    55.                     $errdc = ldap_error($dc);
    56.                 }
    57.             break;
    58.             case "ldapdel":        // удаление юзера
    59.                 ldap_delete($dc, $basedn);
    60.                 $errdc = ldap_error($dc);
    61.             break;
    62.             case "ldapmod":        // изменение атрибутов юзера
    63.                 ldap_mod_replace($dc, $basedn, $arg1);
    64.                 $errdc = ldap_error($dc);
    65.             break;
    66.         }
    67.     }
    68.     @ldap_unbind($dc);
    69. }
    70. ?>
    смену пароля и useraccountcontrol на php запинать не удалось, пришлось умолять смилостивиться #!/bin/bash :)
    Код (Text):
    1.  
    2. #!/bin/bash
    3. domain="@domain.local"
    4. base="DC=domain,DC=local"
    5. name=$1
    6. pass=$2
    7. basedn="CN=$name,OU=Пользователи,$base"
    8. echo "dn: $basedn" > pass.ldif
    9. echo "changetype: modify" >> pass.ldif
    10. echo "replace: unicodePwd" >> pass.ldif
    11. echo "unicodePwd:: $pass" >> pass.ldif
    12.  
    13. ldapmodify -w mEg@pAs$w0rD -D Админ@domain.local  -H ldaps://dc01.domain.local -f pass.ldif
    14.  
    15. echo "dn: $basedn" > uac.ldif
    16. echo "changetype: modify" >> uac.ldif
    17. echo "replace: userAccountControl" >> uac.ldif
    18. echo "userAccountControl: 66048" >> uac.ldif
    19.  
    20. ldapmodify -w mEg@pAs$w0rD -D Админ@domain.local  -H ldaps://dc01.domain.local -f uac.ldif
    обращение к скрипту:
    Код (PHP):
    1. shell_exec('sudo ldap.sh "'.$basedn.'" "'.$usrpassw.'"');
    Добавлено спустя 28 минут 23 секунды:почему тут подсветка синтаксиса не фурычит? или к тегу CODE пририсовать что-то надо?
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  9. asmoday74

    asmoday74 Новичок

    С нами с:
    17 мар 2014
    Сообщения:
    2
    Симпатии:
    0
    В помощь жаждущим...
    Внимание! подключаемся к LDAP используя SSL. В любых других случаях AD уровня Windows Server 2008 R2 не даст сменить/установить пароль для пользователя.
    Код (PHP):
    1. <?php
    2. $ldap_host = "ldaps://dc01.srv.ru";
    3. $base_dn = "DC=srv,DC=ru";
    4. $ldap_user  = "test@srv.ru";
    5. $ldap_pass = "Qwerty123";
    6. $connect = ldap_connect($ldap_host)
    7.     or exit(">>Could not connect to LDAP server<<");
    8. ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3);
    9. ldap_set_option($connect, LDAP_OPT_REFERRALS, 0);
    10. $bind = ldap_bind($connect, $ldap_user, $ldap_pass)
    11.     or exit(">>Could not bind to $ldap_host<<");
    12. $ldaprecord["objectclass"] = "user";
    13. $ldaprecord['givenName'] = 'Иван';
    14. $ldaprecord['sn'] = 'Иванов';
    15. $ldaprecord['cn'] = $ldaprecord['givenName'].' '.$ldaprecord['sn'];
    16. $ldaprecord['displayName'] = $ldaprecord['cn'];
    17. $ldaprecord['description'] = 'System Administrator'; 
    18. $ldaprecord['userPrincipalName'] = 'U1005@srv.ru'; 
    19. $ldaprecord['samAccountName'] = 'U1005'; 
    20. $ldaprecord['pwdLastSet'] = '-1';
    21. $ldaprecord['userAccountControl'] = "66048";
    22. $newpassword = "Qwerty1234";
    23. $newpassword = "\"" . $newpassword . "\"";
    24. $len = strlen($newpassword);
    25. $newpass = "";
    26. for ($i = 0; $i < $len; $i++) 
    27.     $newpass .= "{$newpassword{$i}}\000";
    28. $ldaprecord["unicodePwd"] = $newpass;
    29. $r = ldap_add($connect, 'cn='.$ldaprecord['cn'].',OU=Users,DC=srv,DC=ru', $ldaprecord);      
    30. ldap_close($connect);
    31. ?>