שימוש ב- WMI כדי לקבוע את מצב ההתקנה של עדכוני Windows
תקציר
השתמש ב- WMI כדי לבדוק אם קיימים עדכונים (ב- KB) המותקנים ב- Windows שבו אתה משתמש כעת.
סביבת הפעלה
סביבת בדיקת תפעול
גירסת Windows |
|
גירסת מסגרת .NET |
|
דרישות המערכת הנדרשות
גירסת Windows |
|
גירסת מסגרת .NET |
|
חומר
מהו KB?
KB משמש גם כקיצור לביטוי "קילובייט" או "לוח מקשים", כך שאני לא חושב שזו מילה המשמשת עבור הציבור הרחב, אך עדכונים כגון תמיכה באבטחה של Windows ותיקוני באגים מכונים לעתים "KB" לאחר שתי האותיות הראשונות של המזהה.
לכל אחד מעדכונים אלה מוקצה מזהה וצוין בתבנית "KBXXXXXXXXX" שבה XXXXXX הוא מספר כלשהו. מספר הספרות אינו קבוע). עם זאת, שים לב שלא כל העדכונים פועלים לפי תבנית זו.
אגב, השם המקורי של "KB" זה הוא "מאגר הידע של Microsoft Knowledge Base" ומתאים למזהה של המאמר הטכני שפורסם על-ידי Microsoft באינטרנט. לדוגמה, אם מדובר בעדכון ל- KB980218, המאמר הטכני המתאים הוא http://support.microsoft.com/?kbid=980218".
תוכניות המחפשות מצב התקנה של KB
למרות שהדוגמאות מתוארות ב- Visual Studio 2010 וב- WPF, ניתן להשתמש בתוכניות לבדיקת KB גם באפליקציות קודמות של Visual Studio, Windows Form ו- console. במאמר זה, נשתמש במכשור ניהול Windows (WMI) כדי לבדוק את התקנת KB.
- מכשור ניהול Windows (מתוך ויקיפדיה)
הוספת הפניות
כדי להשתמש ב- WMI, אתה משתמש במחלקות ניהולObjectSearcher ו- ManagementObject, אך עליך להפנות ל- System.Management .dll כדי להשתמש במחלקות אלה.
עבור פרויקטים של C# , לחץ באמצעות לחצן העכבר הימני על הפניות מסייר הפתרונות ובחר הוסף הפניות.
כאשר תיבת הדו-שיח הוספת הפניה מופיעה, לחץ על ". מתוך הכרטיסייה NET, בחר System.Management ולחץ על הלחצן אישור.
אישור אם "ניהול מערכת" נוסף להפניה לסייר הפתרונות.
אם VB.NET לפתוח את מאפייני הפרוייקט, לחץ על "עיון" מהכרטיסיה משמאל, לחץ על הוסף כפתור בצד ימין. כנ"ל, מוצגת תיבת הדו-שיח הוספת הפניה, לכן בחר "ניהול מערכת" ולחץ על הלחצן אישור.
אם תחזור למסך הקודם ותוסיף "System.Management" לרשימה האמצעית, זה בסדר.
כמו כן, בדוק "System.Management" מהרשימה שלהלן כדי להשמיט תיאורי מרחב שמות בתוכנית שלך.
כמו כן, למרות שזה לא קשור לטיפים המקוריים, דוגמה זו משתמשת במחלקה StringBuilder, ולכן בדקתי גם את מרחב השמות "System.Text". (VB.NET בלבד)
סצנה
המסך המשמש בדוגמה זו הוא מסך פשוט עם לחצן ביצוע כדי לבדוק את מצב ההתקנה של KB ותיבת טקסט המציגה את התוצאות.
אני עושה את זה ב- WPF, אבל אותו מסך ניתן להגדרה בטופס Windows.
תוכנית
C ManagementObjectSearcher
# מוסיף ""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」追加)
להלן הקוד המחפש ומפרט את ה- KB המותקן.
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 הוא איטי, אך העובדה שהוא איטי אינה משתנה, כך שאם אתה מודאג מהשהיה בעת השימוש בו, אני חושב שיש צורך לנקוט באמצעים כגון ביצוע אסינכרוני.