Windows güncelleştirmelerinin yükleme durumunu belirlemek için WMI kullanma
özet
Kullanmakta olduğunuz Windows'ta yüklü olan güncelleştirmeleri (KB cinsinden) denetlemek için WMI'yı kullanın.
Çalışma Ortamı
Operasyon kontrol ortamı
Windows Sürümü |
|
.NET Framework Sürümü |
|
Gerekli sistem gereksinimleri
Windows Sürümü |
|
.NET Framework Sürümü |
|
madde
KB nedir?
KB, "kilobayt" veya "klavye" ifadesinin kısaltması olarak da kullanılır, bu nedenle genel halk için kullanılan bir kelime olduğunu sanmıyorum, ancak Windows güvenlik desteği ve hata düzeltmeleri gibi güncellemeler bazen kimliğin ilk iki harfinden sonra "KB" olarak adlandırılır.
Bu güncelleştirmelerin her birine bir kimlik atanır ve XXXXXX'in herhangi bir sayı olduğu "KBXXXXXXX" biçiminde belirtilir. Basamak sayısı sabit değildir). Ancak, tüm güncelleştirmelerin bu biçimi izlemediğini unutmayın.
Bu arada, bu "KB" nin orijinal adı "Microsoft Bilgi Bankası" dır ve Microsoft tarafından Web'de yayımlanan teknik makalenin kimliğiyle eşleşir. Örneğin, KB980218'e yönelik bir güncelleştirmeyse, ilgili teknik makale http://support.microsoft.com/?kbid=980218".
KB yükleme durumunu arayan programlar
Örnekler Visual Studio 2010 ve WPF'de açıklansa da, KB denetimi programları önceki Visual Studio, Windows Form ve konsol uygulamalarında da kullanılabilir. Bu makalede, KB yüklemesini denetlemek için Windows Yönetim Araçları'nı (WMI) kullanacağız.
- Windows Yönetim Araçları (Vikipedi'den)
Referans Ekleme
WMI kullanmak için ManagementObjectSearcher ve ManagementObject sınıflarını kullanırsınız, ancak bu sınıfları kullanmak için System.Management .dll başvurmanız gerekir.
C# projeleri için, Çözüm Gezgini'nden Başvurular'a sağ tıklayın ve Başvuru Ekle'yi seçin.
Referans Ekle iletişim kutusu göründüğünde, ". NET sekmesinden System.Management öğesini seçin ve Tamam düğmesini tıklatın.
Çözüm Gezgini başvurusuna "System.Management" eklenirse Tamam.
Proje özelliklerini VB.NET, soldaki sekmeden "Gözat" ı tıklayın, sağdaki Ekle düğmesini tıklayın. Yukarıdaki gibi, Referans Ekle iletişim kutusu görüntülenir, bu nedenle "System.Management" ı seçin ve Tamam düğmesine tıklayın.
Önceki ekrana dönüp orta listeye "System.Management" eklerseniz, sorun değil.
Ayrıca, programınızdaki ad alanı açıklamalarını atlamak için aşağıdaki listeden "System.Management" öğesini işaretleyin.
Ayrıca, özgün ipuçlarıyla ilgili olmasa da, bu örnek StringBuilder sınıfını kullanır, bu nedenle "System.Text" ad alanını da kontrol ettim. (yalnızca VB.NET)
sahne
Bu örnekte kullanılan ekran, KB'nin yükleme durumunu denetlemek için bir yürütme düğmesi ve sonuçları görüntüleyen bir metin kutusu içeren basit bir ekrandır.
WPF'de yapıyorum, ancak aynı ekran Windows Form'da yapılandırılabilir.
program
C ManagementObjectSearcher
#, sınıfların ve diğer ad alanlarının açıklamasını azaltmak için kodun başına ""using System.Management;
ekler. VB.NET, ad alanının proje özelliklerine aktarılması gerektiğini belirttiniz, bu nedenle özel bir şey yazmanıza gerek yok, ancak bunu yapmadıysanız, ".Imports System.Management
* Hem C# hem de VB.NET, tüm sınıf adları ""System.Management.ManagementObjectSearcher
gibi bir ad alanından yazılmışsa, yukarıdaki belirtim gerekli değildir.
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」追加)
Aşağıda, yüklü KB'yi arayan ve listeleyen kod verilmiştir.
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()
İlk satırdaki ""ResultTextBox
, elde edilen sonuçları görüntülemek için kullanılan bir metin kutusudur.
yönetilen nesnenin arama sınıfının bir örneğini oluştururnew ManagementObjectSearcher
ve WMI sorgusunu bağımsız değişken olarak ayarlar. Bir sorgunun sözdizimi neredeyse bir SQL deyimine eşittir, bu nedenle ayrıntılar için SQL ile ilişkili olarak buna bakın. "Win32_QuickFixEngineering", geçerli işletim sistemi için geçerli olan bir güncelleştirmeyi temsil eder.
Daha önce " içinde belirtilen WMI sorgusunda bir arama gerçekleştirir ve sonuçları "query.Get()
olarak döndürür.ManagementObjectCollection
"" güncelleme bilgilerini listelediğinden, foreach içinde "" alırız ve sonuç olarak "HotFixID"ManagementObjectCollection
ManagementObject
parametresinden benzersiz bir tanımlayıcı yazarız.
Bunu yaptığınızda, güncelleştirme kimlikleri şekilde gösterildiği gibi listelenir.
Çalıştırdığınızda görebileceğiniz gibi, sadece ilk çalıştırmada yavaştır. İkinci seferden sonra, oldukça erken.
System.Management.dll yüklenmesi ve işlenmesi yavaş mı yoksa WMI sorgusu yürütmenin mi yavaş olduğu belli değil, ancak yavaş olduğu gerçeği değişmiyor, bu yüzden kullanırken gecikme konusunda endişeleriniz varsa, zaman uyumsuz yürütme gibi önlemler almanın gerekli olduğunu düşünüyorum.