Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
ClientInspectorV2 — أداة جرد العملاء والكشف عن الانجراف المستندة إلى Azure والتي تجمع بيانات تكوين Windows (مكافحة الفيروسات، التصحيح، Bitlocker) في LogAnalytics للوحات المعلومات المدعومة بـ KQL وتنبيهات Sentinel. | Kitploit
أدوات/GitHubGitHub/knudsenmorten/clientinspectorv2
أدوات دفاعيةتدقيق التكوينأمن السحابةالاستجابة للحوادثتحليل السجلات
GitHubknudsenmorten/clientinspectorv2

ClientInspectorV2

أداة جرد العملاء والكشف عن الانجراف المستندة إلى Azure والتي تجمع بيانات تكوين Windows (مكافحة الفيروسات، التصحيح، Bitlocker) في LogAnalytics للوحات المعلومات المدعومة بـ KQL وتنبيهات Sentinel.

عرض المستودع

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة
275منذ 3 سنواتتمت المراجعة من قبل Kitploit

مقدمة إلى ClientInspector (v2)

ClientInspector

هل أنت المسيطر؟ - أم أن بعض عمليات البنية التحتية الأساسية لديك مثل التصحيح، مكافحة الفيروسات، تمكين BitLocker تنحرف؟ أو هل ترغب في إجراء جرد متقدم، حيث يمكنك البحث عن حالة الضمان الخاصة بك مقابل ضمان Lenovo أو Dell، ثم تابع القراءة.

تعرف على ClientInspector، الذي يمكنه مساعدتك في الحصول على رؤية رائعة لـ بيئة عملائك بالكامل.

ClientInspector مجاني للمجتمع - تم بناؤه ليكون عرضًا رائعًا لكيفية جلب البيانات من أجهزة العملاء باستخدام Azure Log Ingestion Pipeline، Azure Data Collection Rules، Azure LogAnalytics؛ وعرضها باستخدام Azure Monitor & Azure Dashboards - والحصول على "تنبيهات الانحراف" باستخدام Microsoft Sentinel.

فيديو 3 دقائق 01 ثانية - لوحات المعلومات

بنية وتدفق ClientInspector

يقوم ClientInspector (v2) بتحميل البيانات التي تم جمعها إلى سجلات مخصصة في مساحة عمل Azure LogAnalytics - باستخدام Log ingestion API، Azure Data Collection Rules (DCR) و Azure Data Collection Endpoints (DCE).

Archicture

نماذج لوحات المعلومات

KPIs

Antivirus

Bluescreens

إخلاء مسؤولية

من المهم بالنسبة لي أن أذكر أنني لا أحاول بناء أداة إدارة منفصلة تتنافس مع مجموعة أدوات الأمان والإدارة من Microsoft.

لا شيء يتفوق على مجموعة حلول أمان وإدارة Microsoft Azure/M365. إنها حلول نجمية.

لكنني حقًا شغوف بـ قدرات التسجيل والقدرة على جلب البيانات من أجهزة العملاء، الخوادم، السحابة والأنظمة الخارجية - والحصول على معلومات قيمة رائعة من البيانات.

لدي حل مماثل لـ الخوادم - ServerInspector. لسوء الحظ، ليس عامًا.

شكر كبير للأشخاص الرائعين في فرق منتجات Microsoft - أنتم نجوم 😄

صيد سعيد 😄


روابط سريعة

ما هي البيانات التي يتم جمعها؟
لوحات معلومات الحالة المرغوبة - كيف تحصل على رؤية لبيئتي من البيانات؟
كيف أستعلم عن البيانات؟ - Kusto (KQL) هو الجواب
الهيكل، المخطط والشبكات
التنفيذ
التبعيات
تشغيل ClientInspector.ps1 - 3 أوضاع
نموذج إخراج ClientInspector
الأمان
تخطيط مجموعة بيانات ClientInspector
الوضع المفصل والمزيد من المساعدة
التكلفة - كم تكلفة تخزين هذه البيانات؟ العثور على أخطاء، يرجى إبلاغي
اتصل بنا

فيديوهات الحل

فيديو 3 دقائق 19 ثانية - تشغيل ClientInspector باستخدام سطر الأوامر (الوضع العادي)
فيديو 1 دقيقة 40 ثانية - إنشاء تلقائي لجدولين و DCRs (الوضع المفصل)
فيديو 1 دقيقة 37 ثانية - إنشاء تلقائي لجدولين و DCRs (الوضع العادي)
فيديو 1 دقيقة 34 ثانية - رؤية مخطط DCR والجدول
فيديو 2 دقيقة 19 ثانية - معالجة البيانات
فيديو 1 دقيقة 58 ثانية - استعلامات Kusto على البيانات
فيديو 3 دقائق 01 ثانية - لوحات المعلومات
فيديو 0 دقيقة 48 ثانية - مثال استخدام البيانات - البحث في قاعدة ضمان Lenovo
فيديو 7 دقائق 25 ثانية - النشر عبر ClientInspector DeploymentKit


ما هي البيانات التي يتم جمعها؟

يمكن استخدام ClientInspector لجمع الكثير من المعلومات الرائعة من أجهزة Windows الخاصة بك - وإرسال البيانات إلى جداول مخصصة في Azure LogAnalytics.

يجمع السكربت المعلومات التالية (الإعدادات، المعلومات، التكوين، الحالة):

  1. المستخدم المسجل دخوله إلى الجهاز
  2. معلومات الكمبيوتر - BIOS، المعالج، معلومات الأجهزة، معلومات نظام Windows، معلومات نظام التشغيل، آخر إعادة تشغيل
  3. التطبيقات المثبتة، باستخدام WMI والسجل
  4. مركز أمان مكافحة الفيروسات من Windows - برنامج مكافحة الفيروسات الافتراضي، الحالة، التكوين
  5. Microsoft Defender Antivirus - جميع الإعدادات بما في ذلك ASR، الاستثناءات، الحماية في الوقت الحقيقي، إلخ
  6. Office - الإصدار، تكوين قناة التحديث، SKUs
  7. عميل VPN - الإصدار، المنتج
  8. LAPS - الإصدار
  9. Admin By Request (جهة خارجية) - الإصدار
  10. Windows Update - آخر نتيجة (متى)، معلومات مصدر التحديث (أين)، التحديثات المعلقة، آخر التثبيتات (ماذا)
  11. Bitlocker - التكوين
  12. سجل الأحداث - البحث عن أحداث محددة بما في ذلك أحداث تسجيل الدخول، الشاشات الزرقاء، إلخ
  13. محولات الشبكة - التكوين، المحولات المثبتة
  14. معلومات IP لجميع المحولات
  15. عضوية مجموعة المسؤولين المحليين
  16. جدار حماية Windows - الإعدادات لجميع الأوضاع الثلاثة
  17. نهج المجموعة - آخر تحديث
  18. معلومات TPM - ذات صلة باكتشاف الأجهزة التي تحتوي على TPM أو بدونها

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


بيانات المصدر - ما البيانات التي يمكنني استخدامها؟

يمكنك استخدام أي بيانات مصدر يمكن استردادها إلى Powershell (wmi، cim، بيانات خارجية، rest api، تنسيق xml، تنسيق json، تنسيق csv، إلخ)

من المهم جدًا أن نفهم أن البيانات تحتاج عادةً إلى معالجتها قبل إرسالها - لضمان صحتها وإزالة أي بيانات غير ذات صلة.

يستخدم ClientInspector جميع الوظائف الـ 24 داخل وحدة Powershell، AzLogDcIngestPS، للتعامل مع معالجة بيانات المصدر لـ إزالة "الضوضاء" في البيانات، لـ إعادة تسمية الأعمدة المحظورة في الجداول/DCR - ودعم احتياجات الشفافية مع رؤية إضافية مثل UserLoggedOn، CollectionTime، Computer:

