Quản trị mạng – 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.
Triển khai Windows 7 – Phần 1: Những cải tiến của Windows AIK 2.0
Triển khai Windows 7 – Phần 2: Sử dụng DISM
Triển khai Windows 7 – Phần 3: Tìm hiểu về MAP 4.0
Triển khai Windows 7 – Phần 4: Sử dụng MAP 4.0
Triển khai Windows 7 – Phần 5: Những nâng cao của MDT 2010
Triển khai Windows 7 – Phần 6: Lite Touch bằng MDT 2010
Triển khai Windows 7 – Phần 7: Triển khai LTI tự động
Triển khai Windows 7 – Phần 8: Tìm hiểu về các file cấu hình LTI
Triển khai Windows 7 – Phần 9: Triển khai Windows 32-bit và 64-bit
Triển khai Windows 7 – Phần 10: Capture và triển khai image của máy tính tham chiếu
Triển khai Windows 7 – Phần 11: Capture một cài đặt hiện có
Triển khai Windows 7 – Phần 12: Lên kế hoạch cho vấn đề tương thích ứng dụng
Triển khai Windows 7 – Phần 13: Chuyển thủ công từ Windows XP sang Windows 7
Triển khai Windows 7 - Phần 14: Chuyển tự động từ Windows XP sang Windows 7
Triển khai Windows 7 – Phần 15: Cấu hình cơ sở dữ liệu MDT
Triển khai Windows 7 – Phần 16: Sử dụng cơ sở dữ liệu MDT
Triển khai Windows 7 – Phần 17: Triển khai dựa trên model và kiểu chế tạo
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:
- 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.
- 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!
- 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.