x

الفصول الرئيسية

  1. LimeSurvey Cloud مقابل LimeSurvey CE
  2. دليل البدء السريع - LimeSurvey 3.0+
  3. التثبيت - LimeSurvey CE
  4. كيفية تصميم استبيان جيد (دليل)
  5. البدء
  6. إدارة LimeSurvey
  7. الاستبيانات - مقدمة
  8. إعدادات الاستبيان
  9. قائمة المسح
  10. هيكل المسح
  11. الأسئلة - مقدمة
  12. مجموعات الأسئلة - مقدمة
  13. المسوحات - الإدارة
  14. خيارات شريط أدوات الاستبيان
  15. استبيان متعدد اللغات
  16. محرك ExpressionScript - دليل البدء السريع
  17. غير مصنفة والميزات المتقدمة
  18. الأسئلة الشائعة العامة
  19. استكشاف الأخطاء وإصلاحها
  20. حلول بديلة
  21. الترخيص
  22. سجل تغييرات الإصدارات
  23. البرامج المساعدة
 Actions

إعدادات LDAP

From LimeSurvey Manual

ربما تُرجمت هذه الصفحة آليًا وقد تحتوي على أخطاء. عرض الأصل الإنجليزي · تحسين هذه الترجمة
This page is a translated version of the page LDAP settings and the translation is 100% complete.
  تنبيه : تتيح هذه الميزة لمسؤولي الاستبيان في LimeSurvey استيراد المشاركين عبر LDAP. إذا كنت بحاجة إلى مصادقة LDAP للمسؤولين، يُرجى الرجوع إلى برنامج AuthLDAP المساعد.


عام

يجب تمكين دعم LDAP في config.php وضبط معلمات LDAP في config/ldap.php من أجل استخدام هذه الوظيفة.

  لكي تتمكن من استخدام LDAP، يجب التحقق من تثبيت وحدة LDAP في PHP لديك. يُرجى الرجوع إلى وثائق وحدة PHP LDAP لمعرفة كيفية تثبيت هذا الامتداد.


تمكين LDAP في config.php

  • $enableLdap: إذا كنت ترغب في استخدام وظائف LDAP في LimeSurvey، فيجب تعيين هذه المعلمة إلى true (القيمة الافتراضية هي false):
'config'=>array(
		'debug'=>0,
		'debugsql'=>0,
		'enableLdap'=>true,
	)

تعريف خوادم LDAP

قم أولاً بتعريف خيارات الاتصال بخادم LDAP في "application/config/ldap.php". تتوفر الخيارات التالية لكل خادم:

  • $serverId: عدد صحيح يحدد هوية خادم LDAP هذا. يُستخدم في تعريفات الاستعلامات لربط خادم باستعلام معين؛
  • $ldap_server[$serverId]['server']: عنوان IP أو اسم DNS لخادم LDAP. إذا كنت تستخدم اتصالات مؤمّنة بـ SSL (‏LDAPs أو LDAP+Start-TLS)، فيجب أن يتطابق هذا الاسم مع CN في شهادة الخادم (أو SubjectAlternativeName)؛
  • $ldap_server[$serverId]['port']: منفذ TCP الذي يستمع عليه خادم LDAP. يكون عادةً 389 لـ LDAP وLDAP+Start-TLS، و636 لـ LDAPs؛
  • $ldap_server[$serverId]['protoversion']: يمكن أن تكون 'ldapv2' أو 'ldapv3' بحسب البروتوكول الذي يدعمه الخادم لديك. 'ldapv3' هو البروتوكول المفضل. ومع ذلك، إذا كنت ترغب في استخدام اتصالات مشفرة، فلاحظ أن LDAPs مدعوم في وضع 'ldapv2' بينما Start-TLS هي طريقة التشفير الخاصة بـ 'ldapv3'؛
  • $ldap_server[$serverId]['encrypt']: تحدد طريقة التشفير المستخدمة. 'ldaps' مدعوم لخوادم 'ldapv2'، و'start-tls' لخوادم 'ldapv3'. تُستخدم الكلمة المفتاحية 'none' لاتصالات LDAP غير المشفرة؛
    • لا تنس أنه في حالة التشفير 'ldaps' أو 'start-tls'، يجب أن يكون خادم الويب قادراً على التحقق من شهادة خادم LDAP. لذلك تحتاج إلى تعريف مرجع التصديق (Certificate Authority) لديك في مكتبة openldap (يتم ذلك عادةً في الملف /etc/openldap/ldap.conf على نظام لينكس).
  • $ldap_server[$serverId]['referrals']: معلمة منطقية تحدد ما إذا كان يجب اتباع الإحالات (referrals) أم لا (استخدم false لـ ActiveDirectory)؛
  • $ldap_server[$serverId]['encoding']: معلمة اختيارية تحدد الترميز الذي يستخدمه دليل LDAP لتخزين السلاسل النصية. لا تحتاج عادةً إلى ضبط هذه المعلمة لأن الترميز الافتراضي المفترض، 'utf-8'، هو الترميز القياسي لأدلة LDAP. ومع ذلك، إذا كنت تستخدم Active Directory وتواجه مشاكل في استيراد النصوص ذات علامات التشكيل، فحاول ضبط هذه المعلمة على الترميز المستخدم في منطقتك (مثلاً 'cp850' لأوروبا الغربية). يمكنك الرجوع إلى القائمة المنسدلة "ملف اللغة الخاص بهذا الملف" في واجهة استيراد الرمز من ملف CSV للحصول على القائمة الكاملة للترميزات المدعومة.