أمثلة على كيفية استخدام الوظائف Convert-CimArrayToObjectFixStructure، Add-CollectionTimeToAllEntriesInArray، Add-ColumnDataToAllEntriesInArray، ValidateFix-AzLogAnalyticsTableSchemaColumnNames، Build-DataArrayToAlignWithSchema، Filter-ObjectExcludeProperty```js #------------------------------------------------------------------------------------------- # Collecting data (in) #-------------------------------------------------------------------------------------------

Write-Output "" Write-Output "Collecting Bios information ... Please Wait !"

$DataVariable = Get-CimInstance -ClassName Win32_BIOS

#-------------------------------------------------------------------------------------------

Preparing data structure

#-------------------------------------------------------------------------------------------

convert CIM array to PSCustomObject and remove CIM class information

$DataVariable = Convert-CimArrayToObjectFixStructure -data $DataVariable -Verbose:$Verbose

add CollectionTime to existing array

$DataVariable = Add-CollectionTimeToAllEntriesInArray -Data $DataVariable -Verbose:$Verbose

add Computer & UserLoggedOn info to existing array

$DataVariable = Add-ColumnDataToAllEntriesInArray -Data $DataVariable -Column1Name Computer -Column1Data $Env:ComputerName -Column2Name UserLoggedOn -Column2Data $UserLoggedOn -Verbose:$Verbose

Remove unnecessary columns in schema

$DataVariable = Filter-ObjectExcludeProperty -Data $DataVariable -ExcludeProperty __*,SystemProperties,Scope,Qualifiers,Properties,ClassPath,Class,Derivation,Dynasty,Genus,Namespace,Path,Property_Count,RelPath,Server,Superclass -Verbose:$Verbose

يرجى الاطلاع على المزيد من التفاصيل حول الوظائف المتاحة في AzLogDcrIngestPS - وكيفية استخدامها هنا


لوحات الحالة المرغوبة - كيف أحصل على رؤية لبيئتي من البيانات؟

كجزء من النشر الأولي باستخدام ClientInSpectorV2-DeploymentKit، ستحصل على إمكانية الوصول إلى العديد من لوحات信息和 مصنفات Azure.

فيديو 3 دقائق و 01 ثانية - لوحات المعلومات

فكرة لوحات المعلومات هي أنها ستظهر أين تبتعد البنية التحتية عن 'الحالة المرغوبة'. فكر فيها كمؤشرات أداء رئيسية (KPIs)، حيث البنية التحتية ليست تحت السيطرة.

بدلاً من وجود مهمة تتعلق بالتحديثات وإدارة مكافحة الفيروسات، يمكنك التفكير في وجود مؤشرات أداء رئيسية، والتي ستظهر أين لا يتم تحديث أجهزة الكمبيوتر - أو أين لا تعمل الحماية في الوقت الفعلي في مكافحة الفيروسات - أو الأجهزة التي تعرضت لشاشة زرقاء خلال الـ 24 ساعة الماضية.

هذا هو نفس مفهوم Microsoft Secure Score.

مكافحة الفيروسات

الشاشات الزرقاء

المزيد من نماذج المشاهدات المضمنة في الحل

مكافحة الفيروسات

مكافحة الفيروسات

مكافحة الفيروسات

مكافحة الفيروسات

Bitlocker

Bitlocker

الشاشات الزرقاء

معلومات الكمبيوتر

معلومات الكمبيوتر

معلومات الكمبيوتر

معلومات الكمبيوتر

Defender

Office

رابط لرؤية القائمة الكاملة لمصنفات Azure المقدمة

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

لوحات المعلومات

رابط لرؤية لوحات معلومات Azure المقدمة

هل يمكنني إنشاء مصنفاتي ولوحات المعلومات الخاصة بي؟ - نعم، يمكنك 😄

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


كيف أستعلم البيانات؟ - Kusto (KQL) هو الجواب

إذا كنت لا تعرف لغة Kusto، أوصيك بالبدء في اللعب بها، لأنها لغة قوية حقاً.

فيديو 1 دقيقة و 58 ثانية - استعلامات Kusto ضد البيانات
فيديو 3 دقائق و 01 ثانية - لوحات المعلومات

اكتب أول استعلام لك باستخدام Kusto Query Language

تحليل نتائج الاستعلام باستخدام KQL

فيما يلي 4 نماذج من الاستعلامات لبدء العمل - استناداً إلى البيانات من ClientInspector.

نموذج الاستعلام 1: الصيد المتقدم باستخدام استعلام Kusto (KQL)

إذا كنت ترغب في القيام بالصيد المتقدم، يمكنك استخدام استعلامات Kusto (KQL) التقليدية في الجداول

نموذج استعلام ```js InvClientDefenderAvV2_CL | where TimeGenerated > ago(31d) | summarize CollectionTime = arg_max(CollectionTime, *) by Computer | where ((AMRunningMode == "Not running") or (parse_version(AMProductVersion) < parse_version("4.18.2203")) or (MPComputerStatusFound == false) or (MPPreferenceFound == false) or (RealTimeProtectionEnabled == false) or (AntivirusSignatureAge > 7) or (AntispywareSignatureAge > 7) or (NISSignatureAge > 7) or (AMRunningMode == "EDR Block Mode") or (AMRunningMode == "Passive Mode") or (AntispywareEnabled == false) or ((TamperProtectionSource != "ATP") and (TamperProtectionSource != "Intune")) or (IsTamperProtected == false) ) | project Computer, UserLoggedOn, CollectionTime, MPComputerStatusFound, MPPreferenceFound, AMEngineVersion, AMProductVersion, AMRunningMode, AMServiceEnabled, AMServiceVersion, AntispywareEnabled, AntispywareSignatureAge, AntispywareSignatureLastUpdated, AntispywareSignatureVersion, AntivirusEnabled, AntivirusSignatureAge, AntivirusSignatureLastUpdated, AntivirusSignatureVersion, BehaviorMonitorEnabled, DefenderSignaturesOutOfDate, DisableAutoExclusions, DisableBehaviorMonitoring, DisableRealtimeMonitoring, DisableScanningMappedNetworkDrivesForFullScan, DisableScanningNetworkFiles, DisableScriptScanning, EnableControlledFolderAccess, EnableNetworkProtection, FullScanAge, IoavProtectionEnabled, IsTamperProtected, IsVirtualMachine, MAPSReporting, NISEnabled, NISEngineVersion, NISSignatureAge, NISSignatureLastUpdated, NISSignatureVersion, OnAccessProtectionEnabled, ProductStatus, PUAProtection, QuickScanAge, RealTimeProtectionEnabled, RealTimeScanDirection, RebootRequired, ScanAvgCPULoadFactor, SignatureUpdateCatchupInterval, SignatureUpdateInterval, SubmitSamplesConsent, TamperProtectionSource ```

استعلام نموذجي 2: استعلام Kusto لدمج البيانات من 3 جداول

استعلام نموذجي ```js InvClientComputerInfoBiosV2_CL | summarize TimeGenerated = arg_max(TimeGenerated,*) by Computer | join (InvClientComputerInfoSystemV2_CL | summarize TimeGenerated = arg_max(TimeGenerated,*) by Computer) on $left.Computer == $right.Computer | join (InvClientComputerOSInfoV2_CL | summarize TimeGenerated = arg_max(TimeGenerated,*) by Computer) on $left.Computer == $right.Computer | project Computer, UserLoggedOn, SerialNumber, Manufacturer, PCSystemType, SystemFamily, Model, Windows=Caption2, WindowsVersion=Version1, TimeGenerated ```

الاستعلام النموذجي 3: استعلام بيانات LogAnalytics من Powershell

استعلام نموذجي ```js Connect-AzAccount

#----------------------------------------------------------------------------------------------------------------------

Variables

#----------------------------------------------------------------------------------------------------------------------

$LogAnalyticsWorkspaceId = "e74ca75a-c0e6-4933-a4f7-e5ae943fe4ac"

#----------------------------------------------------------------------------------------------------------------------

Collecting Computer data from Azure LogAnalytics

#---------------------------------------------------------------------------------------------------------------------- $Query = @' InvClientComputerInfoBiosV2_CL | summarize TimeGenerated = arg_max(TimeGenerated,) by Computer | join (InvClientComputerInfoSystemV2_CL | summarize TimeGenerated = arg_max(TimeGenerated,) by Computer) on $left.Computer == $right.Computer | join (InvClientComputerOSInfoV2_CL | summarize TimeGenerated = arg_max(TimeGenerated,*) by Computer) on $left.Computer == $right.Computer | project Computer, UserLoggedOn, SerialNumber, Manufacturer, PCSystemType, SystemFamily, Model, Windows=Caption2, WindowsVersion=Version1, TimeGenerated '@

