استخدام WMI لتحديد حالة تثبيت تحديثات Windows
ملخص
استخدم WMI للتحقق من وجود تحديثات (بالكيلوبايت) مثبتة على Windows الذي تستخدمه حاليا.
بيئة التشغيل
بيئة فحص التشغيل
إصدار ويندوز |
|
إصدار .NET Framework |
|
متطلبات النظام المطلوبة
إصدار ويندوز |
|
إصدار .NET Framework |
|
مادة
ما هو KB؟
يستخدم KB أيضا كاختصار للتعبير "كيلوبايت" أو "لوحة المفاتيح" ، لذلك لا أعتقد أنها كلمة تستخدم لعامة الناس ، ولكن التحديثات مثل دعم أمان Windows وإصلاحات الأخطاء يشار إليها أحيانا باسم "KB" بعد أول حرفين من المعرف.
يتم تعيين معرف لكل من هذه التحديثات وتحديده بالتنسيق "KBXXXXXXX" حيث XXXXXX هو أي رقم. عدد الأرقام غير ثابت). ومع ذلك، لاحظ أنه لا تتبع جميع التحديثات هذا التنسيق.
بالمناسبة ، الاسم الأصلي لهذا "KB" هو "قاعدة معارف Microsoft" ويطابق معرف المقالة الفنية التي نشرتها Microsoft على الويب. على سبيل المثال ، إذا كان تحديثا ل KB980218 ، فإن المقالة الفنية المقابلة هي http://support.microsoft.com/?kbid=980218".
البرامج التي تبحث عن حالة تثبيت KB
على الرغم من وصف العينات في Visual Studio 2010 و WPF، يمكن أيضا استخدام برامج التحقق من قاعدة المعارف في تطبيقات Visual Studio و Windows Form ووحدة التحكم السابقة. في هذه المقالة، سنستخدم أجهزة إدارة Windows (WMI) للتحقق من تثبيت قاعدة المعارف.
- أجهزة إدارة ويندوز (من ويكيبيديا)
إضافة مراجع
لاستخدام WMI، يمكنك استخدام فئتي ManagementObjectSearcher و ManagementObject، ولكن يجب الرجوع إلى System.Management .dll لاستخدام هذه الفئات.
بالنسبة لمشاريع C#، انقر بزر الماوس الأيمن فوق مراجع من مستكشف الحلول واختر إضافة مراجع.
عندما يظهر مربع الحوار "إضافة مرجع" ، انقر فوق ". من علامة التبويب NET، حدد System.Management وانقر فوق الزر موافق ( OK) .
موافق إذا تمت إضافة "System.Management" إلى مرجع "مستكشف الحلول".
إذا VB.NET فتح خصائص المشروع ، فانقر فوق "استعراض" من علامة التبويب الموجودة على اليسار ، وانقر فوق الزر "إضافة" على اليمين. كما هو موضح أعلاه ، يتم عرض مربع الحوار إضافة مرجع ، لذا حدد "System.Management" وانقر فوق الزر موافق ( OK) .
إذا عدت إلى الشاشة السابقة وأضفت "System.Management" إلى القائمة الوسطى ، فلا بأس بذلك.
أيضا ، تحقق من "System.Management" من القائمة أدناه لحذف أوصاف مساحة الاسم في برنامجك.
أيضا ، على الرغم من أنه لا يرتبط بالنصائح الأصلية ، إلا أن هذا النموذج يستخدم فئة StringBuilder ، لذلك راجعت أيضا مساحة الاسم "System.Text". (VB.NET فقط)
مشهد
الشاشة المستخدمة في هذا النموذج هي شاشة بسيطة مع زر تنفيذ للتحقق من حالة تثبيت KB ومربع نص يعرض النتائج.
أقوم بإنشائه في WPF ، ولكن نفس الشاشة قابلة للتكوين في نموذج Windows.
برنامج
ManagementObjectSearcher
C # يضيف ""using System.Management;
إلى بداية التعليمات البرمجية لتقليل وصف الفئات ومساحات الأسماء الأخرى. في VB.NET ، حددت أنه يجب استيراد مساحة الاسم في خصائص المشروع ، لذلك لا تحتاج إلى كتابة أي شيء خاص ، ولكن إذا لم تكن قد فعلت ذلك ، فأنت بحاجة إلى إضافة ".Imports System.Management
* في كل من C # و VB.NET ، إذا تمت كتابة جميع أسماء الفئات من مساحة اسم مثل "System.Management.ManagementObjectSearcher
" ، فإن المواصفات المذكورة أعلاه ليست ضرورية.
C #
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Management; // 追加 (参照から「.NET」より「System.Management」追加)
فيما يلي التعليمة البرمجية التي تبحث في قاعدة المعارف المثبتة وتدرجها.
C #
this.ResultTextBox.Text = "";
// WMI クエリをセットして管理オブジェクト検索クラスを作成
ManagementObjectSearcher query =
new ManagementObjectSearcher("Select * From Win32_QuickFixEngineering");
// WMI クエリを使用して管理オブジェクトコレクションを取得
ManagementObjectCollection queryCollection = query.Get();
StringBuilder builder = new StringBuilder();
// コレクションから管理オブジェクトを列挙する
// ここでは HotFixID を取得
foreach (ManagementObject mo in queryCollection)
{
builder.AppendLine(mo["HotFixID"].ToString());
}
// 取得した KB 一覧をセット
this.ResultTextBox.Text = builder.ToString();
VB.NET
Me.ResultTextBox.Text = ""
' WMI クエリをセットして管理オブジェクト検索クラスを作成
Dim query As ManagementObjectSearcher = _
New ManagementObjectSearcher("Select * From Win32_QuickFixEngineering")
' WMI クエリを使用して管理オブジェクトコレクションを取得
Dim queryCollection As ManagementObjectCollection = query.Get()
Dim builder As System.Text.StringBuilder = New System.Text.StringBuilder()
' コレクションから管理オブジェクトを列挙する
' ここでは HotFixID を取得
For Each mo As ManagementObject In queryCollection
builder.AppendLine(mo("HotFixID").ToString())
Next
' 取得した KB 一覧をセット
Me.ResultTextBox.Text = builder.ToString()
""ResultTextBox
في السطر الأول هو مربع نص لعرض النتائج التي تم الحصول عليها.
ينشئnew ManagementObjectSearcher
مثيل لفئة بحث الكائن المدار ويعين استعلام WMI كوسيطة. بناء جملة الاستعلام يساوي تقريبا عبارة SQL ، لذا انظر إليها فيما يتعلق ب SQL للحصول على التفاصيل. يمثل "Win32_QuickFixEngineering" تحديثا ينطبق على نظام التشغيل الحالي.
إجراء بحث على استعلام WMI المحدد سابقا في "query.Get()
وإرجاع النتائج ك ".ManagementObjectCollection
نظرا لأن "" يسرد معلومات التحديث ، نحصل على "" في foreach ونكتب معرفا فريدا من المعلمة "HotFixID"ManagementObjectCollection
ManagementObject
نتيجة لذلك.
عند القيام بذلك، يتم سرد معرفات التحديث كما هو موضح في الشكل.
كما ترون عند تشغيله ، فإنه بطيء فقط في التشغيل الأول. بعد المرة الثانية ، يكون الوقت مبكرا بشكل معقول.
ليس من الواضح ما إذا كان System.Management .dll بطيئا في التحميل والمعالجة أو أن تنفيذ استعلام WMI بطيء ، ولكن حقيقة أنه بطيء لا يتغير ، لذلك إذا كنت قلقا بشأن الكمون عند استخدامه ، أعتقد أنه من الضروري اتخاذ تدابير مثل التنفيذ غير المتزامن.