بعد ذلك، تحتاج إلى تعريف المصادقة اللازمة للوصول إلى الدليل. إذا كان الوصول 'المجهول' (anonymous) مسموحاً به، فلا تقم بتعيين المعلمتين التاليتين، وإلا فقم بتعيينهما وفقاً لذلك:

  • $ldap_server[$serverId]['binddn']: DN الخاص بمستخدم 'LDAP' المسموح له بقراءة الدليل؛
  • $ldap_server[$serverId]['bindpw']: كلمة المرور لمستخدم LDAP المذكور أعلاه.

إذا كنت بحاجة إلى تعريف خوادم LDAP أخرى، فأضف السطر التالي لزيادة serverID وتعريف معلمات جديدة:

  • $serverId++.

تعريف الاستعلامات في config/ldap.php

تنبيه: عندما يكون مطلوباً اسم سمة ldap في إحدى هذه المعلمات، فاستخدم الأسماء بأحرف صغيرة فقط: على سبيل المثال displayname وليس displayName.

يُرجى الرجوع إلى الملف config/ldap.php لأنه يحتوي على نماذج للإعدادات.

الاستعلامات البسيطة

لنبدأ بالاستعلامات البسيطة. تقوم هذه الاستعلامات بتصفية مدخلات LDAP استناداً إلى سماتها وموقعها فقط. وهي عادةً كافية للاستعلام عن ActiveDirectory.

  • $query_id: هو معرّف استعلام LDAP؛
  • $ldap_queries[$query_id]['ldapServerId']: يربط الاستعلام بخادم محدد؛
  • $ldap_queries[$query_id]['name']: سلسلة نصية تصف الاستعلام. سيتم عرضها في الواجهة الرسومية؛
  • $ldap_queries[$query_id]['userbase']: الـ DN الجذر المستخدم في عمليات البحث عن المستخدمين؛
  • $ldap_queries[$query_id]['userfilter']: هو تصفية تُستخدم لاختيار مدخلات المستخدمين المحتملين. يجب أن تكون محاطة بأقواس؛
  • $ldap_queries[$query_id]['userscope']: نطاق بحث LDAP عن المستخدمين ('base' أو 'one' أو 'sub')؛
  • $ldap_queries[$query_id]['firstname_attr']: سمة Ldap التي سيتم ربطها بحقل الاسم الأول في مدخل الرمز؛
  • $ldap_queries[$query_id]['lastname_attr']: سمة Ldap التي سيتم ربطها بحقل اسم العائلة في مدخل الرمز؛
  • $ldap_queries[$query_id]['email_attr']: سمة Ldap التي سيتم ربطها بحقل البريد الالكتروني في مدخل الرمز.