write-output "Collecting computer information from LogAnalytics" $Query = Invoke-AzOperationalInsightsQuery -WorkspaceId $LogAnalyticsWorkspaceId -Query $Query $ComputerInfoArray = $Query.Results $ComputerInfoArray

root@kitploit:~
</details>

## مثال الاستعلام 4: دمج البيانات مع مصادر أخرى (التحقق من الضمان مقابل قاعدة بيانات ضمان Lenovo)

عندما تكون البيانات موجودة في Azure LogAnalytics، يمكننا البدء في دمجها مع مصادر أخرى، مثل بيانات الضمان من Dell أو Lenovo عبر استعلام REST API.

[فيديو 0:48 دقيقة - مثال على استخدام البيانات - البحث في قاعدة بيانات ضمان Lenovo](https://youtu.be/3ZDyTwiLU0w)

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

[مثال على إخراج الضمان (Excel)، استنادًا إلى البيانات التي جمعها ClientInspector](https://github.com/KnudsenMorten/ClientInspectorV2/raw/main/img/WarrantyInfo.xlsx)

<br>

# العمارة، المخطط والشبكات
يقوم ClientInspector (الإصدار 2) برفع البيانات المجمعة إلى **سجلات مخصصة** في **مساحة عمل Azure LogAnalytics** – باستخدام **واجهة برمجة تطبيقات استيعاب السجلات (Log ingestion API)** و **قواعد جمع بيانات Azure (DCR)** و **نقاط نهاية جمع بيانات Azure (DCE)**.

![العمارة](https://assets.kitploit.com/production/public/readmes/6097/a1f4330c4e3747c2ebe092927df32352c2c158028f239afb7617e608aa882966.png)

## المخطط (Schema)
يحتوي كل من DCR وجدول LogAnalytics على مخطط، يجب أن يتطابق مع مخطط الكائن المصدر. يتم التعامل مع ذلك باستخدام دوال في وحدة AzLogDcrIngestPS.

[فيديو 1:40 دقيقة - الإنشاء التلقائي لجدولين وDCRs (وضع مفصل)](https://youtu.be/rIUNs3yT-eI)
[فيديو 1:37 دقيقة - الإنشاء التلقائي لجدولين وDCRs (وضع عادي)](https://youtu.be/khQMDcON6r8)
[فيديو 1:34 دقيقة - رؤية مخطط DCR والجدول](https://youtu.be/NDSNhvpa4Gs)

تدعم AzLogDcrIngestPS وضعين لإدارة المخطط: **دمج (Merge)** و**استبدال (Overwrite)**

### SchemaMode = دمج (افتراضي)
إذا قمت بتعيين SchemaMode = Merge، فستتم إضافة الخصائص الجديدة من الكائن المصدر (دمجها) في المخطط الحالي لـ log analytics. سيقوم DCR باستيراد المخطط من جدول log analytics لضمان تطابقهما.

الوضع الافتراضي هو الدمج، إذا لم تقم بتعريف المتغير SchemaMode في الدوال:
CheckCreateUpdate-TableDr-Structure
CreateUpdate-AzLogAnalyticsCustomLogTableDcr
CreateUpdate-AzDataCollectionRuleLogIngestCustomLog

### SchemaMode = استبدال
إذا قمت بتعيين SchemaMode = Overwrite، فسيتم استبدال المخطط في DCR والجدول (تحديثه) بناءً على مخطط الكائن المصدر.

## الشبكات
لديك 3 خيارات للاتصال بـ Azure لرفع البيانات:

|طريقة الرفع|تفاصيل الاتصال|توافق نظام التشغيل|
|:----------|:--------------|:----------------|
|وصول عام|ترسل نقطة نهاية REST إلى DCE عبر عنوان IP العام لـ DCE|تدعم نقطة النهاية TLS 1.2|
|وصول خاص|ترسل نقطة نهاية REST إلى DCE عبر الارتباط الخاص لـ DCE|تدعم نقطة النهاية TLS 1.2|
|مركز السجلات (Log-hub)|ترسل نقطة نهاية REST البيانات عبر [مركز السجلات](https://github.com/KnudsenMorten/AzLogDcrIngestPSLogHub) – وهو مفهوم قمت ببنائه.|لا تدعم نقطة النهاية TLS 1.2.<br>لن تقبل Azure الاتصال من هذه الأجهزة مباشرةً|

### نقاط النهاية المتصلة بالإنترنت - الامتثال على مستوى نظام التشغيل
![نقاط النهاية المتصلة بالإنترنت - الامتثال على مستوى نظام التشغيل](https://assets.kitploit.com/production/public/readmes/6097/3cc67f07297302ff59d08c95a790ec8ad417f8dbd07f566a24b154eecfecb8bb.png)

تحتاج إلى السماح بنقاط النهاية التالية في جدار الحماية الخاص بك:
|نقطة النهاية|الغرض|المنفذ|الاتجاه|تجاوز فحص HTTPS|
|:-----------|:----|:----|:------|:--------------|
|global.handler.control.monitor.azure.com|خدمة التحكم في الوصول|المنفذ 443|صادر|نعم|
|uri استيعاب سجلات DCE<br><br>مثال<br>https://dce-log-platform-management-client-demo-p-iur0.westeurope-1.ingest.monitor.azure.com|استيعاب بيانات السجلات|المنفذ 443|صادر|نعم|

<br>

### لا يوجد وصول إلى الإنترنت أو عدم الامتثال على مستوى نظام التشغيل مثلاً تشغيل TLS 1.0/1.1
[اطلع على مفهوم مركز السجلات باستخدام هذا الرابط](https://github.com/KnudsenMorten/AzLogDcrIngestPSLogHub)

![لا يوجد وصول إلى الإنترنت أو عدم الامتثال على مستوى نظام التشغيل مثلاً تشغيل TLS 1.0/1.1](https://assets.kitploit.com/production/public/readmes/6097/42435b25d7c2cc8d405e62d577420fa980aef5f9267f461c56ce9a08f7f81917.png)

<br>

# التنفيذ
آمل أن تختبر أنه من السهل جدًا تشغيل كل شيء. الخطوات الثلاث موضحة أدناه.

قبل البدء، أشجعك على قراءة المزيد من التفاصيل حول المكونات في المقدمة أدناه.

<details>
  <summary>مقدمة عن مكونات Azure المستخدمة كجزء من ClientInspector</summary>

<br>

المكونات التالية مطلوبة:

|مورد Azure|الغرض|مزيد من المعلومات|
|:---------|:----|:----------------|
|أي نقطة نهاية REST|هذا هو المصدر الذي يرسل البيانات| |
|واجهة برمجة تطبيقات استيعاب السجلات (Log Ingestion API)|هذه هي الواجهة الجديدة التي تحل محل واجهة HTTP Data Collector API القديمة|https://learn.microsoft.com/en-us/azure/azure-monitor/logs/logs-ingestion-api-overview|
|نقطة نهاية جمع البيانات (DCE)|هذه هي نقطة الاتصال الرئيسية من نقطة النهاية. يتم إرسال البيانات إلى **Azure Data Collection Endpoint Ingestion Uri**. يمكن لـ DCE واحد دعم عدة DCRs، لذا يمكنك تحديد DCR مختلف لمصادر وجداول مستهدفة مختلفة.|https://learn.microsoft.com/en-us/azure/azure-monitor/essentials/data-collection-endpoint-overview?tabs=portal|
|قواعد جمع البيانات (DCR)|تحدد قواعد جمع البيانات البيانات المجمعة (المخطط) وتحدد كيف وأين يجب إرسال هذه البيانات أو تخزينها. يجب أن يفهم DCR بنية بيانات الإدخال وبنية الجدول الهدف. إذا لم يتطابق الاثنان، فيمكنه استخدام تحويل لتحويل بيانات المصدر لمطابقة الجدول الهدف. يمكنك أيضًا استخدام التحويل لتصفية بيانات المصدر وإجراء أي حسابات أو تحويلات أخرى.|https://learn.microsoft.com/en-us/azure/azure-monitor/essentials/data-collection-rule-overview|
|مساحة عمل Azure LogAnalytics|يتم إرسال البيانات إلى سجلات مخصصة في Azure LogAnalytics|https://learn.microsoft.com/en-us/azure/azure-monitor/logs/log-analytics-overview|
|Azure Workbooks|كجزء من النشر، سيتم نشر دفاتر عمل نموذجية|https://learn.microsoft.com/en-us/azure/azure-monitor/visualize/workbooks-overview|
|Azure Dashboards|كجزء من النشر، سيتم نشر دفاتر عمل نموذجية|https://learn.microsoft.com/en-us/azure/azure-monitor/visualize/tutorial-logs-dashboards|
|Kusto (KQL)|يمكن تحليل البيانات باستخدام استعلامات Kusto (KQL)|https://learn.microsoft.com/en-us/azure/azure-monitor/logs/get-started-queries|

</details>

الخطوات لإعداد ClientInspector في بيئتك هي:
1. [إعداد البيئة باستخدام ClientInSpectorV2-DeploymentKit](https://github.com/KnudsenMorten/ClientInspectorV2-DeploymentKit)

2. تشغيل ClientInspector لأول مرة (الإعداد الأولي) – انظر أدناه لمزيد من التفاصيل
<details>
  <summary>كيفية تكوين الإعداد الأولي لجداول Azure LogAnalytics وقواعد جمع البيانات (المرة الأولى)</summary>

<br>
أوصي بوجود جهاز كمبيوتر مرجعي يُستخدم لإدارة الجدول/DCR. بهذه الطريقة، ستكون العملية خاضعة للتحكم، إذا كان يجب إجراء تغييرات – على سبيل المثال إذا تغير مخطط الكائن المصدر.

<br>
<br>
التكوين:

1. عند تشغيل DeploymentKit، سيقوم تلقائيًا بإعداد ملف ClientInspector لك، لذلك تحتاج فقط إلى إدراج المتغيرات```js
$TenantId                                   = "xxxx" 
$LogIngestAppId                             = "xxxx" 
$LogIngestAppSecret                         = "xxxx" 

$DceName                                    = "xxxx" 
$LogAnalyticsWorkspaceResourceId            = "xxxx"

$AzDcrPrefixClient                          = "xxx" 
$AzDcrSetLogIngestApiAppPermissionsDcrLevel = $false
$AzDcrLogIngestServicePrincipalObjectId     = "xxx" 
$AzDcrDceTableCreateFromReferenceMachine    = @()
$AzDcrDceTableCreateFromAnyMachine          = $true
  1. قم بإعداد مهمة النشر لتشغيل ClientInspector كل يوم لجمع المخزون. يمكنك تشغيل سكريبت ClientInspector باستخدام أداة النشر المفضلة لديك. يتم توفير سكريبتات لـ Microsoft Intune و ConfigMgr.
كيفية النشر باستخدام Microsoft Intune؟
ستقوم بتشغيل سكريبت المخزون باستخدام 'الإصلاحات الاستباقية' في Microsoft Intune.
  1. قم بتنزيل سكريبت الكشف ClientInspector_Detection.ps1 (انقر بزر الماوس الأيمن واختر 'حفظ الرابط باسم')

  2. افتح الملف باستخدام المحرر المفضل لديك. قم بتعديل التكرار لعدد المرات التي تريد تشغيل المخزون فيها```js ##################################

VARIABLES

##################################

root@kitploit:~
$RunEveryHours    = 8
$LastRun_RegPath  = "HKLM:\SOFTWARE\ClientInspector"
$LastRun_RegKey   = "ClientInSpector_System"
root@kitploit:~
3. الآن نحتاج إلى إنشاء مهمة التصحيح. انتقل إلى بوابة Microsoft Intune -> التقارير -> تحليل نقطة النهاية --> التصحيح الاستباقي - وأنشئ حزمة سكريبت كما هو موضح أدناه

ملاحظة: بالنسبة لسكريبت التصحيح، استخدم ملف **ClientInspector.ps1**

![Flow](https://assets.kitploit.com/production/public/readmes/6097/c5d24f8afca4130a3a58414028120540526722b92ed5c9ae6cb029c605baf657.png)

![Flow](https://assets.kitploit.com/production/public/readmes/6097/ea200a01c92a84d801e03439891428130160b4dd8bbb11e6ecac4b2f68de18d1.png)


### قيود Intune

ملاحظة: لدى Intune حد أقصى لحجم سكريبت التصحيح هو 200 كيلوبايت.**  

![Intune-error](https://assets.kitploit.com/production/public/readmes/6097/7488505e7c4a5e3fa31e1007bf435b89aeb5ebf4fb1c1dbf133835082cce33e6.png)


في حال الوصول إلى هذا الحد، أقترح تقسيم السكريبت إلى سكريبتين.

![Intune-split](https://assets.kitploit.com/production/public/readmes/6097/3ddc7edb1bdf2a492928a0dad8487996a9166878fba20a0403d347a895fe69a3.png)

![Intune-split](https://assets.kitploit.com/production/public/readmes/6097/36f29366fa4fbf0f878a569489c59100601f5a27f8d015373497b9fd387309ec.png)

تذكر تضمين القسم الرأسي بما في ذلك قسم UserLoggedOn كرأس للملف الثاني. يتم استخدام UserLoggedOn لعرض المستخدم الذي قام بتسجيل الدخول.

لقد أعددت [نموذج إعداد سكريبت](https://github.com/KnudsenMorten/ClientInspectorV2/tree/main/Sample%20intune%20setup%20if%20file%20size%20is%20more%20than%20200%20Kb)، حيث يمكنك رؤية كيفية فصلها. ملاحظة: الكود غير محدث في هذه السكريبتات، لذا تأكد من أخذ الأقسام من ملف ClientInspector الرئيسي.

بشكل أساسي، الهيكل كالتالي:

الملف 1 يحتوي على الرأس + UserLoggedOn (القسم 1) + الأقسام 2-9 + يكتب علامة تحقق إلى HKLM\Software\ClientInspector\ClientInspector_System_1  

الملف 2 يحتوي على الرأس + UserLoggedOn (القسم 1) + الأقسام 10-18 + يكتب علامة تحقق إلى HKLM\Software\ClientInspector\ClientInspector_System_2  


![Flow](https://assets.kitploit.com/production/public/readmes/6097/37639a721b2d45fae907e177c6cb90ea32151f1ab8bdb1262e8e2bed0f8ec354.png)

![Flow](https://assets.kitploit.com/production/public/readmes/6097/96d02fdeaf59594c29e9755b0033557a3594e33b6bf61b92fa38edebd4c5b84d.png)

![Flow](https://assets.kitploit.com/production/public/readmes/6097/070c7a1431ad3899d496cc333224c8ff58b35d523ba7c77e11ba151501039d73.png)


</details>


<details>
  <summary>كيفية النشر باستخدام ConfigMgr (أو أي أداة أخرى تشغل ملف CMD)؟</summary>
  
<br>
ستقوم بتشغيل سكريبت الجرد باستخدام حزمة + نشر تقليدية
    
1. [تحميل ملف CMD ClientInspector.cmd](https://github.com/KnudsenMorten/ClientInspectorV2/raw/main/ConfigMgr/ClientInspector.cmd) (انقر بزر الماوس الأيمن واختر 'حفظ الرابط باسم')

2. قم بإنشاء هيكل مصدري في دليل مصدر حزمة ConfigMgr الخاص بك، على سبيل المثال اسمه ClientInspector.

3. انسخ الملفين المطلوبين **ClientInspector.cmd** و **ClientInspector.ps1** إلى الدليل

4. قم بإنشاء حزمة - ووجه الحزمة لتشغيل **ClientInspector.cmd**

5. قم بإنشاء نشر

</details>

<br>

# التبعيات

## وحدة PowerShell AzLogDcringestPS - التي بنيتها أنا (Morten Knudsen)

يتطلب ClientInspector وحدة PowerShell، **AzLogDcrIngestPS**

الميزات الأساسية لوحدة PowerShell **AzLogDcrIngestPS** تشمل:
* إنشاء/تحديث DCRs والجداول تلقائيًا - بناءً على مخطط الكائن المصدر
* التحقق من صحة المخطط لمشكلات اصطلاح التسمية. إذا تم العثور عليها، ستقوم بتخفيف المشكلات
* تحديث مخطط DCRs والجداول، في حالة تغير هيكل الكائن المصدر
* الإصلاح التلقائي في حالة حدوث خطأ في DCR أو جدول
* يمكن إزالة البيانات من الكائن المصدر، إذا كانت هناك أعمدة من البيانات لا ترغب في إرسالها
* يمكن تحويل الكائنات المصدر بناءً على كائنات CIM أو PS إلى PSCustomObjects/مصفوفة
* يمكن إضافة معلومات ذات صلة إلى كل سجل مثل UserLoggedOn، Computer، CollectionTime

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

[AzLogDcrIngestPS (Github)](https://github.com/KnudsenMorten/AzLogDcrIngestPS)

[AzLogDcrIngestPS (Powershell Gallery)](https://www.powershellgallery.com/packages/AzLogDcrIngestPS)

[AzLogDcrIngestPSLogHub (Github)](https://github.com/KnudsenMorten/AzLogDcrIngestPSLogHub)

<br>

## وحدات PowerShell من طرف ثالث
أفضل استرداد معلومات تحديثات Windows باستخدام وحدة PowerShell المعروفة، PSWindowsUpdate.

|اسم الوحدة|الغرض|مزيد من المعلومات|الإسناد|
|:---------|:------|:--------|:-----|
|NuGet|موفر حزم شائع يستخدم لنشر العديد من وحدات PowerShell بما في ذلك AzLogDcrIngestPS<br><br>سيتم تثبيت موفر الحزم تلقائيًا على الكمبيوتر عند تشغيل السكريبت|[الرابط](https://www.nuget.org/packages)|
|PSWindowsUpdate|جمع معلومات تحديثات Windows (التحديثات المعلقة، التحديثات المثبتة، إلخ.)<br><br>سيتم تثبيت الوحدة تلقائيًا على الكمبيوتر عند تشغيل السكريبت|[الرابط](https://www.powershellgallery.com/packages/PSWindowsUpdate)|Michal Gajda

<br>

# تشغيل ClientInspector.ps1 - 3 أوضاع
يدعم ClientInspector 3 طرق لتثبيت/تحديث/استيراد وحدة PowerShell المطلوبة: **Download**، **PsGallery**، **LocalPath**

افتراضيًا، سيقوم بتحميل أحدث إصدار من PsGallery إلى نطاق المستخدم الحالي.

[فيديو 3m 19s - تشغيل ClientInspector باستخدام سطر الأوامر (الوضع العادي)](https://youtu.be/4kA4BE0zJ9g)  

## .\ClientInspector.ps1 -function:LocalPath
سيبحث ClientInspector عن ملف **AzLogDcrIngest.psm1** في الدليل الذي سيعمل منه السكريبت.
إذا كان ملف AzLogDcrIngest.psm1 مفقودًا، سينتهي السكريبت - وإلا فسيقوم باستيراد الوحدة.

مثال```
.\ClientInspector.ps1 -verbose:$false -function:localpath

ClientInspector | Inventory of Operational & Security-related information
Developed by Morten Knudsen, Microsoft MVP - for free community use

Using AzLogDcrIngestPS module from local path D:\scripts\ClientInspectorV2
تنزيل الأداة

Validating/fixing schema data structure of source data

$DataVariable = ValidateFix-AzLogAnalyticsTableSchemaColumnNames -Data $DataVariable -Verbose:$Verbose

Aligning data structure with schema (requirement for DCR)

$DataVariable = Build-DataArrayToAlignWithSchema -Data $DataVariable -Verbose:$Verbose

root@kitploit:~
يمكنك التحقق من الكائن المصدر بتشغيل هذا الأمر````
# Get insight about the schema structure of an object BEFORE changes. Command is only needed to verify columns in schema
Get-ObjectSchemaAsArray -Data $DataVariable -Verbose:$Verbose

Office

Office

Office

WU

WU

WU

Winfw

  1. ابدأ تشغيل PowerShell كمسؤول محلي

  2. ابدأ البرنامج النصي باستخدام هذا الأمر```js C:\ClientInspector\ClientInspector.ps1 -verbose:$true

root@kitploit:~
4. سيعمل ClientInspector لمدة 10-20 دقيقة وسينشئ الجداول الضرورية وقواعد Data Collection Rules - بناءً على الهيكل الفعلي في بيئتك. يرجى مراجعة النتائج على الشاشة والبحث عن أي أخطاء (باللون الأحمر)

5. عندما يبدو كل شيء جيدًا، أعد تشغيل السكريبت وسيعمل بشكل أسرع بكثير. تحقق من وصول البيانات باستخدام استعلامات Kusto في الجداول المختلفة. ملاحظة: قد يستغرق التحميل الأول للبيانات حوالي 10-15 دقيقة، حيث يجب إنشاء خط الأنابيب في الخلفية

6. كآخر تغيير، نحتاج إلى تغيير معلمتين في المعلمات لإخبار ClientInspector بإجراء تغييرات المخطط فقط عند التشغيل من الجهاز المرجعي.```js
$AzLogDcrTableCreateFromReferenceMachine    = @("<<MyReferenceMachineComputerName>>")   # sample @("ComputerName")
$AzLogDcrTableCreateFromAnyMachine          = $false    # important so changes can only happen on reference machine
  1. أنت الآن جاهز لنشره إلى مجموعة الاختبار الخاصة بك

.\ClientInspector.ps1 -function:Download

سيقوم ClientInspector بتنزيل أحدث إصدار من مستودع Github الخاص بي وتخزينه في المسار المحلي في كل مرة يتم تشغيله (حوالي 300 كيلوبايت)

مثال``` .\ClientInspector.ps1 -verbose:$false -function:download

ClientInspector | Inventory of Operational & Security-related information Developed by Morten Knudsen, Microsoft MVP - for free community use

Downloading latest version of module AzLogDcrIngestPS from https://github.com/KnudsenMorten/CientInspectorV2 into local path D:\scripts\ClientInspectorV2

root@kitploit:~
## .\ClientInspector.ps1 -function:PsGallery -scope [AllUsers|CurrentUser]
تتطلب هذه المعلمة معلمة أخرى: -scope [AllUsers | CurrentUser]

سيتحقق ClientInspector مما إذا كانت الوحدة مثبتة في النطاق المختار.
إذا لم تكن مثبتة، فسيقوم تلقائيًا بتنزيل أحدث إصدار من Powershell Gallery واستيراد الوحدة.
إذا كان العميل يشغل أحدث إصدار، فسيستمر.

مثال```
.\ClientInspector.ps1 -verbose:$false -function:PSGallery -scope:CurrentUser

ClientInspector | Inventory of Operational & Security-related information
Developed by Morten Knudsen, Microsoft MVP - for free community use

Powershell module was not found !
Installing in scope currentuser .... Please Wait !

INPUT:``` .\ClientInspector.ps1 -verbose:$false -function:PsGallery -scope:currentuser

ClientInspector | Inventory of Operational & Security-related information Developed by Morten Knudsen, Microsoft MVP - for free community use

Checking latest version at PsGallery for AzLogDcrIngestPS module OK - Running latest version

root@kitploit:~
</details>

<br>

## نموذج إخراج ClientInspector
[فيديو 3 دقائق و19 ثانية - تشغيل ClientInspector باستخدام سطر الأوامر (الوضع العادي)](https://youtu.be/4kA4BE0zJ9g)  

<br>

# الأمان
## توقيع الكود
كل من **ClientInspector.ps1-file** و **AzLogDcrIngestPS module (AzLogDcrIngest.psm1)** موقعة بشهادة توقيع الكود الخاصة بي (2LINKIT - شركتي). بهذه الطريقة يمكنك تشغيله إذا كنت تتطلب توقيع البرامج النصية. بالطبع يمكنك أيضًا اختيار توقيعه بشهادة توقيع الكود الداخلية الخاصة بك.

![موقّع](https://assets.kitploit.com/production/public/readmes/6097/95ae9fae064341feae5467ba04c909e3bab84393eb7070a304d9d9e6fd184499.png)

يرجى [تنزيل شهادة المفتاح العام](https://github.com/KnudsenMorten/ClientInspectorV2/raw/main/Trusted_Publisher_Certificate/2LINKIT-TrustedPublisher.cer) ووضعها في حاوية 'الناشر الموثوق' الخاصة بك للثقة في الناشر (2LINKIT - شركتي). يمكنك نشر ذلك باستخدام Intune أو نهج المجموعة.

![الناشر الموثوق](https://assets.kitploit.com/production/public/readmes/6097/b02285397783a3495f5d1418ed716fa450b677117dd1754875354779568b0b47.png)  
![الناشر الموثوق](https://assets.kitploit.com/production/public/readmes/6097/740ae59eff117b8e59d56a7274440a991b7c5ceddd486894160d0248826084b2.png)  
![الناشر الموثوق](https://assets.kitploit.com/production/public/readmes/6097/47d1eb6b7da9ff5a341b8486c7b4bc7532b0b8ef3d05e7b710d495e183929279.png)  

### نشر Intune لا يتطلب وجود الناشر الموثوق
بشكل افتراضي، سيقوم Intune بعمل BYPASS عند تشغيل البرامج النصية للعلاج.

## الهيكل
يتم تقسيم أمان **ClientInspector** إلى 4 طبقات: **data-in** و **data-upload** (إرسال إلى الخلفية) و **data-view** (لوحات البيانات) - و **schema-management**

| المرحلة | تنفيذ الأمان | التفويضات / الأذونات |
|:------|:------------------------|:------------------------|
|Data-in (collection)|يتم التحكم في هذه المرحلة بواسطة الطريقة التي تختارها لإجراء التجميع الفعلي (Intune أو ConfigMg أو طرف ثالث آخر)|يحتاج البرنامج النصي إلى التشغيل كمسؤول محلي (سياق النظام) ليكون قادرًا على جمع البيانات الأساسية من الأجهزة وWindows
|Data-upload|يتم تنفيذ المصادقة لواجهة برمجة تطبيقات إدخال السجلات في DCE، والتي تستخدم مصادقة Azure Resource Manager القياسية.<br><br>الإستراتيجية الشائعة هي استخدام معرف التطبيق ومفتاح التطبيق وهو أيضًا الطريقة المستخدمة في ClientInspector.<br><br>يتم تخزين Azure AppId وSecret في رأس ClientInspector لغرض البساطة<br><br>من الممكن أيضًا استخدام Azure Keyvault لتخزين AppId وSecret|[التفاصيل مغطاة في ClientInspectV2-DeploymentKit](https://github.com/KnudsenMorten/ClientInspectorV2-DeploymentKit#security-1)
|Data-view|أذونات Azure RCAC|يمنح الوصول إلى Azure LogAnalytics و Azure Workbooks و Azure Dashboards|
|Schema-management|الطريقة 1: Azure RBAC (موصى بها)<br><br>الطريقة 2: تطبيق Azure مع secret أو شهادة|[التفاصيل مغطاة في ClientInSpectorV2-DeploymentKit](https://github.com/KnudsenMorten/ClientInspectorV2-DeploymentKit#azure-rbac-security-adjustment-separation-of-permissions-between-log-ingestion-and-tabledcr-management)

<br>

# تخطيط مجموعة بيانات ClientInspector
تم بناء كل من مجموعات البيانات (bios, applications, bitlocker, إلخ) بنفس الهيكل ذي الأربع مراحل:

## المرحلة 1/4 - المتغيرات (التسمية - أين يتم إرسال البيانات)```
#-------------------------------------------------------------------------------------------
# Variables
#-------------------------------------------------------------------------------------------
	
$TableName  = 'InvClientComputerInfoSystemV2'   # must not contain _CL
$DcrName    = "dcr-" + $AzDcrPrefixClient + "-" + $TableName + "_CL"

المرحلة 2/4 - جمع البيانات```

#-------------------------------------------------------------------------------------------

Collecting data (in)

#-------------------------------------------------------------------------------------------

Write-Output "" Write-Output "Collecting Computer system information ... Please Wait !"

$DataVariable = Get-CimInstance -ClassName Win32_ComputerSystem

root@kitploit:~
## المرحلة 3/4 - معالجة البيانات (تأكد من أن البيانات بالصيغة الصحيحة وإزالة أي "ضوضاء" وإضافة المعلومات ذات الصلة)```
#-------------------------------------------------------------------------------------------
# Preparing data structure
#-------------------------------------------------------------------------------------------

# convert CIM array to PSCustomObject and remove CIM class information
$DataVariable = Convert-CimArrayToObjectFixStructure -data $DataVariable -Verbose:$Verbose

# add CollectionTime to existing array
$DataVariable = Add-CollectionTimeToAllEntriesInArray -Data $DataVariable -Verbose:$Verbose

# add Computer & UserLoggedOn info to existing array
$DataVariable = Add-ColumnDataToAllEntriesInArray -Data $DataVariable -Column1Name Computer -Column1Data $Env:ComputerName  -Column2Name UserLoggedOn -Column2Data $UserLoggedOn

# Validating/fixing schema data structure of source data
$DataVariable = ValidateFix-AzLogAnalyticsTableSchemaColumnNames -Data $DataVariable -Verbose:$Verbose

# Aligning data structure with schema (requirement for DCR)
$DataVariable = Build-DataArrayToAlignWithSchema -Data $DataVariable -Verbose:$Verbose

المرحلة 4/4 - إخراج البيانات (إرسال إلى LogAnalytics) - وظائف مجمعة```

#-------------------------------------------------------------------------------------------

Create/Update Schema for LogAnalytics Table & Data Collection Rule schema

#-------------------------------------------------------------------------------------------

CheckCreateUpdate-TableDcr-Structure -AzLogWorkspaceResourceId $LogAnalyticsWorkspaceResourceId -SchemaMode Merge -AzAppId $LogIngestAppId -AzAppSecret $LogIngestAppSecret -TenantId $TenantId -Verbose:$Verbose -DceName $DceName -DcrName $DcrName -TableName $TableName -Data $DataVariable -LogIngestServicePricipleObjectId $AzDcrLogIngestServicePrincipalObjectId -AzDcrSetLogIngestApiAppPermissionsDcrLevel $AzDcrSetLogIngestApiAppPermissionsDcrLevel -AzLogDcrTableCreateFromAnyMachine $AzLogDcrTableCreateFromAnyMachine -AzLogDcrTableCreateFromReferenceMachine $AzLogDcrTableCreateFromReferenceMachine

#-----------------------------------------------------------------------------------------------

Upload data to LogAnalytics using DCR / DCE / Log Ingestion API

#-----------------------------------------------------------------------------------------------

Post-AzLogAnalyticsLogIngestCustomLogDcrDce-Output -DceName $DceName -DcrName $DcrName -Data $DataVariable -TableName $TableName ` -AzAppId $LogIngestAppId -AzAppSecret $LogIngestAppSecret -TenantId $TenantId -Verbose:$Verbose

root@kitploit:~
<br>

**نصيحة: خطأ 513 - الكيان كبير جدًا**  
بشكل افتراضي، سيرسل ClientInspector البيانات على دفعات بناءً على متوسط الحجم المحسوب لكل سجل. في حال كان مجموعة السجلات الخاصة بك ذات أحجام مختلفة، قد تتلقى خطأ 513.

السبب هو أنك تتجاوز حد 1 ميغابايت لكل تحميل (حد Azure Pipeline). ترغب Microsoft في استلام العديد من الأجزاء الصغيرة من البيانات، لأن هذه بيئة مشتركة. لاحظت هذه المشكلة عند استرداد قائمة جميع التطبيقات المثبتة. على ما يبدو، تخزن التطبيقات معلومات بأحجام متفاوتة جدًا.

يمكنك التخفيف من هذه المشكلة بإضافة المعامل **-BatchAmount <عدد السجلات المرسلة لكل دفعة>** إلى الأمر Post-command. إذا كنت تريد التأكد، اضبطه على 1```
Post-AzLogAnalyticsLogIngestCustomLogDcrDce-Output -DceName $DceName `
                                                   -DcrName $DcrName `
                                                   -Data $DataVariable `
                                                   -TableName $TableName `
                                                   -AzAppId $LogIngestAppId `
                                                   -AzAppSecret $LogIngestAppSecret `
                                                   -TenantId $TenantId `
                                                   -BatchAmount 1 `
                                                   -Verbose:$Verbose `
												   

المرحلة 4/4 "تحت الغطاء" - إخراج البيانات (إرسال إلى LogAnalytics)```

#-----------------------------------------------------------------------------------------------

Check if table and DCR exist - or schema must be updated due to source object schema changes

#-----------------------------------------------------------------------------------------------

Get insight about the schema structure

$Schema = Get-ObjectSchemaAsArray -Data $Data $StructureCheck = Get-AzLogAnalyticsTableAzDataCollectionRuleStatus -AzLogWorkspaceResourceId $AzLogWorkspaceResourceId -TableName $TableName -DcrName $DcrName -SchemaSourceObject $Schema -SchemaMode $SchemaMode -AzAppId $AzAppId -AzAppSecret $AzAppSecret -TenantId $TenantId ` -Verbose:$Verbose

#-----------------------------------------------------------------------------------------------

Structure check = $true -> Create/update table & DCR with necessary schema

#-----------------------------------------------------------------------------------------------

build schema to be used for LogAnalytics Table

$Schema = Get-ObjectSchemaAsHash -Data $Data -ReturnType Table -Verbose:$Verbose

CreateUpdate-AzLogAnalyticsCustomLogTableDcr -AzLogWorkspaceResourceId $AzLogWorkspaceResourceId -SchemaSourceObject $Schema -SchemaMode $SchemaMode -TableName $TableName -AzAppId $AzAppId -AzAppSecret $AzAppSecret -TenantId $TenantId -Verbose:$Verbose

build schema to be used for DCR

$Schema = Get-ObjectSchemaAsHash -Data $Data -ReturnType DCR

CreateUpdate-AzDataCollectionRuleLogIngestCustomLog -AzLogWorkspaceResourceId $AzLogWorkspaceResourceId -SchemaSourceObject $Schema -SchemaMode $SchemaMode -DceName $DceName -DcrName $DcrName -TableName $TableName -LogIngestServicePricipleObjectId $LogIngestServicePricipleObjectId -AzDcrSetLogIngestApiAppPermissionsDcrLevel $AzDcrSetLogIngestApiAppPermissionsDcrLevel -AzAppId $AzAppId -AzAppSecret $AzAppSecret -TenantId $TenantId -Verbose:$Verbose

$AzDcrDceDetails = Get-AzDcrDceDetails -DcrName $DcrName -DceName $DceName -AzAppId $AzAppId -AzAppSecret $AzAppSecret -TenantId $TenantId ` -Verbose:$Verbose

Post-AzLogAnalyticsLogIngestCustomLogDcrDce -DceUri $AzDcrDceDetails[2] -DcrImmutableId $AzDcrDceDetails[6] -TableName $TableName -DcrStream $AzDcrDceDetails[7] -Data $Data -BatchAmount $BatchAmount -AzAppId $AzAppId -AzAppSecret $AzAppSecret -TenantId $TenantId ` -Verbose:$Verbose

root@kitploit:~
<br>

# Verbose-mode & المزيد من المساعدة
إذا كنت تريد الحصول على معلومات أكثر تفصيلاً حول ما يحدث، يمكنك تمكين الوضع المفصل (-verbose:$true)```
.\ClientInspector.ps1 -verbose:$true -function:localpath

إذا كنت تفضل الاختبار باستخدام Powershell ISE، يمكنك أيضًا تمكين الوضع المفصل باستخدام المتغير $Verbose``` $Verbose = $false # can be $true or $false

root@kitploit:~
إذا كنت ترغب في الحصول على مساعدة حول الصيغة والأمثلة من الوحدة النمطية AzLogDcrLogIngestPS، يمكنك كتابة
get-module```
PS  get-command -module AzLogDcrIngestPS

CommandType     Name                                               Version    Source                                                                         
-----------     ----                                               -------    ------                                                                         
Function        Add-CollectionTimeToAllEntriesInArray              1.1.17     AzLogDcrIngestPS                                                               
Function        Add-ColumnDataToAllEntriesInArray                  1.1.17     AzLogDcrIngestPS                                                               
Function        Build-DataArrayToAlignWithSchema                   1.1.17     AzLogDcrIngestPS                                                               
Function        CheckCreateUpdate-TableDcr-Structure               1.1.17     AzLogDcrIngestPS                                                               
Function        Convert-CimArrayToObjectFixStructure               1.1.17     AzLogDcrIngestPS                                                               
Function        Convert-PSArrayToObjectFixStructure                1.1.17     AzLogDcrIngestPS                                                               
Function        CreateUpdate-AzDataCollectionRuleLogIngestCusto... 1.1.17     AzLogDcrIngestPS                                                               
Function        CreateUpdate-AzLogAnalyticsCustomLogTableDcr       1.1.17     AzLogDcrIngestPS                                                               
Function        Delete-AzDataCollectionRules                       1.1.17     AzLogDcrIngestPS                                                               
Function        Delete-AzLogAnalyticsCustomLogTables               1.1.17     AzLogDcrIngestPS                                                               
Function        Filter-ObjectExcludeProperty                       1.1.17     AzLogDcrIngestPS                                                               
Function        Get-AzAccessTokenManagement                        1.1.17     AzLogDcrIngestPS                                                               
Function        Get-AzDceListAll                                   1.1.17     AzLogDcrIngestPS                                                               
Function        Get-AzDcrDceDetails                                1.1.17     AzLogDcrIngestPS                                                               
Function        Get-AzDataCollectionRuleTransformKql               1.1.17     AzLogDcrIngestPS                                                               
Function        Get-AzDcrListAll                                   1.1.17     AzLogDcrIngestPS                                                               
Function        Get-AzLogAnalyticsTableAzDataCollectionRuleStatus  1.1.17     AzLogDcrIngestPS                                                               
Function        Get-ObjectSchemaAsArray                            1.1.17     AzLogDcrIngestPS                                                               
Function        Get-ObjectSchemaAsHash                             1.1.17     AzLogDcrIngestPS                                                               
Function        Post-AzLogAnalyticsLogIngestCustomLogDcrDce        1.1.17     AzLogDcrIngestPS                                                               
Function        Post-AzLogAnalyticsLogIngestCustomLogDcrDce-Output 1.1.17     AzLogDcrIngestPS                                                               
Function        Update-AzDataCollectionRuleDceEndpoint             1.1.17     AzLogDcrIngestPS                                                               
Function        Update-AzDataCollectionRuleResetTransformKqlDef... 1.1.17     AzLogDcrIngestPS                                                               
Function        Update-AzDataCollectionRuleTransformKql            1.1.17     AzLogDcrIngestPS                                                               
Function        ValidateFix-AzLogAnalyticsTableSchemaColumnNames   1.1.17     AzLogDcrIngestPS                                                               

الحصول على المساعدة حول أمر cmdlet محدد - get-help Add-CollectionTimeToAllEntriesInArray -full``` get-help Add-CollectionTimeToAllEntriesInArray -full

NAME Add-CollectionTimeToAllEntriesInArray

SYNOPSIS Add property CollectionTime (based on current time) to all entries on the object

SYNTAX Add-CollectionTimeToAllEntriesInArray [-Data] []

DESCRIPTION Gives capability to do proper searching in queries to find latest set of records with same collection time Time Generated cannot be used when you are sending data in batches, as TimeGenerated will change An example where this is important is a complete list of applications for a computer. We want all applications to show up when queriying for the latest data

PARAMETERS -Data Object to modify

root@kitploit:~
    Required?                    true
    Position?                    1
    Default value                
    Accept pipeline input?       false
    Accept wildcard characters?  false
    
<CommonParameters>
    This cmdlet supports the common parameters: Verbose, Debug,
    ErrorAction, ErrorVariable, WarningAction, WarningVariable,
    OutBuffer, PipelineVariable, and OutVariable. For more information, see 
    about_CommonParameters (https:/go.microsoft.com/fwlink/?LinkID=113216). 

INPUTS None. You cannot pipe objects

OUTPUTS Updated object with CollectionTime

root@kitploit:~
-------------------------- EXAMPLE 1 --------------------------

PS C:\>#-------------------------------------------------------------------------------------------

# Variables
#-------------------------------------------------------------------------------------------
$Verbose                   = $true  # $true or $false

#-------------------------------------------------------------------------------------------
# Collecting data (in)
#-------------------------------------------------------------------------------------------
$DNSName                   = (Get-CimInstance win32_computersystem).DNSHostName +"." + (Get-CimInstance win32_computersystem).Domain
$ComputerName              = (Get-CimInstance win32_computersystem).DNSHostName
[datetime]$CollectionTime  = ( Get-date ([datetime]::Now.ToUniversalTime()) -format "yyyy-MM-ddTHH:mm:ssK" )

$UserLoggedOnRaw           = Get-Process -IncludeUserName -Name explorer | Select-Object UserName -Unique
$UserLoggedOn              = $UserLoggedOnRaw.UserName

$DataVariable = Get-CimInstance -ClassName Win32_Processor | Select-Object -ExcludeProperty "CIM*"

#-------------------------------------------------------------------------------------------
# Preparing data structure
#-------------------------------------------------------------------------------------------
$DataVariable = Convert-CimArrayToObjectFixStructure -data $DataVariable -Verbose:$Verbose
$DataVariable

# add CollectionTime to existing array
$DataVariable = Add-CollectionTimeToAllEntriesInArray -Data $DataVariable -Verbose:$Verbose
$DataVariable

#-------------------------------------------------------------------------------------------
# Output
#-------------------------------------------------------------------------------------------

VERBOSE:   Adding CollectionTime to all entries in array .... please wait !
Caption                                 : Intel64 Family 6 Model 165 Stepping 5
Description                             : Intel64 Family 6 Model 165 Stepping 5
InstallDate                             : 
Name                                    : Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz
Status                                  : OK
Availability                            : 3
ConfigManagerErrorCode                  : 
ConfigManagerUserConfig                 : 
CreationClassName                       : Win32_Processor
DeviceID                                : CPU0
ErrorCleared                            : 
ErrorDescription                        : 
LastErrorCode                           : 
PNPDeviceID                             : 
PowerManagementCapabilities             : 
PowerManagementSupported                : False
StatusInfo                              : 3
SystemCreationClassName                 : Win32_ComputerSystem
SystemName                              : STRV-MOK-DT-02
AddressWidth                            : 64
CurrentClockSpeed                       : 2904
DataWidth                               : 64
Family                                  : 198
LoadPercentage                          : 1
MaxClockSpeed                           : 2904
OtherFamilyDescription                  : 
Role                                    : CPU
Stepping                                : 
UniqueId                                : 
UpgradeMethod                           : 1
Architecture                            : 9
AssetTag                                : To Be Filled By O.E.M.
Characteristics                         : 252
CpuStatus                               : 1
CurrentVoltage                          : 8
ExtClock                                : 100
L2CacheSize                             : 2048
L2CacheSpeed                            : 
L3CacheSize                             : 16384
L3CacheSpeed                            : 0
Level                                   : 6
Manufacturer                            : GenuineIntel
NumberOfCores                           : 8
NumberOfEnabledCore                     : 8
NumberOfLogicalProcessors               : 16
PartNumber                              : To Be Filled By O.E.M.
ProcessorId                             : BFEBFBFF000A0655
ProcessorType                           : 3
Revision                                : 
SecondLevelAddressTranslationExtensions : False
SerialNumber                            : To Be Filled By O.E.M.
SocketDesignation                       : U3E1
ThreadCount                             : 16
Version                                 : 
VirtualizationFirmwareEnabled           : False
VMMonitorModeExtensions                 : False
VoltageCaps                             : 
PSComputerName                          : 
CollectionTime                          : 12-03-2023 16:08:33




RELATED LINKS https://github.com/KnudsenMorten/AzLogDcrIngestPS

root@kitploit:~
<br>

# التكلفة - كم تكلفة تخزين هذه البيانات؟
بيانات من **500** عميل يقومون بجرد ClientInspector **يوميًا** ستكلفك تقريبًا **200 كرونة دانمركية شهريًا / 27 دولارًا أمريكيًا شهريًا**

<br>

# الأخطاء والاكتشافات، يرجى إبلاغي
اليوم، يتم استخدام ClientInspectorV1 على آلاف أجهزة الكمبيوتر (وServerInspectorV1 على آلاف الخوادم)

نظرًا لأن ClientInspectorV2 هو إعادة بناء كاملة من V1 يتم طرحها الآن مع، على سبيل المثال، اصطلاح تسمية جديد، لا يمكنني أن أعدك بعدم العثور على أخطاء.
لكن **يمكنني أن أعدك** بأنني سأصلحها بأسرع ما تسمح به أوقات فراغي. يرجى إرسال بريد إلكتروني إلى [email protected] مع ما تجده.

فكر في عمل fork لموقع Github - أو ترقب التحديثات في لوحات المعلومات/المصنفات أو برنامج ClientInspector النصي. 

علاوة على ذلك، تم بناء ClientInspector لتغطية تصاميم ومنصات مختلفة، ولكن قد يكون لديك تكوينات فريدة لا تغطيها المجموعات أو لوحات المعلومات.
لكن النهج المفتوح يسمح لك بتعديل كل من لوحات المعلومات والمصنفات وبرنامج ClientInspector النصي، بحيث يعمل بنسبة 100% من أجلك. اعتبره عرضًا توضيحيًا للقيام بالمزيد باستخدام تقنيات تسجيل Azure - إنه ليس منتجًا مدفوعًا بدعم على مدار الساعة طوال أيام الأسبوع. إنه مجاني للجميع!

<br>

# الاتصال
إذا كان لديك تعليقات على الحل - أو تريد فقط التواصل معي، فيرجى الاتصال بي عبر هذه القنوات - أحب التواصل:

[Github](https://github.com/KnudsenMorten)

[Twitter](https://twitter.com/knudsenmortendk)

[Blog](https://mortenknudsen.net/)

[LinkedIn](https://www.linkedin.com/in/mortenwaltorpknudsen/)

[Microsoft MVP profile](https://mvp.microsoft.com/en-us/PublicProfile/5005156?fullName=Morten%20Knudsen)

[Sessionize](https://sessionize.com/mortenknudsen/)

[Mail](mailto:[email protected])

<br>

# شكر كبير للأشخاص الرائعين في فرق منتجات Microsoft - أنتم نجوم :smile:
أخيرًا، أود أن أقدم شكرًا كبيرًا لعدد قليل من الأشخاص الذين عملت معهم على بناء وحدة AzLogDcrIngestPS PowerShell وعملي اليومي مع قدرات السجل والعرض في Azure:

|الاسم|الدور|
|:---|:---|
|Ivan Varnitski|مدير برنامج - Azure Pipeline|
|Evgeny Ternovsky|مدير برنامج - Azure Pipeline|
|Nick Kiest|مدير برنامج - Azure Data Collection Rules|
|Oren Salzberg|مدير برنامج - Azure LogAnalytics|
|Guy Wild|كاتب تقني - Azure LogAnalytics|
|John Gardner|مدير برنامج - Azure Workbooks|
|Shikha Jain|مدير برنامج - Azure Workbooks|
|Shayoni Seth|مدير برنامج - Azure Monitor Agent|
|Jeff Wolford|مدير برنامج - Azure Monitor Agent|
|Xema Pathak|مدير برنامج - Azure VMInsight (التكامل مع Azure Monitor Agent)|

![MS-friends](https://assets.kitploit.com/production/public/readmes/6097/654c3844cb0324e2b53e04ebfd758652372ae0820636c3c37adc3f18ab178e8e.jpg)