الاستعلام عن سجلات إدارة التحديثات

هام

تم إيقاف إدارة تحديث التنفيذ التلقائي في 31 أغسطس 2024 ، ونوصي باستخدام Azure Update Manager. اتبع إرشادات الترحيل من Automation Update Management إلى Azure Update Manager.

بالإضافة إلى التفاصيل التي يتم توفيرها أثناء نشر إدارة التحديث، يمكنك البحث في السجلات المخزنة في مساحة عمل Log Analytics. للبحث في السجلات من حساب التشغيل الآلي الخاص بك، حدد Update management وافتح مساحة عمل Log Analytics المرتبطة بالنشر.

يمكنك أيضًا تخصيص استعلامات السجل أو استخدامها من عملاء مختلفين. راجع وثائق واجهة برمجة التطبيقات للبحث في تحليلات السجل.

سجلات تحديث الاستعلام

تقوم إدارة التحديث بتجميع سجلات Windows وLinux VMs وأنواع البيانات التي تظهر في نتائج البحث في السجل. تصف الأقسام التالية السجلات.

سجلات تحديث الاستعلام

يتم إنشاء سجل بنوع Update يمثل التحديثات المتوفرة وحالة التثبيت الخاصة بها للجهاز. تحتوي هذه السجلات على الخصائص في الجدول التالي:

الخاصية ‏‏الوصف
TenantId معرف فريد يمثل مثيل مؤسستك لمعرف Microsoft Entra.
نظام المصدر نظام المصدر للسجل. القيمة هي OperationsManager.
TimeGenerated تاريخ ووقت إنشاء السجل.
SourceComputerId معرف فريد يمثل الكمبيوتر المصدر.
المسمى الوظيفي عنوان التحديث.
تصنيف تصنيف الموافقة. القيمة هي Updates.
PublishedDate (UTC) التاريخ الذي يكون فيه التحديث جاهزًا للتنزيل والتثبيت من Windows Update.
الكمبيوتر اسم المجال المؤهل بالكامل لجهاز الإبلاغ.
UpdateState الحالة الراهنة للتحديث.
المنتج المنتجات التي ينطبق التحديث عليها.
OSType نوع نظام التشغيل. القيم هي (Windows) أو (Linux).
ProductVersion إصدار التحديث.
قوس المنتج بنية الجهاز القابلة للتطبيق
CVENumbers عدد نقاط الضعف والتعرض الشائعة
BulletinUrl عنوان URL للنشرة
معرف النشرة رقم معرف النشرة.
PackageRepository معلومات المستودع للحزمة.
حزمة الخوادم خطورة التحديث.
اسم نظام التشغيل نوع نظام التشغيل. القيم هي (Windows) أو (Linux).
OSVersion إصدار نظام التشغيل.
OSFullName اسم نظام التشغيل.
SubscriptionId. المعرف الفريد لاشتراك Azure.
ResourceGroup اسم مجموعة الموارد التي ينتمي إليها المورد.
موفر المورد موفر الموراد.
Resource اسم المورد.
ResourceId معرّف فريد للمصدر المرتبط بالسجل.
ResourceType نوع المورد.
ComputerEnvironment البيئة. القيم المحتملة هي Azure أو Non-Azure.
VMUUID المعرف الفريد للجهاز الظاهري.
MG معرّف فريد لمساحة عمل Log Analytics.
ManagementGroupName اسم مجموعة إدارة مدير العمليات أو مساحة عمل Log Analytics.
MSRCSeverity تصنيف خطورة الضعف. القيم هي:
هام
هام
متوسط
منخفض
KBID معرف مقالة قاعدة المعارف لتحديث Windows.
UpdateID المعرف الفريد لتحديث البرنامج.
RevisionNumber رقم المراجعة لمراجعة معينة لتحديث ما.
اختياري صحيح في حالة الموافقة على السجل، أو خطأ بخلاف ذلك.
RebootBehavior سلوك إعادة التشغيل بعد تثبيت / إلغاء تثبيت أحد التحديثات.
MSRCBulletinID رقم معرف نشرة الأمن.
‏‫‏‫موافق عليها صحيح في حالة الموافقة على السجل، أو خطأ بخلاف ذلك.
مصدر الموافقة ينطبق على نظام التشغيل Windows فقط. مصدر الموافقة للسجل. القيمة هي Microsoft Update.
تثبيتTimePredictionSeconds
تثبيتTimeDeviationRangeSeconds
InstallTimeAvailable
نوع نوع السجل. القيمة هي تحديث.

