Quản lý mạng Windows bằng Script - Phần 12: Các thuộc tính của lớp WMI

Phần 1: Những khái niệm cơ bản
Phần 2: Hoàn chỉnh script
Phần 3: Hiểu về WMI
Phần 4: Sử dụng Win32_NetworkAdapterConfiguration
Phần 5: Vượt qua thử thách
Phần 6: Những bước đầu tiên về scripting remote
Phần 7: Xử lý sự cố lỗi
Phần 8: Xử lý lỗi kịch bản điều khiển từ xa bằng Network Monitor 3.0
Phần 9: Tìm hiểu kịch bản điều khiển xa
Phần 10: Các thủ thuật của kịch bản điều khiển xa
Phần 11: Các thủ thuật kịch bản khác

Mitch Tulloch

Quay trở lại phần ba của loạt bài này, chúng ta đã phát triển kịch bản đơn giản có tên displayTimeZone.vbs để hiển thị thiết lập vùng thời gian hiện hành trên máy tính của bạn:

Option Explicit
On Error Resume Next
Dim strComputer
Dim strWMINamespace
Dim strWMIQuery
Dim objWMIService
Dim colItems
Dim objItem

strComputer = "."
strWMINamespace = "\root\CIMV2"
strWMIQuery = "SELECT * FROM Win32_TimeZone"

Set objWMIService = GetObject("winmgmts:\\" & strComputer & strWMINamespace)
Set colItems = objWMIService.ExecQuery(strWMIQuery)

For Each objItem In colItems
WScript.Echo objItem.Caption
Next

Khi tôi chạy kịch bản này, nó cho kết quả như sau:

C:\scripts>DisplayTimeZone.vbs
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

(GMT-06:00) Central Time (US & Canada)

Làm thế nào tôi biết được đó là thuộc tính chính của lớp Win32_TimeZone gồm có thông tin mà tôi muốn hiển thị? Bằng cách đọc các chỉ dẫn về nó tại đây mà tôi có thể biết điều đó. Trong thực tế, trang MSDN này cho chúng ta biết được rằng thuộc tính Description cơ bản trả về objItem.Description và các kết quả tương tự.

Trang MSDN này còn cho chúng ta biết thêm gì nữa về lớp Win32_TimeZone? Điều gì sẽ xảy ra nếu tôi muốn tìm ra tháng nào thực hiện việc đó ảnh hưởng trên máy tính? Nếu đọc qua trang này thì bạn sẽ có được thông tin liên quan đế thuộc tính này (DaylightMonth).

DaylightMonth
Data type: uint32
Access type: Read-only

Month when the transition from standard time to daylight saving time occurs on an operating system.

Value Meaning
1
0x1 January
2
0x2 February
3
0x3 March
4
0x4 April
5
0x5 May
6
0x6 June
7
0x7 July
8
0x8 August
9
0x9 September
10
0xA October
11
0xB November
12
0xC December

Để sử dụng thông tin này, đơn giản tôi chỉ thay đổi dòng WScript.Echo objItem.Caption thành WScript.Echo objItem.DaylightMonth và đây là những gì tôi nhận được khi chạy kịch bản này:

C:\scripts>DisplayTimeZone.vbs
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.


3

Liệt kê các thuộc tính của một lớp

Bây giờ chúng ta có thể tiếp tục quá trình bằng cách thay đổi thuộc tính <property> trong WScript.Echo objItem.<property> và vì vậy từ từ làm việc thông qua hiển thị từng cái một trong các thuộc tính của lớp Win32_TimeZone, nhưng đây có phải là cách dễ dàng hơn? Chúng ta có thể hiển thị được các thuộc tính của lớp này trong một kịch bản mà không cần đặt tên chúng trong kịch bản? Điều này thực hiện được nhưng trước khi thực hiện hãy thử và liệt kê số các thuộc tính của lớp này. Đây là cách chúng ta thực hiện:

Option Explicit
On Error Resume Next
Dim strComputer
Dim strWMINamespace
Dim strWMIQuery
Dim objWMIService
Dim colItems
Dim objItem