يمكنك اختيارياً جلب مزيد من المعلومات من الدليل:

  • $ldap_queries[$query_id]['token_attr']: سمة Ldap التي سيتم ربطها برمز الدعوة (token)؛
  • $ldap_queries[$query_id]['language']: سمة Ldap التي سيتم ربطها بلغة الكود الخاصة بالمستخدم؛
  • $ldap_queries[$query_id]['attr1']: سمة Ldap التي سيتم ربطها بالحقل attribute_1؛
  • $ldap_queries[$query_id]['attr2']: سمة Ldap التي سيتم ربطها بالحقل attribute_2.

الاستعلامات المجمعة للمجموعات مع أعضاء DN

لنرَ الآن كيفية تعريف استعلام أكثر تعقيداً.

تستخدم الاستعلامات التالية بحث LDAP أولاً يفحص مجموعات LDAP. مجموعة LDAP هي مدخل LDAP يحتوي على مراجع لمدخلات المستخدمين على شكل:

  • معرّفات المستخدمين (كما في posixGroups مثلاً) ==> انظر القسم التالي
  • أو DN للمستخدمين (كما في groupofnames وgroupofuniquenames مثلاً) ==> انظر أدناه

نتناول هنا المجموعات التي تحتوي على DN للمستخدمين:

  • قم بتعريف $query_id و$ldap_queries[$query_id]['ldapServerId'] و$ldap_queries[$query_id]['name'] كما هو موضح أعلاه.

ثم قم بتعريف معلمات تصفية المجموعات:

  • $ldap_queries[$query_id]['groupbase']: الـ DN الجذر الذي تريد بدء البحث عن مدخلات المجموعات منه؛
  • $ldap_queries[$query_id]['groupfilter']: تصفية LDAP التي ستحدد مدخلات المجموعات المحتملة؛
  • $ldap_queries[$query_id]['groupscope']: نطاق بحث LDAP عن المجموعات ('one' أو 'base' أو 'sub')؛
  • $ldap_queries[$query_id]['groupmemberattr']: اسم سمة LDAP في مدخل المجموعة التي ستحتوي على مراجع لمدخلات المستخدمين؛
  • $ldap_queries[$query_id]['groupmemberisdn']: TRUE.

عند هذه النقطة، يكون كل شيء جاهزاً ليتيح بحث LDAP الأول العثور على المستخدمين المطابقين للمجموعات المحددة. ومع ذلك، يمكنك تقييد "المستخدمين المرشحين" الذين سيتم اختيارهم عن طريق تطبيق تصفية أخرى عليهم. وهذا اختياري بطبيعة الحال:

  • $ldap_queries[$query_id]['userbase']: الـ DN الأساسي لبحث LDAP عن المستخدمين (سيتم اختيار المستخدمين المرشحين المطابقين لهذا الأساس فقط)؛
  • $ldap_queries[$query_id]['userscope']: نطاق بحث LDAP عن المستخدمين (سيتم اختيار المستخدمين المرشحين المطابقين لـ userbase+scope فقط)؛
  • $ldap_queries[$query_id]['userfilter']: هي تصفية تُطبَّق على مدخل كل مستخدم مرشح (على سماته) لإضافة اختيار آخر.

الاستعلامات المجمعة للمجموعات مع أعضاء UID

لنرَ الآن كيفية تعريف استعلام مجموعات مجمّع عندما يكون أعضاء المجموعة معرّفات UID للمستخدمين وليس DN للمستخدمين.

كما هو الحال في استعلامات المجموعات ذات أعضاء DN، تستخدم هذه الاستعلامات بحث LDAP أولاً يبحث عن مدخلات مجموعات LDAP ويجلب أعضاءها. ثم تُستخدم قيم هؤلاء الأعضاء في تصفية بحث المستخدمين للبحث عن المدخلات المطابقة. لذلك يجب ضبط معلمة أخرى لتحديد سمة المستخدم في مدخل المستخدم التي يجب أن تطابق UID العضو الموجود في المجموعات.

لنراجع المعلمات المطلوبة:

  • قم بتعريف $query_id و$ldap_queries[$query_id]['ldapServerId'] و$ldap_queries[$query_id]['name'] كما هو موضح أعلاه