سجل حالة نشر تحديث الاستعلام

يتم إنشاء سجل بنوع UpdateRunProgress يوفر حالة نشر التحديث للنشر المجدول بواسطة الجهاز. تحتوي هذه السجلات على الخصائص في الجدول التالي:

الخاصية ‏‏الوصف
TenantId معرف فريد يمثل مثيل مؤسستك لمعرف Microsoft Entra.
نظام المصدر نظام المصدر للسجل. القيمة هي OperationsManager.
TimeGenerated تاريخ ووقت إنشاء السجل.
MG معرّف فريد لمساحة عمل Log Analytics.
ManagementGroupName اسم مجموعة إدارة العمليات أو مساحة عمل سجل التحليلات.
SourceComputerId معرف فريد يمثل الكمبيوتر المصدر.
KBID معرف مقالة قاعدة المعارف لتحديث Windows.
UpdateID المعرف الفريد لتحديث البرنامج.
SucceededOnRetry تشير القيمة إلى ما إذا كان تنفيذ التحديث قد فشل في المحاولة الأولى والعملية الحالية هي محاولة إعادة المحاولة.
ErrorResult يتم إنشاء رمز خطأ Windows Update في حالة فشل تثبيت أحد التحديثات.
UpdateRunName اسم جدول التحديث.
InstallationStatus حالات التثبيت المحتملة لأحد التحديثات على جهاز الكمبيوتر العميل،
NotStarted -لم يتم تفعيل المهمة بعد
Failed - بدأت المهمة ولكنها فشلت مع استثناء.
InProgress - قيد التقدم.
MaintenanceWindowExceeded - إذا بقي التنفيذ ولكن تم الوصول إلى الفاصل الزمني لنافذة الصيانة.
Succeeded - نجحت الوظيفة.
Install Failed - فشل تثبيت التحديث بنجاح.
NotIncluded - لا يتطابق تصنيف التحديث المقابل مع إدخالات العميل في قائمة تصنيف الإدخال.
Excluded - يدخل المستخدم KBID في قائمة مستبعدة. أثناء التصحيح، إذا تطابق KBID في القائمة المستبعدة مع معرف KB للتحديث الذي اكتشفه النظام، يتم وضع علامة عليه على أنه مستبعد.
الكمبيوتر اسم المجال المؤهل بالكامل لجهاز الإبلاغ.
المسمى الوظيفي عنوان التحديث.
المنتج المنتجات التي ينطبق التحديث عليها.
OSType نوع نظام التشغيل. القيم هي (Windows) أو (Linux).
StartTime (UTC) الوقت الذي تتم فيه جدولة التحديث ليتم تثبيته. هذه الخاصية غير مستخدمة حاليا. راجع TimeGenerated.
وقت الانتهاء (UTC) الوقت الذي انتهت فيه عملية المزامنة. هذه الخاصية غير مستخدمة حاليا. راجع TimeGenerated.
CorrelationId معرّف فريد لتشغيل وظيفة دفتر التشغيل للتحديث.
SubscriptionId. المعرف الفريد لاشتراك Azure.
ResourceGroup اسم مجموعة الموارد التي ينتمي إليها المورد.
موفر المورد موفر الموراد.
Resource اسم المورد.
ResourceId معرّف فريد للمصدر المرتبط بالسجل.
ResourceType نوع المورد.
ComputerEnvironment البيئة. القيم هي Azure أو Non-Azure.
VMUUID المعرف الفريد للجهاز الظاهري.
نوع نوع التحديث. القيمة هي UpdateRunProgress.
_ResourceId معرّف فريد للمصدر المرتبط بالسجل.