strComputer = "."
strWMINamespace = "\root\CIMV2"
strWMIQuery = ":Win32_TimeZone"

Set objWMIService = GetObject("winmgmts:\\" & strComputer & strWMINamespace & strWMIQuery)
WScript.Echo "Number of properties of " & strWMIQuery & " class is " & objWMIService.Properties_.count

Đây là kết quả chạy kịch bản mới này, kịch bản mà chúng ta sẽ gọi nó là DisplayClassProperties.vbs:

C:\scripts>DisplayClassProperties.vbs
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.


Number of properties of :Win32_TimeZone class is 24

Xem một bảng kiểm kê các thuộc tính tại Win32_TimeZone MSDN sẽ cho chúng ta thấy con số 24 là hoàn toàn chính xác, điều đó có nghĩa là lớp Win32_TimeZone có 24 thuộc tính trong tổng số.

Kịch bản mới này làm việc như thế nào? Đầu tiên bạn lưu ý rằng thay vì kết nối đến không gian tên mặc định ("\root\CIMV2") trên máy tính cục bộ (“.”) chúng ta kết nối trực tiếp đến lớp Win32_TimeZone trên máy tính. Hay nói theo cách khác, dòng:

Set objWMIService = GetObject("winmgmts:\\" & strComputer & strWMINamespace & strWMIQuery)

có thể được thay thế bởi

Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2:Win32_TimeZone")

và nó sẽ thực hiện các công việc một cách tương tự. Một điều khác mà bạn sẽ chú ý là một thứ trong dòng cuối cùng của kịch bản:

objWMIService.Properties_.count

Chúng ta biết về các thuộc tính (như <object>.<property>) và các phương pháp (<object>.<method>) từ phần đầu tiên của loạt bài này, nhưng objWMIService.Properties_.count có hai chu kỳ trong nó. Điều gì sẽ xảy ra ở đây? Chúng ta hãy quay lại dòng này một lần nữa:

Set objWMIService = GetObject("winmgmts:\\" & strComputer & strWMINamespace & strWMIQuery)

những gì chúng ta đã nhìn thấy tương đương với

Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2:Win32_TimeZone")

Biệt danh trong lệnh WMI này là winmgmts:\\.\root\CIMV2:Win32_TimeZone và nó định nghĩa đường dẫn đến lớp WMI mà chúng ta quan tâm trong việc tăng truy cập, khi bạn sử dụng hàm GetObject trên biệt danh này thì nó sẽ trả về một đối tượng SwbemObject, đối tượng này sau đó được gán cho biến objWMIService bằng lệnh Set. (Chính xác hơn, hàm GetObject trả lại một tham chiếu cho đối tượng SwbemObject đã được cung cấp bởi thành phần COM).

Nói cách khác, khi lệnh

Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2:Win32_TimeZone")

được thực thi, thì chúng ta sẽ có một đối tượng SwbemObject được trả về. Các đối tượng có các thuộc tính, vì vậy những thuộc tính gì mà đối tượng SwmebObject có được? Một thuộc tính được gọi là Properties_ và sử dụng kí hiệu chuẩn <object><properties> điều này có nghĩa là Properties_ property của một đối tượng SwebmObject sẽ được định nghĩa bởi SWbemObject.Properties_ ( đường gạch dưới từ là phần tên của thuộc tính). Bạn có thể đọc thêm về SWbemObject.Properties_ property của đối tượng SwebmObject trên trang này, và nó sẽ cho bạn thấy rằng thuộc tính này là “một bộ sưu tập các thuộc tính của lớp hiện tại” hoặc theo cách nói khác, SWbemObject.Properties_ property là một bộ sưu tập. Bạn cũng nên nhớ rằng một bộ sưu tập là một loại đối tương gồm có nhiều thành phần (thành phần đó có thể là các đối tượng khác hoặc các thuộc tính nhưng không phải là các phương pháp).

