المجتمع DFIR

شرح Get-ADUser: ابحث عن مستخدمي الدومين وافهم الخصائص والنتائج الفارغة

كتبت أمرًا يعرض حسابات الدومين، وأضفت عمود القسم، لكن العمود طلع فاضي. هل معلومات الموظفين ناقصة في الاكتف دايركتوري؟ ممكن، لكن فيه احتمال أبسط: أنك طلبت عرض خاصية ما جلبتها أصلًا. هذا النوع من الأخطاء يخليك تبني استنتاجًا غلط من أمر صحيح نحويًا.
أمر Get-ADUser مفيد للإدارة اليومية والمراجعة الأمنية داخل بيئة مصرح بها. قيمته مو في استخراج أكبر قائمة أسماء؛ قيمته أنك تحدد الحسابات المطلوبة، وتطلب الخصائص المناسبة، وتفسر الناتج في حدود السؤال. بنستخدم لابًا افتراضيًا ونمشي من حساب واحد إلى تقرير صغير يمكن مراجعته، مع توضيح الفرق بين جلب البيانات وتصفية البحث واختيار الأعمدة. كل الأمثلة للقراءة من الدليل، والتصدير يكتب ملفًا محليًا فقط.
الصورة التالية مثال خارجي يوضح البحث ضمن الوحدات التنظيمية، وليست نتيجة أوامر اللاب هنا. أسماء الحسابات والتواريخ تخص مثال المصدر، ولا نعتمد كلمة Never الظاهرة فيه حكمًا شاملًا على نشاط الحساب. المصدر: https://learn.microsoft.com/en-us/answers/questions/333569/list-all-users-last-logon-on-specific-ou-%28child-ou%29

مثال خارجي من Microsoft Q&A لاستعلام مستخدمين ضمن وحدة تنظيمية ووحداتها الفرعية
مثال خارجي من Microsoft Q&A لاستعلام مستخدمين ضمن وحدة تنظيمية ووحداتها الفرعية

جهّز سؤال المراجعة قبل ما تكتب الأمر

خلنا نفترض أن مسؤول التدريب طلب قائمة بالحسابات الموجودة تحت وحدة تنظيمية اسمها Training، مع اسم الحساب وحالته والقسم والمسمى الوظيفي. الهدف اكتشاف السجلات التي تحتاج مراجعة، وليس إعلان أن كل قيمة فارغة ثغرة أمنية. البيئة التدريبية اسمها lab.test، ويوجد فيها حساب معروف اسمه student.
قبل التنفيذ، اتفق على معنى القائمة. هل تشمل الوحدات الفرعية تحت Training؟ هل تحتاج الحسابات المعطلة؟ هل المطلوب الحالة الحالية فقط أم مقارنة بفترة سابقة؟ اختلاف إجابة واحدة يغير الاستعلام أو طريقة تفسيره. لا تترك هذه التفاصيل إلى ما بعد إرسال الملف.
اكتب ثلاثة أسطر في ملاحظاتك: من نبحث عنه، ومن أين نبحث، وما الخصائص التي نحتاجها. في مثالنا نبحث عن المستخدمين داخل نطاق تدريبي معروف، ونحتاج خمس خصائص محددة. هذا الوصف أبسط بكثير من أمر طويل، لكنه يكشف أي إضافة ما لها علاقة بالمهمة.
وفي اختبار اختراق مصرح، لا توسّع القائمة إلى كل دومينات الجهة لمجرد أن حسابك قادر يقرأها. القدرة التقنية شيء والنطاق المعتمد شيء آخر. استخدم اللاب لفهم الأمر، ثم طبق الاستعلام المناسب فقط على الموارد التي شملها التكليف الفعلي.

إذا الأمر غير معروف، المشكلة تسبق الاستعلام

الأمر جزء من وحدة ActiveDirectory. إذا ظهرت رسالة أن الاسم غير معروف، لا تبدأ بتعديل اسم المستخدم أو كلمة المرور؛ الجلسة لم تصل بعد إلى مرحلة البحث عن الحساب. افحص أولًا توفر الوحدة في بيئة PowerShell التي تعمل منها:
Get-Module -ListAvailable ActiveDirectory
يعرض هذا الأمر الوحدات المتاحة التي تطابق الاسم. إذا لم يظهر شيء، راجع تجهيز أدوات الإدارة المناسبة لنظامك مع مسؤول اللاب. لا تحمّل ملفًا عشوائيًا يحمل اسم الوحدة من منتدى ثم تضيفه إلى جهاز العمل. اختلاف تجهيز الجهاز قد يكون كل سبب المشكلة.
إذا كانت الوحدة متاحة، تستطيع تحميلها في الجلسة:
Import-Module ActiveDirectory
ثم راجع مساعدة الأمر:
Get-Help Get-ADUser -Examples
الهدف من هذه الخطوة معرفة ما تقبله نسختك وتجنب الخلط بين أمثلة لوحدات مختلفة. بعض الشروحات تستخدم أسماء دوال متشابهة من أدوات أخرى؛ تشابه الاسم لا يعني تطابق المعاملات أو الناتج.
ثبّت أيضًا إصدار PowerShell والوحدة عند توثيق تجربة تريد إعادتها. هذا لا يعني أن كل اختلاف إصدار سيغير النتيجة، لكنه يعطيك تفسيرًا محتملًا عندما يعمل نفس المثال في جهاز ويتوقف في آخر. ابدأ بمشكلة توفر الأمر، ثم انتقل إلى الاتصال والهوية، وبعدها صياغة الاستعلام.

ابدأ بحساب تعرف أنه موجود

أول استعلام في اللاب يكون صغيرًا:
Get-ADUser -Identity student -Server dc01.lab.test
اسم الخادم هنا مثال افتراضي لوحدة تحكم في دومين التدريب. حدده بما يطابق بيئتك المصرح بها. اختيار خادم معلوم يساعدك توثق مصدر المعلومة بدل ترك هذا الجزء غير واضح عندما تقارن نتيجتين.
معامل Identity مناسب لكائن معروف، ويقبل أنواع معرفات موثقة مثل اسم حساب SAM أو الاسم المميز أو المعرفات الثابتة. أما البحث عن عدة حسابات بمواصفات مشتركة فله معاملات البحث مثل Filter. لا تضع اسم عرض غير فريد وتفترض أنه يحدد الشخص المقصود دائمًا.
بعد ظهور الحساب، راجع الاسم المميز والدومين والحالة. لا تكتف بأن النص student ظهر على الشاشة؛ تأكد أنك تنظر إلى الحساب التدريبي في البيئة الصحيحة. في لاب صغير يبدو هذا تدقيقًا زائدًا، لكنه يصير مهمًا جدًا عند وجود أكثر من دومين أو أسماء معاد استخدامها.
هذا الاستعلام اختبار أولي مفيد: يثبت أن هذا الطلب الصغير رجع بنتيجة من المصدر المحدد في تلك اللحظة. لا يثبت أن كل الحسابات قابلة للقراءة، ولا أن كل الخصائص ستظهر، ولا أن الهوية تملك صلاحية تعديل شيء. حافظ على هذا الحد عند كتابة ملاحظاتك.

ليش عمود Department يطلع فاضي؟

جلب الكائن واختيار ما يظهر منه خطوتان مختلفتان. الأمر يرجع مجموعة خصائص افتراضية، ويمكن طلب خصائص إضافية عبر Properties. أما Select-Object فيختار الخصائص من الكائنات التي وصلت إليه؛ لا يذهب بنفسه إلى الدومين ليكمل ما لم تجلبه.
استخدم المثال التالي داخل اللاب:
Get-ADUser -Identity student -Server dc01.lab.test -Properties Department,Title | Select-Object SamAccountName,Enabled,Department,Title
لاحظ أن القسم والمسمى طُلبا في جزء الجلب، ثم اختيرا في جزء العرض. هذا الفصل يساعدك تشخّص الخانة الفارغة قبل وصفها بأنها نقص في بيانات المصدر.
إذا بقي القسم فارغًا بعد طلبه صراحة، راجع حالة الحساب عند المسؤول أو بالوسيلة الإدارية المعتمدة. قد تكون القيمة غير معبأة فعلًا، لكن لا تحول الاحتمال إلى حقيقة من غير تحقق. وتأكد من تهجئة الخاصية؛ اختيار اسم غير موجود قد ينتج عمودًا لا يحمل المعلومة التي توقعتها.
جرّب في اللاب المقارنة بين حساب معلوم أن قسمه معبأ وحساب تركه المسؤول فارغًا. ابحث بنفس الطريقة ونفس الأعمدة. وجود حالة مرجعية تعرفها مسبقًا أفضل من اختبار الاستعلام على قائمة مجهولة ثم محاولة تخمين ما إذا كان الناتج منطقيًا. هذا تمرين صغير، لكنه يعلمك كيف تتحقق من طريقة الجلب نفسها.

من حساب واحد إلى نطاق بحث محدد

الآن نبحث داخل الوحدة التدريبية:
Get-ADUser -Filter * -SearchBase 'OU=Training,DC=lab,DC=test' -SearchScope Subtree -Server dc01.lab.test -Properties Department,Title | Select-Object SamAccountName,Enabled,Department,Title,DistinguishedName
في هذا المثال، حد البحث هو الاسم المميز للوحدة التدريبية، والنطاق Subtree يشمل البحث أسفلها. استخدمنا النجمة داخل Filter بمعنى قبول المستخدمين ضمن البحث المحدد، لا بمعنى تجاهل حد SearchBase والذهاب إلى كل شيء في الغابة.
الاسم المميز ليس مسار مجلدات ويندوز. لا تستبدل مكوناته بتخمينات بناء على ما يبدو لك من اسم القسم. اطلب المسار الصحيح من بيئة التدريب أو راجعه من خصائص الكائن. الخطأ في حرف أو مستوى قد يؤدي إلى فشل البحث أو مراجعة مكان غير الذي تقصده.
إضافة DistinguishedName إلى الناتج هنا مقصودة، لأنها تساعدنا نفهم لماذا ظهر حساب معين. إذا كان داخل وحدة فرعية، سترى موقعه بدل أن تعتبره نتيجة دخيلة. ويمكن لاحقًا إزالة هذا العمود من نسخة التقرير المختصرة إذا لم يحتج إليه المستلم، مع الاحتفاظ به ضمن أدلة العمل المسموح بها.
لا تعتبر عدد النتائج معيار النجاح الوحيد. رجوع عشرين حسابًا قد يكون صحيحًا أو ناقصًا أو أوسع من المطلوب؛ المعنى يتحدد بمقارنته بالنطاق الذي اتفقت عليه وبحالات مرجعية معروفة.

التصفية سؤال جديد وليست مجرد تجميل للناتج

إذا أردت الحسابات التي ينتهي اسمها بعبارة تدريبية معينة، يمكن أن تستخدم شرطًا مناسبًا في Filter بعد مراجعة صياغته في التوثيق. مثلًا، داخل الوحدة التدريبية نفسها:
Get-ADUser -Filter 'Name -like "*Training"' -SearchBase 'OU=Training,DC=lab,DC=test' -Server dc01.lab.test | Select-Object Name,SamAccountName
هذا المثال يسأل عن حقل Name، وليس عن كل حقل قد يحمل اسمًا. إذا كان الاسم الذي تتوقعه موجودًا في حقل مختلف، فلن يصلح الشرط لمجرد أنك ترى العبارة في واجهة إدارية أخرى.
ابدأ بشرط واحد مفهوم ثم أضف الشروط حسب الحاجة. عندما تبدأ بفلتر طويل، يصعب معرفة أي شرط استبعد الحساب الذي تبحث عنه. احتفظ بعينة حساب ينطبق عليه الشرط وآخر لا ينطبق عليه، وراجع أن النتيجة تفرق بينهما كما قصدت.
انتبه أيضًا إلى اختلاف لغة Filter عن صيغة LDAPFilter. لا تخلط جزءًا من واحدة مع جزء من الأخرى ثم تحاول إصلاح الأقواس عشوائيًا. اختر الصيغة التي تفهمها للمهمة الحالية وارجع لمرجعها عند الحاجة.
هذه الأمثلة للبحث عن بيانات، وليست طريقة لتخمين هويات أو توسيع فحص خارج النطاق. السؤال الجيد يضيّق ما تحتاج قراءته ويجعل سبب كل نتيجة مفهومًا، بدل أن يكون الفلتر مجرد سلسلة معقدة تشعرك أن الاستعلام صار أكثر احترافًا.

نتيجة فارغة، أو خطأ، أو حساب ناقص: فرّق بينها

إذا رجع البحث بلا صفوف ومن دون خطأ ظاهر، فالتفسير الأولي أن الاستعلام لم يرجع مطابقات في ظروفه الحالية. لا تترجم ذلك إلى «لا توجد حسابات في الجهة». راجع الفلتر، وحد البحث، والخادم، والاسم الذي تقارنه، ثم اختبر حسابًا مرجعيًا داخل النطاق نفسه.
إذا ظهرت رسالة خطأ، احتفظ بنصها المهم مع إزالة أي معلومات حساسة عند طلب المساعدة. ميّز بين أمر غير معروف، ومشكلة اتصال بالخادم، وعدم العثور على هوية محددة، ورفض وصول. تعديل الفلتر لن يعالج غياب الوحدة، وتوسيع SearchBase لن يصلح اسم خادم غير صحيح.
إذا ظهر الحساب لكن بعض خصائصه ناقصة، انتقل إلى مسألة الخصائص المطلوبة وطريقة العرض والمصدر الحالي. هذه حالة مختلفة عن عدم ظهور الحساب. اختصار الحالتين بكلمة «ما طلع» يضيع وقت التشخيص، سواء كنت تتعلم وحدك أو تسأل زميلًا.
وفي المقارنة بين جهازين أو جلستين، ثبّت المتغيرات قدر الإمكان. استخدم نفس الحساب المرجعي ونفس الخادم ونفس النطاق والحقول. إذا اختلفت النتيجة، سجل ما تغير فعلًا بدل تغيير كل شيء مرة واحدة. الهدف أن تعرف سبب التحسن عندما تنجح المحاولة التالية، لا أن تحصل على لقطة ناجحة فقط.

احفظ قائمة يمكن مراجعتها، مو لقطة شاشة طويلة

إذا احتجت الاحتفاظ بنتيجة المهمة، اجلبها إلى متغير مخصص:
$trainingUsers = Get-ADUser -Filter * -SearchBase 'OU=Training,DC=lab,DC=test' -SearchScope Subtree -Server dc01.lab.test -Properties Department,Title
ثم اختر الأعمدة وصدّرها إلى ملف محلي داخل مجلد العمل:
$trainingUsers | Select-Object SamAccountName,Enabled,Department,Title,DistinguishedName | Export-Csv -Path 'training-users-review.csv' -NoTypeInformation -Encoding UTF8
راجع وجود ملف بالاسم نفسه قبل التنفيذ كي لا تستبدل نتيجة سابقة تريد الاحتفاظ بها. واستخدم اسمًا يتضمن وقت المراجعة أو رقم الجولة إذا كنت تقارن بين أكثر من حالة.
مرر البيانات المختارة إلى التصدير مباشرة. لا تدخل Format-Table في المنتصف؛ تنسيق العرض للشاشة ليس هو البيانات التي تريد حفظها كأعمدة قابلة للمراجعة. فصل الجلب والاختيار والتصدير يجعل الناتج أوضح ويسهّل إعادة استخدامه.
افتح الملف بعد التصدير وتأكد أن الأعمدة والأحرف العربية ظهرت بالشكل المتوقع في البرنامج الذي ستستخدمه. نجاح إنشاء الملف لا يضمن أن المستلم يقرأه بنفس إعدادات الترميز أو الفاصل. هذه مراجعة بسيطة لكنها تمنع إرسال جدول غير مفهوم ثم بناء ملاحظات على مشكلة عرض.
وفي بيئة حقيقية، هذا الملف يحتوي معلومات حسابات داخلية. احفظه وشاركه في المسار المتفق عليه، ولا تستخدم خدمة تحويل عامة لمجرد أن تنسيقه لم يظهر كما تريد.

كيف تفسر القائمة من غير ما تبالغ؟

وجود حساب معطل لا يثبت وحده أن دورة إنهاء وصول الموظف اكتملت في كل الأنظمة. قد تحتاج مراجعة تطبيقات أخرى وحسابات منفصلة وعمليات الجهة. هذا الأمر يعرض معلومات من الدليل في نطاق معين، وليس شهادة شاملة عن كل وصول الشخص.
وبالمثل، خانة قسم فارغة ليست تلقائيًا ثغرة عالية الخطورة. اسأل كيف تستخدم الجهة هذه المعلومة. إذا كانت مجرد وصف إداري، فقد تكون مسألة جودة بيانات. وإذا تعتمد عليها عملية تمنح وصولًا أو توزع مراجعات، فقد يصبح نقصها مؤثرًا في تلك العملية. الأثر يأتي من الاستخدام المثبت، لا من فراغ الخانة وحده.
لا تستنتج آخر نشاط للمستخدم من أي تاريخ تصادفه من غير فهم معناه وتحديثه. خصائص إنشاء الكائن أو تغيير كلمة المرور أو تسجيل الدخول تجيب عن أسئلة مختلفة. إذا كان المطلوب تقييم الحسابات غير النشطة، جهّز مراجعة مستقلة للمصادر الزمنية المناسبة بدل إضافة عمود تاريخ والسلام.
الصياغة المهنية للنتيجة قد تكون: «وجدنا ثلاثة حسابات ضمن الوحدة التدريبية لا تحمل قيمة للقسم في وقت المراجعة، وتحتاج الجهة تأكيد ما إذا كانت الخاصية مطلوبة في عملية محددة». هذه جملة قابلة للتحقق والعمل. أما «المستخدمون غير آمنين» فعبارة واسعة لا يثبتها الاستعلام.

تمرين عملي: اكتشف الخطأ قبل قراءة الحل

جهّز مع مسؤول اللاب ثلاثة حسابات تدريبية. الأول داخل Training وقسمه معبأ. الثاني داخل وحدة فرعية تحتها وقسمه فارغ. الثالث خارج Training وقسمه معبأ. المطلوب قائمة تشمل الأول والثاني فقط، مع بيان حالة القسم لكل منهما.
اكتب توقعك أولًا، ثم نفذ استعلام النطاق والخصائص. إذا ظهر الثالث، راجع حد البحث بدل حذف الصف يدويًا وإخفاء المشكلة. وإذا غاب الثاني، راجع نطاق البحث ومسار الوحدة الفرعية. وإذا ظهرا لكن كلا القسمين فارغ، راجع طلب الخاصية وتهجئتها قبل مطالبة المسؤول بتعديل البيانات.
بعد نجاح التجربة، اطلب تغيير قيمة واحدة في الحساب الثاني، وسجل وقت التغيير. أعد نفس الاستعلام من المصدر المحدد، وقارن النتيجة مع ملاحظاتك. لا تضف عدة تغييرات في نفس الوقت؛ تجربة بسيطة يمكن تفسيرها تعطيك فهمًا أفضل من قائمة كبيرة لا تعرف أصل اختلافاتها.
الحل المتوقع مو مجرد ملف فيه صفان، بل شرح لماذا شمل الاستعلام هذين الحسابين، ولماذا استبعد الثالث، وكيف جلب القسم، وكيف تأكدت من أن الفراغ كان في المصدر. إذا تقدر تشرح هالأجزاء من غير الرجوع إلى الأمر، فأنت بدأت تستخدم الأداة بفهم، لا بالحفظ.
وفي تدريب شهادة عملية، هذه المهارة تنفعك حتى لو جاءك موقف مختلف تمامًا: تحدد نطاقًا، تبني فرضية، تقارن المتوقع بالمشاهد، وتصلح السبب بدل مطاردة النتيجة.

مراجع ترجع لها عند اختلاف النسخة أو النتيجة

احتفظ بأمر صغير نجح عندك وبوصف ما أثبته، ثم وسّعه على قدر الحاجة. لا تحوّل كل مراجعة إلى طلب جميع خصائص جميع الحسابات. كل عمود تضيفه يفترض أن يجيب عن سؤال، وكل نطاق توسّعه يحتاج سببًا وتصريحًا مناسبًا.
مرجع Microsoft للأمر ومعاملات الهوية والبحث والخصائص:
https://learn.microsoft.com/en-us/powershell/module/activedirectory/get-aduser
مرجع اختيار خصائص الكائنات:
https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/select-object
مرجع التصدير وسبب تجنب تمرير بيانات التنسيق إلى الملف:
https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/export-csv
مرجع التحقق من الوحدات المتاحة:
https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/get-module
إذا احتجت بعد القائمة معرفة من يدخل ضمن مجموعة معينة، انتقل إلى سؤال العضويات بأداته المناسبة بدل افتراض أن كل معلومات العلاقة موجودة في الأعمدة التي طلبتها هنا. قوة أدوات الإدارة أنها تكمل بعضها؛ المهم تعرف أي سؤال طرحته على كل أداة، وتحتفظ بحدود الإجابة وأصلها.