سجل ملخص تحديث الاستعلام

يتم إنشاء سجل بنوع UpdateSummary يوفر ملخصًا للتحديث بواسطة الجهاز. تحتوي هذه السجلات على الخصائص في الجدول التالي:

الخاصية ‏‏الوصف
TenantId معرف فريد يمثل مثيل مؤسستك لمعرف Microsoft Entra.
نظام المصدر نظام المصدر للسجل. القيمة هي OpsManager.
TimeGenerated تاريخ ووقت إنشاء السجل.
MG معرّف فريد لمساحة عمل Log Analytics.
ManagementGroupName اسم مجموعة إدارة العمليات أو مساحة عمل سجل التحليلات.
SourceComputerId المعرف الفريد للجهاز الظاهري.
LastUpdateApplied (UTC)
OldestMissingSecurityUpdateInDays إجمالي عدد أيام التحديث الأقدم الذي تم اكتشافه على أنه قابل للتطبيق ولم يتم تثبيته.
OldestMissingSecurityUpdateBucket مُحدد أقدم مجموعة أمان مفقودة. القيم هي:
الأخيرة إذا كانت القيمة أقل من 30 يومًا
قبل 30 يوما
قبل 60 يوما
قبل 90 يوما
قبل 120 يوما
قبل 150 يوما
قبل 180 يوما
أقدم عندما تكون القيمة أكبر من 180 يوما.
WindowsUpdateSetting حالة عامل تحديث Windows. القيم المحتملة هي:
Scheduled installation
Notify before installation
Error returned from unhealthy WUA agent
WindowsUpdateAgentVersion إصدار عامل تحديث Windows.
WSUSServer أخطاء في حالة وجود مشكلة في عامل Windows Update، للمساعدة في استكشاف الأخطاء وإصلاحها.
الكمبيوتر اسم المجال المؤهل بالكامل لجهاز الإبلاغ.
OSVersion إصدار نظام التشغيل.
NETRuntimeVersion إصدار .NET Framework مثبت على كمبيوتر Windows.
CriticalUpdatesMissing عدد التحديثات الهامة القابلة للتطبيق والمفقودة.
SecurityUpdatesMissing عدد تحديثات الأمان المفقودة القابلة للتطبيق.
OtherUpdatesMissing عدد التحديثات التي تم الكشف عنها مفقودة.
TotalUpdatesMissing عدد التحديثات المفقودة القابلة للتطبيق.
RestartPending صحيح إذا كانت إعادة تشغيل معلقة, أو خطأ خلاف ذلك.
SubscriptionId. المعرف الفريد لاشتراك Azure.
ResourceGroup اسم مجموعة الموارد التي تحتوي على المورد.
موفر المورد موفر الموراد.
Resource اسم المورد للسجل.
ResourceId معرّف فريد للمصدر المرتبط بالسجل.
ResourceType نوع المورد.
ComputerEnvironment البيئة. القيم هي Azure أو Non-Azure.
VMUUID المعرف الفريد للجهاز الظاهري.
نوع نوع السجل. القيمة هي UpdateSummary.
_ResourceId معرّف فريد للمصدر المرتبط بالسجل.

نماذج الاستعلامات

توفر الأقسام التالية نماذج استعلامات السجل لسجلات التحديث التي تم تجميعها لإدارة التحديثات.

تأكيد تمكين أجهزة non-Azure لإدارة التحديث

للتأكد من أن الأجهزة المتصلة بشكل مباشر تتواصل مع سجلات Azure Monitor، قم بتشغيل أحد عمليات البحث التالية في السجلات.

Linux

Heartbeat
| where OSType == "Linux" | summarize arg_max(TimeGenerated, *) by SourceComputerId | top 500000 by Computer asc | render table

Windows

Heartbeat
| where OSType == "Windows" | summarize arg_max(TimeGenerated, *) by SourceComputerId | top 500000 by Computer asc | render table

