LDAP Поиск членов группы PHP
У меня есть вопрос относительно членства пользователей в группах в Active Directory и получения таких членств с помощью PHP. Мой большой вопрос / ситуация заключается в том, что у меня есть сайт, который я создаю, и, по сути, я пытаюсь назначить администраторов на основе групп в Active Directory, и я знаю, как проверить статус участника в учетной записи, но моя проблема заключается в том, что есть некоторые группы которые там не отображаются, и одна из групп, которая не отображается, - это нужная мне группа. Есть ли способ, которым я могу проверить, кто является членом этой группы, вместо того, чтобы проверить, является ли этот пользователь членом этой группы. В качестве альтернативы, если кто-то знает, почему определенные группы не появляются в моем поиске, я бы предпочел искать членство таким образом, потому что тогда было бы простым логическим утверждением проверить, находится ли пользователь в этой группе, мой код находится ниже, и он работает, но как Я сказал, что есть определенные группы, которые не появляются, и я думаю, что где-то читал о том, как хранится членство, а также, если это прямое членство или если вы являетесь членом группы, которая является членом другой группы. Одна группа, которую мы используем в качестве группы по умолчанию, - это пользователи домена, но в массиве memberOf этого нет ни у кого, хотя членство в этой группе является прямым, так как в этой группе все пользователи, а не другие группы безопасности, содержащие пользователей.
В какой-то момент в этой программе мне нужно пометить определенных пользователей как "менеджеров", и для меня проще всего было бы сохранить флаговую переменную сеанса VIA, если они являются членами определенной группы менеджеров, как указано выше, проблема Я сталкиваюсь с тем, что пользователи не появляются в некоторых из своих групп, так что это не работает, группа, которая предоставила бы доступ менеджерам, не появляется в моей области MemberOf. На последнем этапе мне придется пройти через 5-6 групп и добавить всех участников в базу данных, это аналогичная проблема и должно быть аналогичное решение, так что, возможно, я смогу убить двух зайцев одним выстрелом, если выясню это одно тоже. Под этой проблемой я подразумеваю то, что мне нужно будет захватить группу, например что-то вроде 'user HR', и затем загрузить их все в базу данных по имени и фамилии и некоторым значениям по умолчанию для других полей, но я не знаю, как это сделать. захватывать пользователей из группы, я знаю, как захватывать группы пользователей, но даже если это не захватывает 100% групп, и если я могу изменить этот порядок, действовать в качестве группы и проверять своих собственных членов, что упростит задачу наше текущее приложение, которое мы используем, чтобы сделать все это для нас, находится на ASP.net, но ему 10 лет или около того, и в нем жестко прописана учетная запись администратора для доступа к группам и т. д., даже делая это, я до сих пор не уверен, как я получит членов группы.
Код:
<?php
$ldap = ldap_connect("192.168.1.**");
$ldap_dn = "DC=************,DC=local";
ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
ldap_set_option( $ldap, LDAP_OPT_PROTOCOL_VERSION, 3 );
$access = NULL;
if ($bind = ldap_bind($ldap, "***********\\" . $_POST['username'], $_POST['password'])) {
$filter = "(sAMAccountName=" . $_POST['username'] . ")";
$attr = array("memberof","givenname","sn","mail");
$result = ldap_search($ldap, $ldap_dn, $filter, $attr) or exit("Unable to search LDAP server");
$entries = ldap_get_entries($ldap, $result);
$givenname = $entries[0]['givenname'][0] . " " . $entries[0]['sn'][0];
ldap_unbind($ldap);
//var_dump($entries[0]["sn"][0]);
//var_dump($givenname);
//var_dump($entries[0]);
// check groups
foreach($entries[0]['memberof'] as $grps) {
// is manager, break loop
//if (strpos($grps, $ldap_manager_group)) { $access = 2; break; }
// is user
//var_dump($grps);
if (strpos($grps, "****** * *** *****")) $access = "****** *";
if (strpos($grps, "*** Group")) $access = "***";
if (strpos($grps, "*** Group")) $access = "***";
if (strpos($grps, "***")) $access = "***";
if (strpos($grps, "*** Group")) $access = "***";
if (strpos($grps, "***")) $access = "***";
}
if ($access != NULL) {
// establish session variables
$_SESSION['user'] = $_POST['username'];
$_SESSION['access'] = $access;
$_SESSION['givenname'] = $givenname;
$_SESSION['email'] = $entries[0]['mail'][0];
return true;
} else {
//echo "No rights?";
// user has no rights
return false;
}
} else {
//header("Location: login.php?Error=Invalid Identity");
echo "Elese Here";
}
?>
Редактировать:
Я пытался использовать этот учебник: samjlevy.com, и я понимаю его по большей части, но я получаю несколько ошибок:
Warning: ldap_search(): Search: Operations error in C:\inetpub\wwwroot\InOutBoard\test.php on line 62
Warning: ldap_get_entries() expects parameter 2 to be resource, boolean given in C:\inetpub\wwwroot\InOutBoard\test.php on line 63
Warning: array_shift() expects parameter 1 to be array, null given in C:\inetpub\wwwroot\InOutBoard\test.php on line 66
Warning: Invalid argument supplied for foreach() in C:\inetpub\wwwroot\InOutBoard\test.php on line 72
Array ( )
Похоже, что все они работают с поиском, потому что он не работает, он возвращает набор NULL для результата, который не позволяет другим частям работать. Я не уверен, что мой $ldap_dn правильный, так как я использую тот же самый из кода php выше. Мой макет выглядит следующим образом (я новичок в этом, я считаю, что это правильно): DC= компания,DC= локальная, и поэтому она должна быть для группы, которую я хочу: CN= поиск группы,OU= низший уровень Ou,OU= группы,OU= компания,DC=Company,DC= локальный
Должен ли я использовать это как мой $ldap_dn?
РЕДАКТИРОВАТЬ 2: (Обновленный код)
Этот код отображает все группы, в которых находится пользователь, и работает очень хорошо. Есть ли способ написать вторую страницу, которая использует похожую страницу, чтобы взять одну из этих групп и вытащить из нее всех участников?
<?php
$ldap = ldap_connect("192.168.1.**");
$ldap_dn = "DC=Company,DC=local";
ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
ldap_set_option( $ldap, LDAP_OPT_PROTOCOL_VERSION, 3 );
$access = NULL;
if ($bind = ldap_bind($ldap, "**********\\" . $_POST['username'], $_POST['password'])) {
$filter = "(sAMAccountName=" . $_POST['username'] . ")";
$attr = array("memberof","givenname","sn","mail","distinguishedname");
$result = ldap_search($ldap, $ldap_dn, $filter, $attr) or exit("Unable to search LDAP server");
$entries = ldap_get_entries($ldap, $result);
$givenname = $entries[0]['givenname'][0] . " " . $entries[0]['sn'][0];
//ldap_unbind($ldap);
//var_dump($entries[0]["sn"][0]);
//var_dump($givenname);
//var_dump($entries[0]);
var_dump($entries[0]['distinguishedname'][0]);
$gFilter = "(&(objectClass=group)(member:1.2.840.113556.1.4.1941:=".$entries[0]['distinguishedname'][0]."))";
$gAttr = array("cn");
$result1 = ldap_search($ldap, $ldap_dn, $gFilter, $gAttr) or exit("Unable to search LDAP server");
$groups = ldap_get_entries($ldap, $result1);
var_dump($groups);
// check groups
foreach($entries[0]['memberof'] as $grps) {
// is manager, break loop
//if (strpos($grps, $ldap_manager_group)) { $access = 2; break; }
// is user
//var_dump($grps);
if (strpos($grps, "****** * *** *****")) $access = "****** *";
if (strpos($grps, "*** Group")) $access = "***";
if (strpos($grps, "*** Group")) $access = "***";
if (strpos($grps, "***")) $access = "***";
if (strpos($grps, "*** Group")) $access = "***";
if (strpos($grps, "***")) $access = "***";
}
if ($access != NULL) {
// establish session variables
$_SESSION['user'] = $_POST['username'];
$_SESSION['access'] = $access;
$_SESSION['givenname'] = $givenname;
$_SESSION['email'] = $entries[0]['mail'][0];
return true;
} else {
//echo "No rights?";
// user has no rights
return false;
}
} else {
//header("Location: login.php?Error=Invalid Identity");
echo "Elese Here";
}
?>
Вторая страница: Предполагается, что на этой странице находятся члены группы, которая, похоже, пытается это сделать, но не выбирает членов групп, а одну из наших OU. Посмотрите ниже, чтобы написать код для макета и что он захватывает.
<?php
function get_members($group=FALSE,$inclusive=FALSE) {
$ldap_host = "192.168.1.***";
$ldap_dn = "OU=******,OU=*****,OU=**********,DC=Company,DC=local";
$ldap_usr_dom = "@".$ldap_host;
$user = "*******";
$password = "******";
$keep = array(
"samaccountname",
"distinguishedname"
);
$ldap = ldap_connect($ldap_host) or die("Could not connect to LDAP");
ldap_bind($ldap, "REGION5SYSTEMS\\" . $user, $password) or die("Could not bind to LDAP");ry
if($group) $query = "(&"; else $query = "";
$query .= "(&(objectClass=user)(objectCategory=person))";
if(is_array($group)) {
// Looking for a members amongst multiple groups
if($inclusive) {
$query .= "(|";
} else {
$query .= "(&";
}
foreach($group as $g) $query .= "(memberOf=CN=$g,$ldap_dn)";
$query .= ")";
} elseif($group) {
$query .= "(memberOf=CN=$group,$ldap_dn)";
}
if($group) $query .= ")"; else $query .= "";
$results = ldap_search($ldap,$ldap_dn,$query);
$entries = ldap_get_entries($ldap, $results);
array_shift($entries);
$output = array(); // Declare the output array
$i = 0; // Counter
// Build output array
foreach($entries as $u) {
foreach($keep as $x) {
// Check for attribute
if(isset($u[$x][0])) $attrval = $u[$x][0]; else $attrval = NULL;
$output[$i][$x] = $attrval;
}
$i++;
}
return $output;
}
// Example Output
print_r(get_members()); // Gets all users in 'Users'
print_r(get_members("Group I'm search for")); // Gets all members of 'Test Group'
?>
Таким образом, наш DC - это DC=CompanyName,DC=Local, и тогда у нас есть папки и OU, и одно из OU называется "CompanyName", и в него вложены OU, такие как "Администраторы", "Контакты", "Группы" и т. Д.... OU Я смотрю на пользователей и вложенных в них разных организаций в нашем здании (они используют нашу домиану) и одну дополнительную OU, созданную для этого проекта. Основой проекта является сотрудник inoutBoard, поэтому у нас есть 3 группы безопасности в этом подразделении, одна для членов другой организации, одна для членов нашей организации и одна для тех, кто является руководителями как нашей организации, так и их организации, в основном люди, которые могут измениться. статус других, если они забывают это сделать. В идеале нам бы хотелось иметь какую-то кнопку синхронизации, которая могла бы проверять членов этих групп и затем загружать их в базу данных, а также некоторые значения по умолчанию, такие как статус по умолчанию "Нет на работе", без описания или чего-либо подобного., Эти группы также не содержат людей, они содержат другие группы безопасности. Это то, что мы хотим работать, мы хотим, чтобы мы могли найти членов этих групп, второй бит в коде, который я прикрепил, будет иногда работать, если я установлю $ldap_dn в "CN=Company,DC=Company,DC=Local" он распечатает всех пользователей в подразделении "Пользователи", а затем перейдет во все подразделения и распечатает пользователей из этих подразделений, за исключением того подразделения, которое нам действительно нужно, то есть того подразделения, в котором есть группы для входящей платы. Если я указываю этот путь как $ldap_dn, он просто печатает array() и ничего больше. Любая идея?
1 ответ
memberOf
Атрибут будет содержать только прямые членства в группах, поэтому рекурсивные членства не будут перечислены. Тем не менее, вы можете специально запросить рекурсивное членство в группах пользователя, например, так (чтобы немного адаптировать свой код сразу после привязки):
$filter = "(sAMAccountName=" . $_POST['username'] . ")";
$attr = array("givenname","sn","mail", "distinguishedname");
$result = ldap_search($ldap, $ldap_dn, $filter, $attr) or exit("Unable to search LDAP server");
$entries = ldap_get_entries($ldap, $result);
$gFilter = "(&(objectClass=group)(member:1.2.840.113556.1.4.1941:=".$entries[0]['distinguishedname'][0]."))";
$gAttr = array("cn");
$result = ldap_search($ldap, $ldap_dn, $gFilter, $gAttr) or exit("Unable to search LDAP server");
$groups = ldap_get_entries($ldap, $result);
На данный момент не проверено, но это общий фильтр и процесс для этого. Получите DN пользователя, затем используйте соответствующее правило OID 1.2.840.113556.1.4.1941
получить группы рекурсивно.
Причина, по которой вы не видите группу "Пользователи домена", заключается в том, что это "специальная" первичная группа в AD, хранящаяся в primaryGroupId
атрибут пользователя. Дополнительная информация об этом здесь: