كيف قمت بتوصيل أجهزة الكمبيوتر والمستخدمين بمنافذ جهاز الشبكة في برنامج مراقبة Network MACMonitor

أنا مطور برنامج مراقبة شبكة Network MACMonitor .


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


الصورة


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


رأيت خيارين لحل هذه المشكلة:


  1. اكتب وكيل Windows واستجوبه باستخدام Network MACMonitor ؛
  2. استخدم Windows Management Instrumentation (WMI).

يحتوي الإصدار مع وكيل Windows على عدد من العيوب التي كانت مهمة بالنسبة لي:


  • تطوير بروتوكول آمن لتفاعل شبكة وكيل Windows مع Network MACMonitor ؛
  • الحاجة إلى تثبيت الوكيل مسبقًا على أجهزة الكمبيوتر ؛
  • باستخدام لغة برمجة مختلفة (أكتب بلغة جافا) ، لأنني أعتبر جافا غير مناسبة لكتابة وكيل: نظرًا للاستهلاك الكبير نوعًا ما للذاكرة الافتراضية والحاجة إلى تثبيت JRE على جميع أجهزة الكمبيوتر.

بسبب كل العيوب المذكورة أعلاه ، قررت أن أتناول الخيار باستخدام WMI.


تطوير عميل WMI


نظرًا لأن Network MACMonitor مكتوب بلغة Java ، فقد حاولت العثور على مكتبة Java متعددة المنصات جاهزة تعمل على تنفيذ وظائف عميل WMI. ثم شعرت بخيبة أمل - لا توجد مكتبة من هذا القبيل. جميع المكتبات الموجودة إما مغلفة فوق أدوات Windows المساعدة ، أو (j-Interop library) تتطلب معالجة إضافية للسجل (تغيير الملكية والأذونات في فروع التسجيل) لتنشيط WMI من خلال تسجيل بعيد. نظرًا لعدم وجود مكتبة تعمل بشكل كامل لـ Java ، قررت العثور على مكتبة أو عميل WMI مكتوب بأي لغة برمجة أخرى. ووجدت عميل WMI واحد لـ Linux. بعد تنزيله والتحقق من عمله ، أدركت أنه من الممكن إجراء استطلاعات لأجهزة الكمبيوتر التي تعمل بنظام Windows من نظام التشغيل Linux.


إذا كان ذلك ممكنًا ، فقد قررت كتابة مكتبتي في Java خالص ، مما يسمح لي باستقصاء الكمبيوتر باستخدام WMI.


لكتابة المكتبة ، كانت هناك حاجة إلى وثائق واضحة حول تشغيل بروتوكول WMI. اتضح أن هناك مثل هذه الوثائق وهي في المجال العام.


لقد بدأت في التحضير لكتابة المكتبة من خلال النظر إلى مكدس شبكة بروتوكول WMI.


بروتوكولالمواصفات
أدوات إدارة Windows (WMI)MS-WMI ، MS-WMIO
نموذج كائن المكون الموزع (DCOM)MS-DCOM
استدعاء الإجراء البعيد (RPC)MS-RPCE
بروتوكول التحكم في الإرسال (TCP)-
بروتوكول الإنترنت (IP)-

لكي يعمل WMI بشكل صحيح ، يجب تنفيذ جميع مستويات المكدس.


نظرًا لعدم تنفيذ WMI في Java ، انتقلت إلى البروتوكول التالي في المكدس - DCOM. وهنا كنت محظوظا. على الرغم من أن مكتبة j-Interop المذكورة أعلاه لا تطبق وظائف WMI ، يتم تنفيذ وظيفة DCOM فيه. لذلك يبقى كتابة تنفيذ بروتوكول WMI ، أي كتابة تنفيذ لمواصفات MS-WMI و MS-WMIO.


لقد بدأت بتطبيق مواصفات MS-WMIO ، المسؤولة عن تنسيق ترميز البيانات في حزم شبكة بروتوكول WMI. من المواصفات ، علمت أنه عند تشفير البيانات ، يتم استخدام مواصفات بناء الجملة Backus-Naur (ABNF ، RFC 5234). تصف مواصفات MS-WMIO بشكل كامل تنسيق الترميز باستخدام ABNF. من المعروف أنه إذا كان هناك قواعد نحوية موصوفة في ABNF ، فمن الممكن إنشاء محلل لهذه القواعد. على الإنترنت ، وجدت مولد محلل لـ ABNF لـ Java وأدخلته بقواعد مأخوذة من المواصفات. نظرًا لأن المحلل اللغوي الذي تم إنشاؤه يعمل مع السلاسل ، ويصف MS-WMIO تنسيق ترميز ثنائي ، كانت الفكرة هي ببساطة استبدال المحلل اللغوي الذي تم إنشاؤه بسلسلة من الصفائف والأحرف بالبايت. ولكن بعد النظر في عدد الملفات التي كان من الضروري استبدالها ، وبعد أن علمت أيضًا من مواصفات MS-WMIO أنه في بعض الأحيان سيكون من الضروري العمل مع البتات ، أدركت أنه سيكون من الصعب جدًا إصلاح المحلل اللغوي الذي تم إنشاؤه ، وقررت التخلي عن هذه الفكرة. اعتقدت أن كتابة محلل من الصفر سيكون أسرع. والآن أصبح المحلل جاهزًا.


ولكن كيف يمكن التحقق من كتابة المحلل اللغوي بشكل صحيح إذا لم يتم بعد تطبيق مواصفات MS-WMI ، المسؤولة عن تشغيل بروتوكول WMI؟ ثم ساعدني Wireshark ، محلل حركة مرور الشبكة. بعد تقديم طلبات WMI باستخدام أدوات Windows القياسية (wbemtest) ، بعد تعطيل التشفير سابقًا ، تلقيت حزم الشبكة وحفظتها في الملفات الثنائية. كان من الممكن بالفعل استخدام هذه الملفات كبيانات اختبار للمحلل.


عندما تم اختبار المحلل اللغوي وتصحيح الأخطاء التي تم العثور عليها ، تابعت تنفيذ مواصفات MS-WMI ، التي تصف تشغيل بروتوكول WMI.


تنقسم مواصفات MS-WMI إلى خادم وعميل. قمت بتطبيق جزء العميل جزئيًا ، بالقدر الضروري لاستقصاء جهاز كمبيوتر عبر WMI. في هذا الجزء ، كنت بحاجة أيضًا إلى Wireshark ، ولكن بالفعل لتحليل تسلسل حزم الشبكة أثناء اقتراع WMI.


محاولة الحصول على البيانات اللازمة باستخدام WMI


بعد كتابة مكتبة WMI ، أصبحت مهمة استخدامه في برنامج Network MACMonitor. طرح السؤال: ما هي البيانات التي يجب الحصول عليها من أجهزة الكمبيوتر؟ اعتقدت أنني بحاجة للحصول على اسم الكمبيوتر ، المجال ، نظام التشغيل ، وقت التشغيل ، عناوين mac ، عناوين IP ، المستخدمين النشطين الذين يعملون على الكمبيوتر.


ولكن ظهرت مشكلة مهمة للغاية: كيف يمكن التعرف بشكل فريد على جهاز كمبيوتر أثناء اقتراع WMI؟ فكرت في الخيارات التالية:


  • عنوان mac ، تغيير محتمل ، محتمل غير فريد ؛
  • اسم المجال والمجال (مجموعة العمل) ، التغيير المحتمل ، غير فريد (لمجموعة العمل) ؛
  • الرقم التسلسلي لمحرك الأقراص الثابتة حيث تم تثبيت نظام التشغيل ، مطلوب حقوق المسؤول أثناء اقتراع WMI ، لم أتحقق من التفرد ، لكني أشك في أن nonunique ممكن ؛
  • الرقم التسلسلي للوحة الأم ، غير فريد ممكن ، وفي كثير من الأحيان ؛
  • معرف نظام الكمبيوتر (خاصية UUID WMI لفئة Win32_ComputerSystemProduct ) ، عدم التفرد ممكن ، وفي كثير من الأحيان ؛
  • يعد وقت التثبيت لنظام التشغيل هو الأفضل من بين جميع الخيارات ، ولكن عدم التفرد ممكن عند استنساخ النظام ، أو عند النشر من صورة.