على جهاز كمبيوتر يعمل بنظام Windows، يمكنك مراجعة المعلومات التالية للتحقق من اتصال العامل بسجلات Azure Monitor:

  1. في لوحة التحكم،افتح Microsoft Monitoring Agent . في التبويب Azure Log Analytics، يعرض العامل الرسالة التالية: تم توصيل Microsoft Monitoring Agent بنجاح بـ Log Analytics.

  2. افتح سجلات أحداث Windows. انتقل إلى Application and Services Logs \ Operations Manager وابحث عن معرف الحدث 3000 ومعرف الحدث 5002 من المصدرService Connector. تشير هذه الأحداث إلى أن الحاسوب قد تم تسجيله مع مساحة عمل "تحليلات السجل" وأنه يتلقى ضبط الإعدادات.

إذا لم يتمكن الوكيل من الاتصال بسجلات Azure Monitor وتم تكوين الوكيل للاتصال بالإنترنت من خلال جدار حماية أو خادم وكيل، فتأكد من تكوين جدار الحماية أو الخادم الوكيل بشكل صحيح. لمعرفة كيفية التحقق من تكوين جدار الحماية أو الخادم الوكيل بشكل صحيح، راجع Network configuration for Windows agent أو Network configuration for Linux agent.

إشعار

إذا تم تكوين أنظمة Linux لديك للتواصل مع وكيل أو Log Analytics Gateway وكنت تقوم بتمكين Update Management، فقم بتحديث proxy.conf الأذونات لمنح مجموعة omiuser إذن قراءة على الملف باستخدام الأوامر التالية:

sudo chown omsagent:omiusers /etc/opt/microsoft/omsagent/proxy.conf sudo chmod 644 /etc/opt/microsoft/omsagent/proxy.conf

وكلاء Linux المضافون حديثًا يعرضون حالة التحديث بعد إجراء التقييم. قد تستغرق هذه العملية ما يصل إلى 6 ساعات.

لتأكيد أن مجموعة إدارة العمليات تتواصل مع سجلات Azure Monitor، راجع التحقق من صحة تكامل مدير العمليات مع سجلات Azure Monitor.

استعلامات تقييم Azure VM الفردية (Windows)

استبدل قيمة VMUID بـ VM GUID للجهاز الظاهري الذي تستعلم عنه. يمكنك العثور على VMUID الذي يجب استخدامه عن طريق تشغيل الاستعلام التالي في سجلات Azure Monitor: Update | where Computer == "<machine name>" | summarize by Computer, VMUUID

ملخص التحديثات المفقودة

Update
| where TimeGenerated>ago(14h) and OSType!="Linux" and (Optional==false or Classification has "Critical" or Classification has "Security") and VMUUID=~"b08d5afa-1471-4b52-bd95-a44fea6e4ca8"
| summarize hint.strategy=partitioned arg_max(TimeGenerated, UpdateState, Classification, Approved) by Computer, SourceComputerId, UpdateID
| where UpdateState=~"Needed" and Approved!=false
| summarize by UpdateID, Classification
| summarize allUpdatesCount=count(), criticalUpdatesCount=countif(Classification has "Critical"), securityUpdatesCount=countif(Classification has "Security"), otherUpdatesCount=countif(Classification !has "Critical" and Classification !has "Security")

قائمة التحديثات المفقودة

Update
| where TimeGenerated>ago(14h) and OSType!="Linux" and (Optional==false or Classification has "Critical" or Classification has "Security") and VMUUID=~"8bf1ccc6-b6d3-4a0b-a643-23f346dfdf82"
| summarize hint.strategy=partitioned arg_max(TimeGenerated, UpdateState, Classification, Title, KBID, PublishedDate, Approved) by Computer, SourceComputerId, UpdateID
| where UpdateState=~"Needed" and Approved!=false
| project-away UpdateState, Approved, TimeGenerated
| summarize computersCount=dcount(SourceComputerId, 2), displayName=any(Title), publishedDate=min(PublishedDate), ClassificationWeight=max(iff(Classification has "Critical", 4, iff(Classification has "Security", 2, 1))) by id=strcat(UpdateID, "_", KBID), classification=Classification, InformationId=strcat("KB", KBID), InformationUrl=iff(isnotempty(KBID), strcat("https://support.microsoft.com/kb/", KBID), ""), osType=2
| sort by ClassificationWeight desc, computersCount desc, displayName asc
| extend informationLink=(iff(isnotempty(InformationId) and isnotempty(InformationUrl), toobject(strcat('{ "uri": "', InformationUrl, '", "text": "', InformationId, '", "target": "blank" }')), toobject('')))
| project-away ClassificationWeight, InformationId, InformationUrl