ثم قم بتعريف معلمات تصفية المجموعات:

  • $ldap_queries[$query_id]['groupbase']: الـ DN الجذر الذي تريد بدء البحث عن مدخلات المجموعات منه؛
  • $ldap_queries[$query_id]['groupfilter']: تصفية LDAP التي ستحدد مدخلات المجموعات المحتملة؛
  • $ldap_queries[$query_id]['groupscope']: نطاق بحث LDAP عن المجموعات ('one' أو 'base' أو 'sub')؛
  • $ldap_queries[$query_id]['groupmemberattr']: اسم سمة LDAP في مدخل المجموعة التي ستحتوي على مراجع لمدخلات المستخدمين؛
  • $ldap_queries[$query_id]['groupmemberisdn']: FALSE;
  • $ldap_queries[$query_id]['useridattr']: اسم سمة المستخدم التي يجب أن تطابق UID الموجود في أعضاء المجموعة.

عند هذه النقطة، يكون كل شيء جاهزاً ليتيح بحث LDAP الأول العثور على معرّفات UID للمستخدمين المطابقين للمجموعات المحددة، وسيتم ملء تصفية بحث المستخدمين تلقائياً.

ومع ذلك، يمكنك تقييد "المستخدمين المرشحين" الذين سيتم اختيارهم عن طريق استكمال تصفية المستخدم التلقائية المحسوبة من معرفات UID للأعضاء. هذا الإجراء اختياري بالطبع:

  • $ldap_queries[$query_id]['userbase']: الـ DN الأساسي لبحث LDAP عن المستخدمين (سيتم اختيار المستخدمين المرشحين المطابقين لهذا الأساس فقط)؛
  • $ldap_queries[$query_id]['userscope']: نطاق بحث LDAP عن المستخدمين (سيتم اختيار المستخدمين المرشحين المطابقين لـ userbase+scope فقط)؛
  • $ldap_queries[$query_id]['userfilter']: هو عامل تصفية يُطبق على كل إدخال مستخدم مرشح (على سماته) لإضافة اختيار آخر.

ماذا عن Active Directory؟

Active Directory (AD) هو سجل من Microsoft يمكن الاستعلام عنه باستخدام بروتوكول LDAP.

لذلك يمكن استخدام محتواه في استعلامات الرموز (tokens) في LimeSurvey، ولكن هذا يتطلب معرفة بكيفية تنظيم AD.

  • أساس جذر LDAP هو dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1

==> على سبيل المثال، إذا كانت شركتك تملك نطاق DNS ‏'my-company.com' ونطاق Windows الخاص بك هو 'employees'، فإن أساس الجذر لديك هو dc=employees,dc=my-company,dc=com

  • يتم تخزين المستخدمين ومجموعات المستخدمين تحت cn=Users,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1 (يرجى ملاحظة أنه ليس ou=users)؛
  • مجموعات Active Directory:
    • تحتوي كائنات المجموعات على DN الخاص بالأعضاء في سمة 'member' الخاصة بها؛
    • يتم أيضًا تخزين عضويات المجموعات في سمة memberOf لكل إدخال مستخدم. تحتوي هذه السمة على DN للمجموعات التي ينتمي إليها المستخدم؛
    • بعض المجموعات موجودة في CN=Builtin,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1:
      • على سبيل المثال: cn=Administrator,CN=Builtin,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1؛

في بعض الحالات لا يكون الاستعلام عن Active Directory سهلاً، لذلك إليك مثالاً على إعدادات للحصول على بعض المعلومات من Active Directory:

//Connection to the active directory Server:
$serverId=0;
$ldap_server[$serverId]['server'] = "10.10.10.10";
$ldap_server[$serverId]['port'] = "389";
$ldap_server[$serverId]['protoversion'] = "ldapv2";
$ldap_server[$serverId]['encrypt'] = "none"; // Most AD LDAP servers will not have encryption set by default
$ldap_server[$serverId]['referrals'] = false;
$ldap_server[$serverId]['binddn'] = "domain\\user";
$ldap_server[$serverId]['bindpw'] = "userpassword";
//$ldap_server[$serverId]['binddn'] = "CN=user,OU=user_group,DC=xxx,DC=yyy"; this one will not work with active directory, that´s why you need to use "domain\\user"
//Here is a sample query for getting all active users of an active directory:
$query_id=0;
$ldap_queries[$query_id]['ldapServerId'] = 0;
$ldap_queries[$query_id]['name'] = 'Staff with an enabled account';
$ldap_queries[$query_id]['userbase'] = 'OU=USER_GROUP,DC=xxx,DC=yyy';
$ldap_queries[$query_id]['userfilter'] = '(&(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))';
//AD has no "account is enabled" attribute, so the filter excludes accounts that have the "disabled" flag (bit 2) set in userAccountControl
$ldap_queries[$query_id]['userscope'] = 'sub';
$ldap_queries[$query_id]['firstname_attr'] = 'givenname';
$ldap_queries[$query_id]['lastname_attr'] = 'sn';
$ldap_queries[$query_id]['email_attr'] = 'mail';
$ldap_queries[$query_id]['token_attr'] = ''; // Leave empty for Auto Token generation by phpsv
$ldap_queries[$query_id]['language'] = '';
$ldap_queries[$query_id]['attr1'] = '';
$ldap_queries[$query_id]['attr2'] = '';
//You can also filter on group membership through the memberOf attribute of the user. Here is a sample query for getting all active users that are member of the group "samplegroup" in active directory:
$query_id++;
$ldap_queries[$query_id]['ldapServerId'] = 0;
$ldap_queries[$query_id]['name'] = 'All members of samplegroup';
$ldap_queries[$query_id]['userbase'] = 'OU=USER_GROUP,DC=xxx,DC=yyy';
$ldap_queries[$query_id]['userfilter'] = '(&(objectClass=user)(memberOf=CN=samplegroup,OU=Group Global,OU=USER_GROUP,DC=xxx,DC=yyy)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))';
$ldap_queries[$query_id]['userscope'] = 'sub';
$ldap_queries[$query_id]['firstname_attr'] = 'givenname';
$ldap_queries[$query_id]['lastname_attr'] = 'sn';
$ldap_queries[$query_id]['email_attr'] = 'mail';
$ldap_queries[$query_id]['token_attr'] = ''; // Leave empty for Auto Token generation by phpsv
$ldap_queries[$query_id]['language'] = '';
$ldap_queries[$query_id]['attr1'] = '';
$ldap_queries[$query_id]['attr2'] = '';

مثال آخر على استعلام المستخدمين:

$ldap_queries[$query_id]['userfilter'] = '(&(objectCategory=Person)(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))'; // AD doesn't recognise enabled accounts in the normal way, so instead, we check users are not disabled
  • فكّر في إضافة (mail=*) إلى عوامل تصفية المستخدمين لتجاوز المستخدمين الذين ليس لديهم عنوان بريد إلكتروني.

مثال على استعلام المجموعات:

$ldap_queries[$query_id]['groupfilter'] = '(&(objectClass=group)(cn=Domain Admins))'; // AD doesn't use the standard attribute name for groups, so use this example instead.

إنشاء استعلام لكل مجموعة في Active Directory تلقائيًا

إذا كنت تحتفظ بمجموعات المشاركين في الاستبيان الخاص بك في وحدة تنظيمية (OU) واحدة، فلست مضطرًا إلى كتابة استعلام لكل مجموعة. يعرض الكود التالي قائمة بجميع المجموعات في تلك الوحدة التنظيمية وينشئ استعلامًا واحدًا لكل مجموعة. يتضمن الاستعلام جميع الأعضاء المفعّلين في المجموعة، بما في ذلك أعضاء المجموعات المتداخلة.

أضف الكود إلى config/ldap.php بعد تعريفات الخادم والاستعلامات وقبل السطر //DO NOT CHANGE BELOW HERE. ثم قم بتعيين المتغيرات الأربعة الموجودة في الأعلى:

  • $groupServerId: قيمة $serverId للخادم المراد استخدامه؛
  • $groupContainer: الـ DN الخاص بالوحدة التنظيمية (OU) التي تحتوي على المجموعات. يتم عرض المجموعات الموجودة مباشرة في هذه الوحدة التنظيمية فقط، وليس المجموعات الموجودة في الوحدات التنظيمية الفرعية؛
  • $groupUserBase: الـ DN الجذر الذي يتم البحث تحته عن أعضاء المجموعات؛
  • $groupNameAttr: سمة المجموعة (بأحرف صغيرة) المستخدمة كاسم للاستعلام في الواجهة الرسومية، على سبيل المثال 'info' (حقل "Notes" في "Active Directory Users and Computers") أو 'description'. إذا لم تكن لدى المجموعة قيمة في هذه السمة، يتم استخدام cn الخاص بها.
