שימוש ב- WMI כדי לקבוע את מצב ההתקנה של עדכוני Windows

עודכן דף :
תאריך יצירת דף :

תקציר

השתמש ב- WMI כדי לבדוק אם קיימים עדכונים (ב- KB) המותקנים ב- Windows שבו אתה משתמש כעת.

KB がインストールされている番号の一覧を表示しています。

סביבת הפעלה

סביבת בדיקת תפעול

גירסת Windows
  • חלונות 7 אולטימטיבי
  • ווינדוס ויסטה עסקים
גירסת מסגרת .NET
  • 3.5 SP1
  • 4

דרישות המערכת הנדרשות

גירסת Windows
  • Windows 98 ואילך (אך לא כולם אושרו)
גירסת מסגרת .NET
  • 1.0
  • 1.1
  • 2.0
  • 3.0
  • 3.5
  • 4.0

חומר

מהו KB?

インストールされている更新プログラム(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.

הוספת הפניות

「参照設定」を右クリックして「参照の追加」を選択

כדי להשתמש ב- WMI, אתה משתמש במחלקות ניהולObjectSearcher ו- ManagementObject, אך עליך להפנות ל- System.Management .dll כדי להשתמש במחלקות אלה.

עבור פרויקטים של C# , לחץ באמצעות לחצן העכבר הימני על הפניות מסייר הפתרונות ובחר הוסף הפניות.

参照の追加ダイアログで System.Management を選択して追加しています

כאשר תיבת הדו-שיח הוספת הפניה מופיעה, לחץ על ". מתוך הכרטיסייה NET, בחר System.Management ולחץ על הלחצן אישור.

אישור אם "ניהול מערכת" נוסף להפניה לסייר הפתרונות.

VB.NET のプロジェクトのプロパティから System.Management の参照を追加しています

אם VB.NET לפתוח את מאפייני הפרוייקט, לחץ על "עיון" מהכרטיסיה משמאל, לחץ על הוסף כפתור בצד ימין. כנ"ל, מוצגת תיבת הדו-שיח הוספת הפניה, לכן בחר "ניהול מערכת" ולחץ על הלחצן אישור.

אם תחזור למסך הקודם ותוסיף "System.Management" לרשימה האמצעית, זה בסדר.

כמו כן, בדוק "System.Management" מהרשימה שלהלן כדי להשמיט תיאורי מרחב שמות בתוכנית שלך.

כמו כן, למרות שזה לא קשור לטיפים המקוריים, דוגמה זו משתמשת במחלקה StringBuilder, ולכן בדקתי גם את מרחב השמות "System.Text". (VB.NET בלבד)

סצנה

KB チェック実行ボタンと検索結果一覧を表示するためのテキストボックスを配置

המסך המשמש בדוגמה זו הוא מסך פשוט עם לחצן ביצוע כדי לבדוק את מצב ההתקנה של 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"ManagementObjectCollectionManagementObject כתוצאה מכך.

作成されたフォルダ

בעת ביצוע פעולה זו, מזהי העדכון מפורטים כפי שמוצג באיור.

כפי שאתה יכול לראות כאשר אתה מפעיל אותו, הוא איטי רק בריצה הראשונה. אחרי הפעם השנייה, זה די מוקדם.

לא ברור אם System.Management.dll איטי לטעינה ולעיבוד או שביצוע שאילתת WMI הוא איטי, אך העובדה שהוא איטי אינה משתנה, כך שאם אתה מודאג מהשהיה בעת השימוש בו, אני חושב שיש צורך לנקוט באמצעים כגון ביצוע אסינכרוני.