Всем здравствовать да процветати Помогите, никак не могу 1. завести в AD юзера с userAccountControl = 0x10200 (NORMAL_ACCOUNT | DON`T_EXPIRE_PASSWD). Максимально близко получается только 0х10220 (PASSWD_NOTREQD|NORMAL_ACCOUNT|DON`T_EXPIRE_PASSWD). Код (PHP): $info['userAccountControl'] = "66080"; // =65536+512+32 (10200=10000+200+20) http://support.microsoft.com/default.aspx?scid=kb;en-us;305144 Если userAccountControl не передавать, то создается с 0х222 (отключено|пароль не ннада|нормальный запись) Может, кто в курсе, как оно должно работать? Может, сначала надо создать по дефолту, потом 2. грамотно задать пароль? Инфы полно, пробовал разное, но с флагом PASSWD_NOTREQD неактуально... К тому же, если юзера заводить с помощью консоли mmc, то в ADSI поле userPassword - <не задано> (по факту это не так), если же юзать ldap_add(), то в ADSI увидим именно то, что скормили... Варианты, которые пробовал: Код (PHP): //1 $replace = array('userpassword' => "{MD5}".base64_encode(pack("H*",md5($passw)))); //2 $replace = array('userpassword' => "{SHA}".base64_encode(pack("H*",sha1($passw)))); //3 $newPassword = "\"" . $passw . \""; $len = strlen($newPassword); $newPassw = ""; for ($i = 0; $i < $len; $i++){ $newPassw .= "{$newPassword{$i}}\000"; // тут я вообще не понял... что делает эта строка? } $replace = array('userpassword' => base64_encode($newPassw)); во всех случаях пароль не подходит... В общем, помогите, кто чем может
UPD: создал юзера с ldap_add() без параметра userAccountControl (юзер завелся со значением параметра 0х222), руками в mmc сменил пароль юзеру на требуемый, и только тогда получилось с ldap_mod_replace() задать userAccountControl=0x10200... В общем, вопрос теперь сводится к тому, как в php грамотно задать юзеру нужный пароль...
продолжу монолог... научился добавлять юзера в группу: Код (PHP): $group_info['member'] = $userdn; ldap_mod_add($dc, $group_name, $group_info); теперь не могу понять, как его оттуда удалить...
ну так в реалити-шоу участников поощряют хотя бы дружескими "Давай, бро! Мы за тебя!" ладно, нарисовал как сумел, не профессионал всё же... функция со всякими добавлениями/переименовываниями/удалениями/сменами_группы юзера: Код (PHP): <?php function ldp($basedn,$ident,$arg1 = '',$arg2 = '',$arg3 = ''){ global $base, $ou, $grp; $ldaphost = "dc01.domain.local"; $domain = "@domain.local"; if ($ident == "ldapsearch"){ $srv_login = "ldap".$domain; $srv_password = "ldap"; } else { $srv_login = "Админ".$domain; $srv_password = "mEg@pAs$w0rD"; } $dc = ldap_connect($ldaphost); ldap_set_option($dc, LDAP_OPT_PROTOCOL_VERSION, 3); ldap_set_option($dc, LDAP_OPT_REFERRALS, 0); if ($dc) { $resq = ldap_bind($dc,$srv_login,$srv_password); switch($ident){ case "ldapsearch": // поиск в каталоге по фильтру $attr = array("department","cn","title","telephonenumber","mobile","homePhone","pager","ipphone","mail","description","info"); $fltr1 = '(&(objectCategory=group)(cn='.$grp.'))'; $attr1 = array("description"); $result = ldap_search($dc,$arg2,$arg1,$attr); $res_grp = ldap_search($dc,$arg2,$fltr1,$attr1); ldap_sort($dc, $result, $arg3); $result_entries = ldap_get_entries($dc,$result); $resgrp = ldap_get_entries($dc,$res_grp); $errdc = ldap_error($dc); break; case "ldapadd": // добавление пользователя $radd = ldap_add($dc, $basedn, $arg1); $errdc = ldap_error($dc); break; case "ldaprename": // переименование пользователя ldap_rename($dc, $basedn, $arg1, $arg2, true); $errdc = ldap_error($dc); break; case "ldapaddgrp": if($arg1){ // добавление юзера в группу $group_name = "CN=".$arg1.",".$ou.",".$base; $group_info['member'] = $basedn; ldap_mod_add($dc, $group_name, $group_info); $errdc = ldap_error($dc); } break; case "ldapdelgrp": if($arg1){ // удаление юзера из группы $group_name = "CN=".$arg1.",".$ou.",".$base; $group_info['member'] = $basedn; ldap_mod_del($dc, $group_name, $group_info); $errdc = ldap_error($dc); } break; case "ldapdel": // удаление юзера ldap_delete($dc, $basedn); $errdc = ldap_error($dc); break; case "ldapmod": // изменение атрибутов юзера ldap_mod_replace($dc, $basedn, $arg1); $errdc = ldap_error($dc); break; } } @ldap_unbind($dc); } ?> смену пароля и useraccountcontrol на php запинать не удалось, пришлось умолять смилостивиться #!/bin/bash Код (Text): #!/bin/bash domain="@domain.local" base="DC=domain,DC=local" name=$1 pass=$2 basedn="CN=$name,OU=Пользователи,$base" echo "dn: $basedn" > pass.ldif echo "changetype: modify" >> pass.ldif echo "replace: unicodePwd" >> pass.ldif echo "unicodePwd:: $pass" >> pass.ldif ldapmodify -w mEg@pAs$w0rD -D Админ@domain.local -H ldaps://dc01.domain.local -f pass.ldif echo "dn: $basedn" > uac.ldif echo "changetype: modify" >> uac.ldif echo "replace: userAccountControl" >> uac.ldif echo "userAccountControl: 66048" >> uac.ldif ldapmodify -w mEg@pAs$w0rD -D Админ@domain.local -H ldaps://dc01.domain.local -f uac.ldif обращение к скрипту: Код (PHP): shell_exec('sudo ldap.sh "'.$basedn.'" "'.$usrpassw.'"'); Добавлено спустя 28 минут 23 секунды:почему тут подсветка синтаксиса не фурычит? или к тегу CODE пририсовать что-то надо?
В помощь жаждущим... Внимание! подключаемся к LDAP используя SSL. В любых других случаях AD уровня Windows Server 2008 R2 не даст сменить/установить пароль для пользователя. Код (PHP): <?php $ldap_host = "ldaps://dc01.srv.ru"; $base_dn = "DC=srv,DC=ru"; $ldap_user = "test@srv.ru"; $ldap_pass = "Qwerty123"; $connect = ldap_connect($ldap_host) or exit(">>Could not connect to LDAP server<<"); ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3); ldap_set_option($connect, LDAP_OPT_REFERRALS, 0); $bind = ldap_bind($connect, $ldap_user, $ldap_pass) or exit(">>Could not bind to $ldap_host<<"); $ldaprecord["objectclass"] = "user"; $ldaprecord['givenName'] = 'Иван'; $ldaprecord['sn'] = 'Иванов'; $ldaprecord['cn'] = $ldaprecord['givenName'].' '.$ldaprecord['sn']; $ldaprecord['displayName'] = $ldaprecord['cn']; $ldaprecord['description'] = 'System Administrator'; $ldaprecord['userPrincipalName'] = 'U1005@srv.ru'; $ldaprecord['samAccountName'] = 'U1005'; $ldaprecord['pwdLastSet'] = '-1'; $ldaprecord['userAccountControl'] = "66048"; $newpassword = "Qwerty1234"; $newpassword = "\"" . $newpassword . "\""; $len = strlen($newpassword); $newpass = ""; for ($i = 0; $i < $len; $i++) $newpass .= "{$newpassword{$i}}\000"; $ldaprecord["unicodePwd"] = $newpass; $r = ldap_add($connect, 'cn='.$ldaprecord['cn'].',OU=Users,DC=srv,DC=ru', $ldaprecord); ldap_close($connect); ?>