استعلامات تقييم Azure VM الفردية (Linux)

بالنسبة لبعض توزيعات Linux، يوجد endianness عدم تطابق مع قيمة VMUID التي تأتي من Azure Resource Manager وما يتم تخزينه في سجلات Azure Monitor. يتحقق الاستعلام التالي من وجود تطابق في أي من endianness. استبدل قيم VMUID بالتنسيق الكبير والصغير للمعرّف الفريد العمومي لإرجاع النتائج بشكل صحيح. يمكنك العثور على VMUID الذي يجب استخدامه عن طريق تشغيل الاستعلام التالي في سجلات Azure Monitor: Update | where Computer == "<machine name>" | summarize by Computer, VMUUID

ملخص التحديثات المفقودة

Update
| where TimeGenerated>ago(5h) and OSType=="Linux" and (VMUUID=~"625686a0-6d08-4810-aae9-a089e68d4911" or VMUUID=~"a0865662-086d-1048-aae9-a089e68d4911")
| summarize hint.strategy=partitioned arg_max(TimeGenerated, UpdateState, Classification) by Computer, SourceComputerId, Product, ProductArch
| where UpdateState=~"Needed"
| summarize by Product, ProductArch, Classification
| summarize allUpdatesCount=count(), criticalUpdatesCount=countif(Classification has "Critical"), securityUpdatesCount=countif(Classification has "Security"), otherUpdatesCount=countif(Classification !has "Critical" and Classification !has "Security")

قائمة التحديثات المفقودة

Update
| where TimeGenerated>ago(5h) and OSType=="Linux" and (VMUUID=~"625686a0-6d08-4810-aae9-a089e68d4911" or VMUUID=~"a0865662-086d-1048-aae9-a089e68d4911")
| summarize hint.strategy=partitioned arg_max(TimeGenerated, UpdateState, Classification, BulletinUrl, BulletinID) by Computer, SourceComputerId, Product, ProductArch
| where UpdateState=~"Needed"
| project-away UpdateState, TimeGenerated
| summarize computersCount=dcount(SourceComputerId, 2), ClassificationWeight=max(iff(Classification has "Critical", 4, iff(Classification has "Security", 2, 1))) by id=strcat(Product, "_", ProductArch), displayName=Product, productArch=ProductArch, classification=Classification, InformationId=BulletinID, InformationUrl=tostring(split(BulletinUrl, ";", 0)[0]), osType=1
| sort by ClassificationWeight desc, computersCount desc, displayName asc
| extend informationLink=(iff(isnotempty(InformationId) and isnotempty(InformationUrl), toobject(strcat('{ "uri": "', InformationUrl, '", "text": "', InformationId, '", "target": "blank" }')), toobject('')))
| project-away ClassificationWeight, InformationId, InformationUrl

استعلامات تقييم متعددة لـVM

ملخص أجهزة الكمبيوتر

