Active Directory — LDAP Поиск членов группы Переполнение стека

У меня есть вопрос относительно членства пользователей в группах в 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 () и ничего больше. Любая идея?

0

Решение

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 атрибут пользователя. Дополнительная информация об этом здесь:

https://support.microsoft.com/en-us/kb/297951

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]