$groupServerId  = 0;
$groupContainer = 'OU=Survey groups,DC=xxx,DC=yyy';
$groupUserBase  = 'DC=xxx,DC=yyy';
$groupNameAttr  = 'info';

$srv = $ldap_server[$groupServerId];
$ds = ldap_connect(($srv['encrypt'] == 'ldaps' ? 'ldaps://' : 'ldap://') . $srv['server'] . ':' . $srv['port']);
if ($ds) {
    ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, $srv['protoversion'] == 'ldapv3' ? 3 : 2);
    ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);
    // Never send the bind password if Start-TLS was requested but failed
    $secure = $srv['encrypt'] != 'start-tls' || @ldap_start_tls($ds);
    $bound = $secure && (empty($srv['binddn']) ? @ldap_bind($ds) : @ldap_bind($ds, $srv['binddn'], $srv['bindpw']));
    $result = $bound ? @ldap_list($ds, $groupContainer, '(objectCategory=group)', array('cn', $groupNameAttr)) : false;
    $groups = $result ? ldap_get_entries($ds, $result) : array('count' => 0);
    for ($i = 0; $i < $groups['count']; $i++) {
        $query_id++;
        $ldap_queries[$query_id]['ldapServerId'] = $groupServerId;
        $ldap_queries[$query_id]['name'] = isset($groups[$i][$groupNameAttr][0]) ? $groups[$i][$groupNameAttr][0] : $groups[$i]['cn'][0];
        $ldap_queries[$query_id]['userbase'] = $groupUserBase;
        // Enabled users with an email address that are members of the group, directly or through nested groups
        $ldap_queries[$query_id]['userfilter'] = '(&(objectCategory=person)(objectClass=user)(mail=*)'
            . '(!(userAccountControl:1.2.840.113556.1.4.803:=2))'
            . '(memberOf:1.2.840.113556.1.4.1941:=' . ldap_escape($groups[$i]['dn'], '', LDAP_ESCAPE_FILTER) . '))';
        $ldap_queries[$query_id]['userscope'] = 'sub';
        $ldap_queries[$query_id]['firstname_attr'] = 'givenname';
        $ldap_queries[$query_id]['lastname_attr'] = 'sn';
        $ldap_queries[$query_id]['email_attr'] = 'mail';
        $ldap_queries[$query_id]['token_attr'] = '';
        $ldap_queries[$query_id]['language'] = '';
        $ldap_queries[$query_id]['attr1'] = '';
        $ldap_queries[$query_id]['attr2'] = '';
    }
    ldap_unbind($ds);
}

أمور يجب وضعها في الاعتبار:

  • يتصل الكود بالدليل في كل مرة يتم فيها فتح صفحة "استيراد المشاركين من LDAP" أو إرسالها، بحيث تظهر المجموعات الجديدة دون تغيير الإعدادات. إذا فشل الاتصال أو الربط، فستعرض الصفحة فقط الاستعلامات التي عرّفتها يدويًا.
  • تقوم قاعدة المطابقة 1.2.840.113556.1.4.1941 (LDAP_MATCHING_RULE_IN_CHAIN) بحل المجموعات المتداخلة. وهي موجودة فقط في Active Directory، لذلك لا يعمل هذا المثال مع خوادم LDAP الأخرى. في تلك الحالة، استخدم بدلاً من ذلك استعلام مجموعة مدمج لكل مجموعة.
  • لعرض المجموعات الموجودة في الوحدات التنظيمية الفرعية لـ $groupContainer أيضًا، استبدل ldap_list بـ ldap_search.
  • لعرض المجموعات من أكثر من وحدة تنظيمية، كرر الكود مع قيم أخرى للمتغيرات الأربعة.

اعثر على مزيد من المعلومات حول بنية Active Directory LDAP في Active Directory Architecture وActive Directory Technical Specification.