Quả thực SWbemObject.Properties_ là một bộ sưu tập (một kiểu đối tượng) và khi đối tượng có các thuộc tính thì bạn có thể sử dụng các thuộc tính này. Một thuộc tính mà một bộ sưu tập có là .count, nó có thể trả về số các thuộc tính của đối tượng, nghĩa là <collection>.<count> trả về số các thành phần trong bộ sưu tập. Điều này nghĩa là SWbemObject.Properties_.count là một thuộc tính .count của SWbemObject.Properties_ object, vì vậy xuất hiện hai chu kỳ thay vì một chu kỳ thông thường trong cú pháp <object>.<property>. Ít nhất, đó là cách hiểu vấn đề này, nhưng bạn nên nhớ rằng chúng tôi không phải là những nhà phát triển – mà cũng chỉ là một người đam mê giống như bạn, những người đang tìm hiểu kịch bản để phục vụ công việc của mình!

Hiển thị các thuộc tính của lớp

Bây giờ chúng ta có thể liệt kê các thuộc tính của lớp Win32_TimeZone, có thể trả về tên của các thuộc tính như thế nào? Bằng cách nối thêm các dòng dưới đây vào phần cuối của kịch bản DisplayClassProperties.vbs:

For Each objItem in objWMIService.Properties_
Wscript.Echo "Property: " & objItem.name
Next

Đây là những gì chúng ta có khi chạy kịch bản:

C:\scripts>DisplayClassProperties.vbs
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.


Number of properties of :Win32_TimeZone class is 24
Property: Bias
Property: Caption
Property: DaylightBias
Property: DaylightDay
Property: DaylightDayOfWeek
Property: DaylightHour
Property: DaylightMillisecond
Property: DaylightMinute
Property: DaylightMonth
Property: DaylightName
Property: DaylightSecond
Property: DaylightYear
Property: Description
Property: SettingID
Property: StandardBias
Property: StandardDay
Property: StandardDayOfWeek
Property: StandardHour
Property: StandardMillisecond
Property: StandardMinute
Property: StandardMonth
Property: StandardName
Property: StandardSecond
Property: StandardYear

Kiểm tra trang MSDN trước, trang đã mô tả về lớp Win32_TimeZone, chúng ta có thể thấy ở trên có tên của các thuộc tính lớp.

Kết luận

Sức mạnh của phương pháp này là nó cho phép chúng ta liệt kê tên các thuộc tính của lớp WMI, vì vậy chúng ta có thể học thêm về chúng (nhớ rằng trong phần 3 của loạt bài này chúng ta đã thấy cách liệt kê các lớp WMI của một không gian tên và cùng với danh sách đó chúng ta có thể khám phá và thấy được những gì chúng ta có thể quản lý thông qua sử dụng WMI).

Ví dụ, nếu chúng ta muốn liệt kê danh sách các thuộc tính của lớp Win32_BootConfiguration WMI bằng sử dụng kịch bản DisplayClassProperties.vbs, tất cả những gì cần thực hiện là thay đổi dòng:

strWMIQuery = ":Win32_TimeZone"

thành dòng như dưới đây:

strWMIQuery = ":Win32_BootConfiguration"

Khi chúng ta thực hiện thay đổi này và chạy lại kịch bản thì sẽ có được kết quả:

C:\scripts>DisplayClassProperties.vbs
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

Number of properties of :Win32_BootConfiguration class is 9
Property: BootDirectory
Property: Caption
Property: ConfigurationPath
Property: Description
Property: LastDrive
Property: Name Value:
Property: ScratchDirectory
Property: SettingID
Property: TempDirectory

Chúng tôi khuyên bạn nên sử dụng phần bài viết này cùng với phần ba để khai thác lớp WMI và các thuộc tính khác của chúng, ngoài ra chúng ta có thể xem chi tiết hơn về sức mạnh của việc sử dụng WMI để quản lý máy tính Windows trong các bài sau của loạt bài này, mời các bạn đón đọc.

Phần 13: Kịch bản trả về tất cả các giá trị

Thứ Năm, 26/07/2007 14:03
31 👨 1.271
0 Bình luận
Sắp xếp theo