Heartbeat
| where TimeGenerated>ago(12h) and OSType=~"Windows" and notempty(Computer)
| summarize arg_max(TimeGenerated, Solutions) by SourceComputerId
| where Solutions has "updates"
| distinct SourceComputerId
| join kind=leftouter
(
    Update
    | where TimeGenerated>ago(14h) and OSType!="Linux"
    | summarize hint.strategy=partitioned arg_max(TimeGenerated, UpdateState, Approved, Optional, Classification) by SourceComputerId, UpdateID
    | distinct SourceComputerId, Classification, UpdateState, Approved, Optional
    | summarize WorstMissingUpdateSeverity=max(iff(UpdateState=~"Needed" and (Optional==false or Classification has "Critical" or Classification has "Security") and Approved!=false, iff(Classification has "Critical", 4, iff(Classification has "Security", 2, 1)), 0)) by SourceComputerId
)
on SourceComputerId
| extend WorstMissingUpdateSeverity=coalesce(WorstMissingUpdateSeverity, -1)
| summarize computersBySeverity=count() by WorstMissingUpdateSeverity
| union (Heartbeat
| where TimeGenerated>ago(12h) and OSType=="Linux" and notempty(Computer)
| summarize arg_max(TimeGenerated, Solutions) by SourceComputerId
| where Solutions has "updates"
| distinct SourceComputerId
| join kind=leftouter
(
    Update
    | where TimeGenerated>ago(5h) and OSType=="Linux"
    | summarize hint.strategy=partitioned arg_max(TimeGenerated, UpdateState, Classification) by SourceComputerId, Product, ProductArch
    | distinct SourceComputerId, Classification, UpdateState
    | summarize WorstMissingUpdateSeverity=max(iff(UpdateState=~"Needed", iff(Classification has "Critical", 4, iff(Classification has "Security", 2, 1)), 0)) by SourceComputerId
)
on SourceComputerId
| extend WorstMissingUpdateSeverity=coalesce(WorstMissingUpdateSeverity, -1)
| summarize computersBySeverity=count() by WorstMissingUpdateSeverity)
| summarize assessedComputersCount=sumif(computersBySeverity, WorstMissingUpdateSeverity>-1), notAssessedComputersCount=sumif(computersBySeverity, WorstMissingUpdateSeverity==-1), computersNeedCriticalUpdatesCount=sumif(computersBySeverity, WorstMissingUpdateSeverity==4), computersNeedSecurityUpdatesCount=sumif(computersBySeverity, WorstMissingUpdateSeverity==2), computersNeedOtherUpdatesCount=sumif(computersBySeverity, WorstMissingUpdateSeverity==1), upToDateComputersCount=sumif(computersBySeverity, WorstMissingUpdateSeverity==0)
| summarize assessedComputersCount=sum(assessedComputersCount), computersNeedCriticalUpdatesCount=sum(computersNeedCriticalUpdatesCount),  computersNeedSecurityUpdatesCount=sum(computersNeedSecurityUpdatesCount), computersNeedOtherUpdatesCount=sum(computersNeedOtherUpdatesCount), upToDateComputersCount=sum(upToDateComputersCount), notAssessedComputersCount=sum(notAssessedComputersCount)
| extend allComputersCount=assessedComputersCount+notAssessedComputersCount

ملخص التحديثات المفقودة

Update
| where TimeGenerated>ago(5h) and OSType=="Linux" and SourceComputerId in ((Heartbeat
| where TimeGenerated>ago(12h) and OSType=="Linux" and notempty(Computer)
| summarize arg_max(TimeGenerated, Solutions) by SourceComputerId
| where Solutions has "updates"
| distinct SourceComputerId))
| summarize hint.strategy=partitioned arg_max(TimeGenerated, UpdateState, Classification) by Computer, SourceComputerId, Product, ProductArch
| where UpdateState=~"Needed"
| summarize by Product, ProductArch, Classification
| union (Update
| where TimeGenerated>ago(14h) and OSType!="Linux" and (Optional==false or Classification has "Critical" or Classification has "Security") and SourceComputerId in ((Heartbeat
| where TimeGenerated>ago(12h) and OSType=~"Windows" and notempty(Computer)
| summarize arg_max(TimeGenerated, Solutions) by SourceComputerId
| where Solutions has "updates"
| distinct SourceComputerId))
| summarize hint.strategy=partitioned arg_max(TimeGenerated, UpdateState, Classification, Approved) by Computer, SourceComputerId, UpdateID
| where UpdateState=~"Needed" and Approved!=false
| summarize by UpdateID, Classification )
| summarize allUpdatesCount=count(), criticalUpdatesCount=countif(Classification has "Critical"), securityUpdatesCount=countif(Classification has "Security"), otherUpdatesCount=countif(Classification !has "Critical" and Classification !has "Security")

قائمة أجهزة الكمبيوتر

