Sử dụng WMI để xác định trạng thái cài đặt của các bản cập nhật Windows
tóm tắt
Sử dụng WMI để kiểm tra các bản Cập Nhật (trong KB) được cài đặt trên Windows bạn hiện đang sử dụng.
Môi trường hoạt động
Môi trường kiểm tra hoạt động
Phiên bản Windows |
|
Phiên bản .NET framework |
|
Yêu cầu hệ thống cần thiết
Phiên bản Windows |
|
Phiên bản .NET framework |
|
chất
KB là gì?
KB cũng được sử dụng làm chữ viết tắt cho biểu thức "kilobyte" hoặc "bàn phím", vì vậy tôi không nghĩ đó là từ được sử dụng cho công chúng, nhưng các bản cập nhật như hỗ trợ bảo mật Windows và sửa lỗi đôi khi được gọi là "KB" sau hai chữ cái đầu tiên của ID.
Mỗi bản cập nhật này được gán một ID và được chỉ định ở định dạng "KBXXXXXXX" trong đó XXXXXX là bất kỳ số nào. Số lượng chữ số không cố định). Tuy nhiên, lưu ý rằng không phải tất cả các bản cập nhật đều tuân theo định dạng này.
Nhân tiện, tên ban đầu của "KB" này là "Cơ sở kiến thức Microsoft" và khớp với ID của bài viết kỹ thuật do Microsoft xuất bản trên Web. Ví dụ: nếu đó là bản cập nhật cho KB980218, bài viết kỹ thuật tương ứng là http://support.microsoft.com/?kbid=980218".
Các chương trình tìm kiếm trạng thái cài đặt KB
Mặc dù các mẫu được mô tả trong Visual Studio 2010 và WPF, KB kiểm tra chương trình cũng có thể được sử dụng trong Visual Studio trước đó, Windows Form và các ứng dụng bảng điều khiển. Trong bài viết này, chúng tôi sẽ sử dụng phương tiện quản lý Windows (WMI) để kiểm tra cài đặt KB.
- Windows Management Instrumentation (từ Wikipedia)
Thêm tài liệu tham khảo
Để sử dụng WMI, bạn sử dụng các lớp ManagementObjectSearcher và ManagementObject, nhưng bạn phải tham khảo System.Management .dll sử dụng các lớp này.
Đối với các dự án C#, nhấp chuột phải vào References from Solution Explorer và chọn Add References.
Khi hộp thoại Thêm tham chiếu xuất hiện, hãy nhấp vào ". Từ tab NET, chọn System.Management và nhấp vào nút OK.
OK nếu "System.Management" được thêm vào tham chiếu Solution Explorer.
Nếu VB.NET mở thuộc tính dự án, hãy nhấp vào "Duyệt qua" từ tab bên trái, nhấp vào nút Thêm ở bên phải. Như trên, hộp thoại Thêm tham chiếu được hiển thị, vì vậy hãy chọn "System.Management" và nhấp vào OK cái nút.
Nếu bạn quay lại màn hình trước đó và thêm "System.Management" vào danh sách giữa, điều đó là OK.
Ngoài ra, hãy chọn "System.Management" từ danh sách bên dưới để bỏ qua các mô tả không gian tên trong chương trình của bạn.
Ngoài ra, mặc dù nó không liên quan đến các mẹo ban đầu, mẫu này sử dụng lớp StringBuilder, vì vậy tôi cũng đã kiểm tra không gian tên "System.Text". (Chỉ dành cho VB.NET)
cảnh
Màn hình được sử dụng trong mẫu này là một màn hình đơn giản với nút thực thi để kiểm tra trạng thái cài đặt của KB và hộp văn bản hiển thị kết quả.
Tôi đang làm cho nó trong WPF, nhưng cùng một màn hình có thể được cấu hình trong Windows Form.
chương trình
C ManagementObjectSearcher
# thêm ""using System.Management;
vào đầu mã để giảm mô tả các lớp và các không gian tên khác. Trong VB.NET, bạn đã chỉ định rằng không gian tên nên được nhập vào thuộc tính dự án, vì vậy bạn không cần phải viết bất cứ điều gì đặc biệt, nhưng nếu bạn chưa làm như vậy, bạn cần phải thêm ".Imports System.Management
* Trong cả C# và VB.NET, nếu tất cả các tên lớp được viết từ một không gian tên như "System.Management.ManagementObjectSearcher
", thì đặc tả trên là không cần thiết.
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」追加)
Dưới đây là mã tìm kiếm và liệt kê KB đã cài đặt.
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()
Dấu ""ResultTextBox
trong dòng đầu tiên là một hộp văn bản để hiển thị kết quả thu được.
tạonew ManagementObjectSearcher
một thể hiện của lớp tìm kiếm của đối tượng được quản lý và đặt truy vấn WMI làm đối số. Cú pháp của một truy vấn gần như bằng một câu lệnh SQL, vì vậy hãy xem xét nó liên quan đến SQL để biết chi tiết. "Win32_QuickFixEngineering" đại diện cho bản Cập Nhật áp dụng cho hệ điều hành hiện tại.
Thực hiện tìm kiếm trên truy vấn WMI được chỉ định trước đó trong "query.Get()
và trả về kết quả là ".ManagementObjectCollection
Vì "" liệt kê thông tin cập nhật, chúng tôi nhận được "" trong báo trước và kết quả là viết một mã định danh duy nhất từ tham số "HotFixID".ManagementObjectCollection
ManagementObject
Khi bạn thực hiện việc này, ID Cập Nhật được liệt kê như trong hình.
Như bạn có thể thấy khi bạn chạy nó, nó chỉ chậm ở lần chạy đầu tiên. Sau lần thứ hai, nó là hợp lý sớm.
Không rõ liệu System.Management.dll tải và xử lý chậm hay thực thi truy vấn WMI chậm, nhưng thực tế là nó chậm không thay đổi, vì vậy nếu bạn lo lắng về độ trễ khi sử dụng, tôi nghĩ rằng cần phải thực hiện các biện pháp như thực thi không đồng bộ.