الاستعلام عن سجلات إدارة التحديثات
هام
تم إيقاف إدارة تحديث التنفيذ التلقائي في 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:
في لوحة التحكم،افتح Microsoft Monitoring Agent . في التبويب Azure Log Analytics، يعرض العامل الرسالة التالية: تم توصيل Microsoft Monitoring Agent بنجاح بـ Log Analytics.
افتح سجلات أحداث 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
الخطوات التالية
- للحصول على تفاصيل سجلات Azure Monitor، راجع Azure Monitor logs.
- للحصول على تعليمات حول التنبيهات، راجع تكوين التنبيهات.