Heartbeat
| where TimeGenerated>ago(12h) and OSType=="Linux" and notempty(Computer)
| summarize arg_max(TimeGenerated, Solutions, Computer, ResourceId, ComputerEnvironment, VMUUID) by SourceComputerId
| where Solutions has "updates"
| extend vmuuId=VMUUID, azureResourceId=ResourceId, osType=1, environment=iff(ComputerEnvironment=~"Azure", 1, 2), scopedToUpdatesSolution=true, lastUpdateAgentSeenTime=""
| join kind=leftouter
(
    Update
    | where TimeGenerated>ago(5h) and OSType=="Linux" and SourceComputerId in ((Heartbeat
    | where TimeGenerated>ago(12h) and OSType=="Linux" and notempty(Computer)
    | summarize arg_max(TimeGenerated, Solutions) by SourceComputerId
    | where Solutions has "updates"
    | distinct SourceComputerId))
    | summarize hint.strategy=partitioned arg_max(TimeGenerated, UpdateState, Classification, Product, Computer, ComputerEnvironment) by SourceComputerId, Product, ProductArch
    | summarize Computer=any(Computer), ComputerEnvironment=any(ComputerEnvironment), missingCriticalUpdatesCount=countif(Classification has "Critical" and UpdateState=~"Needed"), missingSecurityUpdatesCount=countif(Classification has "Security" and UpdateState=~"Needed"), missingOtherUpdatesCount=countif(Classification !has "Critical" and Classification !has "Security" and UpdateState=~"Needed"), lastAssessedTime=max(TimeGenerated), lastUpdateAgentSeenTime="" by SourceComputerId
    | extend compliance=iff(missingCriticalUpdatesCount > 0 or missingSecurityUpdatesCount > 0, 2, 1)
    | extend ComplianceOrder=iff(missingCriticalUpdatesCount > 0 or missingSecurityUpdatesCount > 0 or missingOtherUpdatesCount > 0, 1, 3)
)
on SourceComputerId
| project id=SourceComputerId, displayName=Computer, sourceComputerId=SourceComputerId, scopedToUpdatesSolution=true, missingCriticalUpdatesCount=coalesce(missingCriticalUpdatesCount, -1), missingSecurityUpdatesCount=coalesce(missingSecurityUpdatesCount, -1), missingOtherUpdatesCount=coalesce(missingOtherUpdatesCount, -1), compliance=coalesce(compliance, 4), lastAssessedTime, lastUpdateAgentSeenTime, osType=1, environment=iff(ComputerEnvironment=~"Azure", 1, 2), ComplianceOrder=coalesce(ComplianceOrder, 2)
| union(Heartbeat
| where TimeGenerated>ago(12h) and OSType=~"Windows" and notempty(Computer)
| summarize arg_max(TimeGenerated, Solutions, Computer, ResourceId, ComputerEnvironment, VMUUID) by SourceComputerId
| where Solutions has "updates"
| extend vmuuId=VMUUID, azureResourceId=ResourceId, osType=2, environment=iff(ComputerEnvironment=~"Azure", 1, 2), scopedToUpdatesSolution=true, lastUpdateAgentSeenTime=""
| join kind=leftouter
(
    Update
    | where TimeGenerated>ago(14h) and OSType!="Linux" and SourceComputerId in ((Heartbeat
    | where TimeGenerated>ago(12h) and OSType=~"Windows" and notempty(Computer)
    | summarize arg_max(TimeGenerated, Solutions) by SourceComputerId
    | where Solutions has "updates"
    | distinct SourceComputerId))
    | summarize hint.strategy=partitioned arg_max(TimeGenerated, UpdateState, Classification, Title, Optional, Approved, Computer, ComputerEnvironment) by Computer, SourceComputerId, UpdateID
    | summarize Computer=any(Computer), ComputerEnvironment=any(ComputerEnvironment), missingCriticalUpdatesCount=countif(Classification has "Critical" and UpdateState=~"Needed" and Approved!=false), missingSecurityUpdatesCount=countif(Classification has "Security" and UpdateState=~"Needed" and Approved!=false), missingOtherUpdatesCount=countif(Classification !has "Critical" and Classification !has "Security" and UpdateState=~"Needed" and Optional==false and Approved!=false), lastAssessedTime=max(TimeGenerated), lastUpdateAgentSeenTime="" by SourceComputerId
    | extend compliance=iff(missingCriticalUpdatesCount > 0 or missingSecurityUpdatesCount > 0, 2, 1)
    | extend ComplianceOrder=iff(missingCriticalUpdatesCount > 0 or missingSecurityUpdatesCount > 0 or missingOtherUpdatesCount > 0, 1, 3)
)
on SourceComputerId
| project id=SourceComputerId, displayName=Computer, sourceComputerId=SourceComputerId, scopedToUpdatesSolution=true, missingCriticalUpdatesCount=coalesce(missingCriticalUpdatesCount, -1), missingSecurityUpdatesCount=coalesce(missingSecurityUpdatesCount, -1), missingOtherUpdatesCount=coalesce(missingOtherUpdatesCount, -1), compliance=coalesce(compliance, 4), lastAssessedTime, lastUpdateAgentSeenTime, osType=2, environment=iff(ComputerEnvironment=~"Azure", 1, 2), ComplianceOrder=coalesce(ComplianceOrder, 2) )
| order by ComplianceOrder asc, missingCriticalUpdatesCount desc, missingSecurityUpdatesCount desc, missingOtherUpdatesCount desc, displayName asc
| project-away ComplianceOrder

