Triển khai Windows 7 – Phần 18: Xác định UUID của máy tính
Trong phần này chúng tôi sẽ giới thiệu cho các bạn cách tạo kịch bản để xác
định UUID máy tính.
Mẹo: Bạn có thể tìm kiếm thêm thông tin về việc tự động hóa triển khai LTI
trong Windows 7 Resource Kit
của Microsoft.
Trong phần 16 của loạt bài này, chúng tôi đã giới thiệu cho các bạn về cách
sử dụng cơ sở dữ liệu MDT để tùy chỉnh triển khai Windows 7 dựa trên
UUID của các máy tính mục tiêu. Trong phần đó, các bạn cũng đã biết cách
sử dụng WMI để xác định UUID của máy tính nếu UUID này không được
hiển thị trong BIOS hệ thống hoặc tài liệu đi kèm. Phương pháp mà chúng
tôi đã giới thiệu để thực hiện việc này có đôi chút khiến các bạn khó hiểu,
thêm vào đó là máy tính mà bạn muốn xác định UUID đã cài đặt hệ điều
hành Windows.
Điều này làm xuất hiện một câu hỏi: Liệu có thể sử dụng WMI để xác định
UUID máy tính nếu không có hệ điều hành cài đặt trên nó? Câu trả lời là
Yes. Để thực hiện điều này, đầu tiên chúng ta cần xóa phần mã đã được thực
hiện trong hai phần trước. Sau đó xây dựng một Windows Preinstallation
Environment (WinPE) image, add một kịch bản vào image này, burn image
vào đĩa CD. Sau đó có thể sử dụng CD này để khởi động máy tính mới và
chạy kịch bản để xác định UUID của hệ thống.
Đó là những gì mà chúng tôi muốn giới thiệu cho các bạn trong phần này và
phần tiếp theo ngay sau nó. Đầu tiên trong phần này, chúng tôi sẽ tạo một
kịch bản để hiển thị UUID máy tính. Sau đó trong phần tiếp theo, chúng tôi
sẽ giới thiệu cách tạo một CD WinPE "tools" tùy chỉnh để bạn có thể sử
dụng kịch bản trên hệ thống máy tính chưa được cài đặt hệ điều hành nhằm
xác định UUID của hệ thống. Khi đã sử dụng CD WinPE của mình để chạy
kịch bản trên một số máy tính mục tiêu, bạn có thể nhập các UUID này vào
cơ sở dữ liệu MDT và triển khai các Windows image tùy chỉnh cho mỗi máy
tính như mong muốn.
Viết kịch bản xác định UUID
Trong phần 16 của loạt bài này, chúng tôi đã giới thiệu cho các bạn cách xác
định UUID của máy tính bằng WMI như sau:
1. Chúng ta bắt đầu với kịch bản DisplayClassProperties.vbs để hiển thị
tên của tất cả các thuộc tính lớp WMI cùng với các giá trị của các
thuộc tính này.
2. Tiếp đến chúng ta có thể chạy lệnh WBEMTEST trên máy tính để xác
định cách cần tùy chỉnh dòng strWMIQuery = <string> trong kịch
bản của chúng ta như thế nào nhằm làm cho kịch bản làm việc trên
một máy tính nào đó. Các bước để thực hiện việc này là: (a) chạy
WBEMTEST, (b) kết nối đến root\cimv2 phần tên, (c) kích Enum
Instances, (d) đánh Win32_ComputerSystemProduct, (e) nhấn OK.
Đầu ra kết quả từ WBEMTEST sẽ được sử dụng làm giá trị của
<string> trong dòng trên của kịch bản. Quá trình này phải được thực
hiện một cách thủ công vì đầu ra của lệnh WBEMTEST không hỗ trợ
việc copy vào clipboard!
3. Khi kịch bản được tùy chỉnh, chúng ta chạy nó trên máy tính và tích
hợp nó vì một phần của đầu ra kịch bản là UUID của máy tính.
Tất cả các thao tác trên có thể làm cho bạn hơi khó hiểu – chắc chắn bạn
cũng sẽ thích không phải chạy WBEMTEST trên máy tính hoặc phải tùy
chỉnh kịch bản mỗi khi phải chạy nó cũng như thích có được kịch bản để cho
ra kết quả UUID máy tính chứ không phải một loạt các thông tin cần phải
chọn lọc.
Ở đây có cách để thực hiện điều đó. Chúng ta cần bắt đầu với bằng file
DisplayClassProperties.vbs đã được thay đổi lấy từ phần 16 của loạt bài
này.
' DisplayClassProperties.vbs
' Used to find the UUID of a specific desktop computer
' By Mitch Tulloch (www.mtit.com)
Option Explicit
On Error Resume Next
Dim strComputer
Dim strWMINamespace
Dim strWMIQuery
Dim objWMIService
Dim colItems
Dim objItem
strComputer = "."
strWMINamespace = "\root\CIMV2"
strWMIQuery =
":Win32_ComputerSystemProduct.IdentifyingNumber='MXG5380254
NA540',Name='PY196AV-ABA
a1130e',Version='0n31211CT101AMBEM00'"
Set objWMIService = GetObject("winmgmts:\\" & strComputer &
strWMINamespace & strWMIQuery)
WScript.Echo "Number of properties of " & strWMIQuery & " class is " &
objWMIService.Properties_.count
For Each objItem in objWMIService.Properties_
Wscript.Echo "Property: " & objItem.name & vbTab & "Value: " &
objItem.value
Next
Lúc này, để hoàn thiện những gì WBEMTEST thực hiện và trả về các
instance của lớp Win32_ComputerSystemProduct chúng ta cần sử dụng
phương pháp SWbemServices.InstancesOf
của đối tượng SwbemServices.
Để chỉ ra cách thực hiện, chúng toi đã điều chỉnh kịch bản dưới đây từ một
trang hướng dẫn viết kịch bản cho Windows 2000 khá ưu việt (tham khảo
kịch bản gốc tại đây
)
strComputer = "."
Set objSWbemServices = GetObject("winmgmts:\\" & strComputer &
"\root\cimv2")
Set colSWbemObjectSet = objSWbemServices.ExecQuery _
("SELECT * FROM Win32_Service")
For Each objSWbemObject In colSWbemObjectSet
Wscript.Echo "Name: " & objSWbemObject.Name
Next
Phiên bản được tùy chỉnh cho kịch bản ở trên như sau:
strComputer = "."
Set objSWbemServices = GetObject("winmgmts:\\" & strComputer &
"\root\cimv2")
Set colSWbemObjectSet = objSWbemServices.ExecQuery _
("SELECT * FROM Win32_ComputerSystemProduct")
For Each objSWbemObject In colSWbemObjectSet
strIdentifyingNumber = objSWbemObject.IdentifyingNumber
strName = objSWbemObject.Name
strVersion = objSWbemObject.Version
Next
Wscript.Echo "IdentifyingNumber: " & strIdentifyingNumber
Wscript.Echo "Name: " & strName
Wscript.Echo "Version: " & strVersion
Lý do chúng ta cần kịch bản trên để xác định các giá trị của ba thuộc tính
IdentifyingNumber, Name và Version là vì lớp
Win32_ComputerSystemProduct có ba thuộc tính “key” có tên
IdentifyingNumber, Name và Version. Để thấy chúng, bạn có thể tham khảo
tài liệu trên MSDN tại đây
. Cần phải nhớ rằng thuộc tính key là thuộc tính
cung cấp nhận dạng duy nhất cho mỗi một instance của một lớp, và để kết
nối đến một instance của một lớp, bạn cần chỉ định instance cụ thể bằng cách
sử dụng thuộc tính key của lớp. Các thuộc tính key sẽ được đánh dấu bằng
"Key" trong tài liệu MSDN.
Lúc này chúng ta chỉ cần kết hợp kịch bản đã được tùy chỉnh ở trên với kịch
bản DisplayClassProperties.vbs để tạo thành một kịch bản mới có tên
UUID.vbs (lưu ý rằng chúng tôi đã đơn giản hóa kịch bản này bằng cách bỏ
qua các định nghĩa biến và quản lý lỗi):
'UUID.vbs
'Displays the UUID of a computer
'By Mitch Tulloch (www.mtit.com)
strComputer = "."
strWMINamespace = "\root\CIMV2"
Set objSWbemServices = GetObject("winmgmts:\\" & strComputer &
"\root\cimv2")
Set colSWbemObjectSet = objSWbemServices.ExecQuery("SELECT *
FROM Win32_ComputerSystemProduct")
For Each objSWbemObject In colSWbemObjectSet
strIdentifyingNumber = objSWbemObject.IdentifyingNumber
strName = objSWbemObject.Name
strVersion = objSWbemObject.Version
Next
strWMIQuery = ":Win32_ComputerSystemProduct.IdentifyingNumber='" &
strIdentifyingNumber _
& "',Name='" & strName & "',Version='" & strVersion & chr(39)
Set objWMIService = GetObject("winmgmts:\\" & strComputer &
strWMINamespace & strWMIQuery)
For Each objItem in objWMIService.Properties_
If objItem.name = "UUID" Then
Wscript.Echo objItem.name & " = " & objItem.value
End If
Next
Lưu ý rằng phần quan trọng ở đây là làm sao bảo đảm các dấu ngoặc kép
đúng trong câu lệnh strWMIQuery = <string>. Cho ví dụ, câu lệnh kết thúc
bằng & chr(39) cần gắn thêm vào một dấu đóng của ngoặc kép để hoàn thiện
cú pháp câu lệnh. Tuy nhiên cũng cần thực hiện một mẹo nhỏ mà chúng tôi
đã áp dụng để kịch bản trên làm việc – cách thức mà chúng tôi thực hiện là
chèn tạm thời một câu lệnh Wscript.echo strWmiQuery ngay sau lệnh
strWMIQuery = <string> để có thể chạy kịch bản và đầu ra của các nội
dung của chuỗi nhằm xác định xem liệu chuỗi có cú pháp đúng hay không,
sau đó thực hiện thay đổi và chạy kịch bản lại lần nữa cho tới khi có được cú
pháp đúng.
Test kịch bản
Giờ đây chúng ta sẽ đi test xem kịch bản của mình có làm việc hay không
bằng cách chạy nó từ dòng lệnh trên máy tính có cài đặt hệ điều hành
Windows XP (hình 1):
Hình 1: Chạy file UUID.vbs trên máy tính có hệ điều hành
Chúng ta hãy làm đơn giản hóa việc chạy kịch bản bằng cách tạo một file
batch đi theo mang tên UUID.bat:
@ECHO OFF
cscript.exe //nologo UUID.vbs
Cách thức thực hiện này sẽ làm cho chúng ta dễ dàng hơn trong việc chạy
kịch bản cũng như làm cho đầu ra dễ hiểu hơn (hình 2):
Hình 2: Chạy file UUID.bat trên máy tính có một hệ điều hành
Kết luận
Lúc này kịch bản đã sẵn sàng, chúng ta cần xây dựng một image WinPE và
tích hợp kịch bản của mình vào trong image này nhằm có thể chạy kịch bản
của mình trên các hệ thống mới chưa có hệ điều hành.