لا يوجد خيار يسمح لك بتعريف الكمبيوتر بشكل فريد ، لذلك استقرت على تحديد الكمبيوتر بثلاث طرق:


  • الرقم التسلسلي اللوحة الأم،
  • معرف نظام الكمبيوتر
  • وقت تثبيت نظام التشغيل.

بالطبع ، قد تتزامن هذه المعلمات الثلاثة على أجهزة كمبيوتر مختلفة ، ولكن أقل من واحد منها.


جرت محاولة أيضًا للحصول على مستخدمين نشطين باستخدام فئة WMI القياسية: Win32_LogonSession . ثم ظهرت المشكلة الأولى: اتضح أن Win32_LogonSession يعرض جميع جلسات المستخدم ، حتى تلك التي أكملت بالفعل. بدأت أفكر في كيفية تصفية الجلسات النشطة من تلك التي انتهت. وجدت أنه يمكن القيام بذلك باستخدام فئة Win32_SessionProcess ، التي تربط مثيلات فئات Win32_LogonSession مع Win32_Process . إذا كان الارتباط بالجلسة موجودًا في قائمة مثيلات فئة Win32_SessionProcess (هناك عملية واحدة على الأقل مع معرف هذه الجلسة) ، فعندئذ تكون نشطة. بعد ذلك ، طرح السؤال حول كيفية ربط جلسة بمستخدم. يمكن القيام بذلك باستخدام فئة Win32_LoggedOnUser ، التي تربط مثيلات فئتي Win32_LogonSession و Win32_UserAccount . يبقى فقط للحصول على مثيلات فئة Win32_UserAccount التي توفر معلومات مفصلة حول المستخدم.


الصورة


ولكن هنا شعرت بخيبة أمل. عند استخدام WMI عن بعد ، اتضح أنه عند محاولة الحصول على مثيلات فئة Win32_UserAccount ، من الممكن الحصول على مستخدمي الكمبيوتر المحليين فقط. أي ، اتضح أنه باستخدام أدوات WMI القياسية ، من المستحيل معرفة المستخدمين النشطين على الكمبيوتر.


تطوير موفر WMI.


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


تم وصف فئتين جديدتين من WMI: NMBY_InstallInfo - لتحديد جهاز كمبيوتر و NMBY_LogonSession - لتحديد المستخدمين النشطين للكمبيوتر.


الصورة


ثم تمت كتابة موفر WMI الذي يمكنك من خلاله الحصول على مثيلات من هذه الفئات.


تم تحديد المتطلبات الإضافية للموفر:


  • العمل على نظام بدون .NET.
  • العمل على نظام التشغيل Windows XP والإصدارات الأحدث ؛
  • القدرة على الحصول على معلومات باستخدام حساب غير إداري.

لذلك ، تمت كتابة الموفر في C ++ باستخدام WinApi.


في عملية كتابة الموفر ، نشأت صعوبات بسبب قلة وجودة الوثائق حول هذا الموضوع ، ولكن على الرغم من ذلك ، تمت كتابة الموفر بنجاح.


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


الملخص


ونتيجة لذلك ، أصبح من الممكن استخدام برنامج Network MACMonitor:


  • إقران المستخدمين بأجهزة الكمبيوتر

الصورة


  • إقران أجهزة الكمبيوتر بالمنافذ على أجهزة الشبكة

الصورة


  • إقران منافذ جهاز الشبكة بأجهزة الكمبيوتر والمستخدمين

الصورة


  • عرض سجل تسجيل المستخدم على أجهزة الكمبيوتر.

الصورة


موقع البرنامج

Source: https://habr.com/ru/post/ar416217/


All Articles