قائمة التحديثات المفقودة

Update
| where TimeGenerated>ago(5h) and OSType=="Linux" and SourceComputerId in ((Heartbeat
| where TimeGenerated>ago(12h) and OSType=="Linux" and notempty(Computer)
| summarize arg_max(TimeGenerated, Solutions) by SourceComputerId
| where Solutions has "updates"
| distinct SourceComputerId))
| summarize hint.strategy=partitioned arg_max(TimeGenerated, UpdateState, Classification, BulletinUrl, BulletinID) by SourceComputerId, Product, ProductArch
| where UpdateState=~"Needed"
| project-away UpdateState, TimeGenerated
| summarize computersCount=dcount(SourceComputerId, 2), ClassificationWeight=max(iff(Classification has "Critical", 4, iff(Classification has "Security", 2, 1))) by id=strcat(Product, "_", ProductArch), displayName=Product, productArch=ProductArch, classification=Classification, InformationId=BulletinID, InformationUrl=tostring(split(BulletinUrl, ";", 0)[0]), osType=1
| union(Update
| where TimeGenerated>ago(14h) and OSType!="Linux" and (Optional==false or Classification has "Critical" or Classification has "Security") and SourceComputerId in ((Heartbeat
| where TimeGenerated>ago(12h) and OSType=~"Windows" and notempty(Computer)
| summarize arg_max(TimeGenerated, Solutions) by SourceComputerId
| where Solutions has "updates"
| distinct SourceComputerId))
| summarize hint.strategy=partitioned arg_max(TimeGenerated, UpdateState, Classification, Title, KBID, PublishedDate, Approved) by Computer, SourceComputerId, UpdateID
| where UpdateState=~"Needed" and Approved!=false
| project-away UpdateState, Approved, TimeGenerated
| summarize computersCount=dcount(SourceComputerId, 2), displayName=any(Title), publishedDate=min(PublishedDate), ClassificationWeight=max(iff(Classification has "Critical", 4, iff(Classification has "Security", 2, 1))) by id=strcat(UpdateID, "_", KBID), classification=Classification, InformationId=strcat("KB", KBID), InformationUrl=iff(isnotempty(KBID), strcat("https://support.microsoft.com/kb/", KBID), ""), osType=2)
| sort by ClassificationWeight desc, computersCount desc, displayName asc
| extend informationLink=(iff(isnotempty(InformationId) and isnotempty(InformationUrl), toobject(strcat('{ "uri": "', InformationUrl, '", "text": "', InformationId, '", "target": "blank" }')), toobject('')))
| project-away ClassificationWeight, InformationId, InformationUrl

الخطوات التالية