Quản lý các mạng Windows dùng Script - Phần 1: Những khái niệm cơ bản
Ngu
ồn : quantrimang.com
Mitch Tulloch
Đây là phần đầu tiên trong loạt bài về các mạng Windows scripting. Phần
này đề cập đến những khái niệm cơ bản nhất về kỹ thuật scripting (kỹ thuật
viết kịch bản) trong các mạng chạy hệ điều hành Windows. Những phần
còn lại của loạt bài sẽ chuyển đến các bạn nội dung chi tiết của nhiều khía
cạnh khác nhau trong chủ đề này
.
Có một câu nói như thế này, không rõ của vĩ nhân hay thường dân nào nhưng
tôi thấy quả rất chí lý: “Đưa cho một anh chàng sắp chết đói một con cá, bạn
nuôi được anh ta một ngày; nhưng nếu dạy cho anh ta cách câu cá, bạn nuôi
anh ta cả đời”.
Còn gì đúng hơn thế, và càng đúng hơn trong thế giới bận rộn của các chuyên
gia công nghệ thông tin (mà chúng ta vẫn quen miệng gọi là dân IT) khi làm việc
với kỹ thuật scripting: “Đưa cho một admin mộ
t script, bạn giúp anh ta giải quyết
một vấn đề; nhưng nếu dạy anh ta cách viết script như thế nào, bạn giúp anh ta
làm được công việc gắn liền với cả đời anh ta”.
Giá mà tự động hoá được công việc quản trị hàng ngày bằng các script, cuộc
sống của những admin sẽ thoải mái và nhẹ nhàng hơn nhiều. Tại sao cần phải
biết và dùng script? Không phải đã có hàng trăm script được viết sẵn trôi nổ
i trên
thế giới mạng mà bạn có thể tải về dùng một cách dễ dàng, như lấy từ nguồn
trung tâm Script Center Script Repository của Microsoft chẳng hạn. Vậy tại sao?
Hàng trăm kịch bản (script) viết sẵn, xin thưa rằng đúng. Tải về dùng dễ dàng,
xin thưa rằng lại càng đúng. Ấy vậy mà đúng nhưng chưa đủ. Chúng hữu ích và
giúp đỡ bạn rất nhiều, nhưng nhiều khi đòi h
ỏi riêng theo cấu hình cụ thể trong
môi trường của bạn lại làm khó chúng. Có khi trong hàng trăm hàng nghìn script
tải về bạn chỉ chọn lọc được một script phù hợp mà vẫn phải điều chỉnh đôi chút.
Đơn giản vì tác giả viết ra nó không nằm trong tổ chức của bạn, không thực hiện
theo cấu hình của bạn và mối quan tâm của họ lại hướng đến một cái gì khác
cơ. Khi đó các admin phải trở
thành những ông thợ sửa chữa lành nghề, thay
đổi chỗ này một chút, thay đổi chỗ kia một tý, ghép ghép nối nối để biến vài scrip
nhỏ lẻ thành một script hợp nhất lớn hơn hay dùng dữ liệu đầu ra của script này
làm thành dữ liệu đầu vào cho script khác, hay biến nó thành công cụ hoạt động
cho một máy từ xa… Quả là rất nhiều việc!
Anh thợ máy muốn sửa chữa được máy móc thì phải hiểu cấu trúc của nó,
đó là
điều không ai phản bác. Bởi vậy mà anh “thợ” admin muốn biến đổi, điều chỉnh
script thì phải hiểu về nó, phải biết cách xây dựng và viết ra nó, biến những cái
mới hay cái có sẵn thành cái của riêng mình, phù hợp nhất với mình. Và lúc đó
người ta gọi anh là “thợ lành nghề”. Muốn được như vậy, ai cũng phải bắt đầu
với những điều cơ bản nhất, ở đây là Windows scripting. Nói đến script, nhiều
người tưởng chừng rất khó, thực sự khó vì trước hết… script rất khó d
ịch sang
tiếng Việt! Script nghĩa là “kịch bản”, nhưng dân công nghệ chúng ta đâu phải là
người làm phim nên kịch bản của thế giới IT chỉ toàn những đoạn mã loằng
ngoằng mà chỉ có các chuyên gia mới hiểu, còn nhiều người “thường thường
bậc trung” như… sinh viên công nghệ thì chịu! Chính bởi vậy mà hôm nay chúng
ta sẽ bắt đầu từ những cái cơ bản nhất, sau đó nâng cao dần khả năng hiểu
những khía cạnh sâu xa hơn trong viết và dùng script ở các mạng Windows. Mục
đích cuối cùng mà chúng ta hướng tới là kể cả những người mới bắt đầu tìm
hiểu như bạn, như tôi đều có thể script hoá tự động công việc, để cuộc sống của
các admin an nhàn hơn. Chúng ta sẽ thực hiện điều này trên cả script do chính
bạn viết ra hoặc download về từ nhiều nguồn khác nhau. Chúng ta cũng sẽ được
bi
ết một số tài nguyên liên quan đáng tìm hiểu để có cái nhìn sâu sắc hơn về
Windows scripting, cũng như một số công cụ trợ giúp có thể sẽ rất hữu ích trong
tương lai.
Các thiết lập TCP/IP scripting
Hầu như admin nào cũng dùng Visual Basic Script (VBScript) để viết kịch bản
quản trị Windows (Windows admin script). VBScript không chỉ là một ngôn ngữ
mạnh mà cú pháp của nó còn khá đơn giản để học và làm. VBScript có thể dùng
chung với Windows Management Instrumentation (WMI) và Active Directory
Services Interfaces (ADSI) để viế
t kịch bản cho bất kỳ khía cạnh nào của một hệ
thống chạy hệ điều hành Windows hay một mạng dùng Active Directory. Chúng
ta sẽ bắt đầu học về Windows scripting bằng cách dùng VBScript với WMI để
thực hiện một điều sẽ rất hữu ích: thay đổi địa chỉ IP của một network adapter.
Tại sao lại cần thực hiện điều này? Đó là do chúng ta sẽ phải sử dụng nhi
ều đến
một máy chủ ảo và một PC ảo để thiết lập môi trường kiểm tra. Chúng ta sẽ cần
phải chuyển một máy ảo (VM) chạy hệ điều hành Windows Server 2003 từ mạng
ảo này sang mạng ảo khác để sử dụng lại server (máy chủ) cho một số mục đích
khác. Như thế có nghĩa là chúng ta sẽ cần thay đổi địa chỉ IP trên server (cũng
có thể là cổng vào mặc đị
nh nữa). Bạn có thể thực hiện điều này bằng cách mở
Network Connections trong Control Panel và kích phải chuột lên Local Area
Connections, chọn Properties > Internet Protocol (TCP/IP) trên tab General
và bấm chọn Properties, nhập địa chỉ IP mới rồi ấn OK hai lần. Đây là cách thực
hiện phổ biến nhưng nghe qua bạn đã thấy khá dài dòng và mệt mỏi. Với những
chuyên gia, họ thích sử dụng Command Promt hơn, lệnh dùng ở
đây là Netsh.
Song, khi sử dụng lệnh này bạn cần cẩn trọng vì nó có nhiều ngữ cảnh, lệnh và
tham số khác nhau rất khó nhớ. Thực hiện sai một thao tác cũng có thể dẫn đến
hậu quả nghiêm trọng. Nếu chưa thực sự chắc chắn, hãy nhờ sự giúp đỡ của
phần trợ giúp Help hoặc quay trở lại cách thứ nhất.
Nhưng mục đích của chúng ta ở đây là học về script. Do đó, chúng ta sẽ xem xét
cách thay đổi địa chỉ IP của máy dùng VBScript và WMI như thế nào mà trước
hết là phải biết đến một số khái niệm cơ bản như đối t
ượng (object), phương
thức (method), thuộc tính (property), namespace…
Để bắt đầu, hãy chạy script trên một máy cục bộ:
strComputer = "."
Ở đây, tiền tố str- được đặt đầu đối tượng là để chỉ strComputer là một biến có
chứa xâu, còn dấu chấm là ký hiệu tham chiếu tới máy cục bộ và được dùng
như một điểm bắt đầu của namespace WMI. Vậy không gian tên WMI là gì?
Thực ra, đó là một tậ
p hợp phân cấp các lớp đối tượng khác nhau, có thể được
dùng để quản lý nhiều mặt khác nhau của máy tính Windows. Ví dụ, có một
namespace gốc và bên dưới nó là hàng tá namespace con khác như
SECURITY, CIMV2, perfmon… Hầu hết các lớp WMI hữu ích nằm trong không
gian tên root\cimv2 và trước khi làm việc với bất kỳ lớp nào trong số đó, chúng ta
cần diễn giải chúng thành các đối tượng. Sau đó là xem xét thuộc tính của các
đối tượng này và gọi phương thức để thao tác chúng.
Lớp, đố
i tượng, thuộc tính, phương thức - chúng là những gì? Dưới đây là một
phân tích đơn giản có thể giúp bạn hiểu về chúng: xem xét lớp MicrowaveOven,
tức tập hợp trừu tượng của tất cả các lò vi sóng (không có một lò thực nào được
đưa vào trong đó cả). Lớp này có thể có các thuộc tính: màu sắc (Color), kích
thước theo khối lập phương (CubicInches), mặt quay tròn (HasTurntable)… Có
lẽ bạn hiểu thuộc tính chính là các đặc điểm, tính ch
ất đặc trưng cho một lớp.
Nói cách khác, các lò vi sóng này sẽ có một màu nào đó, có một kích thước bên
trong nào đó và chúng có thể quay tròn hoặc không.
Lớp MicrowaveOven cũng có các phương thức. Phương thức, tức là một hàm
tính toán hoặc được định nghĩa theo một quy luật nhất định để lớp có thể thao
tác hoặc bạn có thể thao tác với lớp. Với lớp cụ thể này, một số phương thức có
thể dùng là SetCookingTime (thiế
t lập thời gian nấu), SetPowerLevel (thiết lập
mức điện sử dụng), Reset (nấu lại)… Thông thường, để gọi một phương thức
bạn phải đưa tham số vào cho nó. Ví dụ, để gọi phương thức SetCookingTime
(thiết lập thời gian nấu), chúng ta có thể định nghĩa biến CookingTime (thời gian
nấu) trong một số giây nhất định và sau đó đưa biến này vào ph
ương thức
SetCookingTime thiết lập cho một trường hợp cụ thể của lớp này (một trường
hợp thực, không phải là lò vi sóng trong lớp trừu tượng). Với WMI VBScript,
chúng ta có thể thực hiện như sau:
intCookingTime = 120
errSetCookingTime =
objMicrowave.SetCookingTime(intCookingTime)
Nhưng đối tượng lò vi sóng (objMicrowave) ở đâu ra? Chúng ta vẫn chưa tạo nó,
vì vậy hãy tạo bằng cách dùng lệnh Set và phương thức CreateObject:
Set objMicrowave = CreateObject("MicrowaveOven")
Thực ra, nếu xét kỹ hơn thì objMicrowave không phải là đối tượng của lớp
MicrowaveOven. Chính xác hơn nó là một đối tượng tham chiếu tới một thể hiện
của lớp MicrowaveOven. Nhưng hiện tại chúng ta mới ch
ỉ bắt đầu với những gì
cơ bản nhất nên các khía cạnh sâu hơn này sẽ được tìm hiểu ở sau.
Tiếp theo, tạo thêm biến strColor để thiết lập thuộc tính màu sắc cho lò vi sóng
của chúng ta. Đặt giá trị biến là Green (màu xanh là cây), script sẽ có dạng như
bên dưới (với một số chú thích bên cạnh):
strColor = "Green" 'gán màu cho lò vi sóng
intCookingTime = 120 'quy định thời gian nấu (tính theo
giây)
Set objMicrowave = CreateObject("MicrowaveOven") 'tạo một
thể hiện của đố
i tượng
errSetCookingTime =
objMicrowave.SetCookingTime(intCookingTime) 'gọi một phương
thức để
‘thiết lập
thời gian nấu và ghi lại đoạn mã lỗi kết quả
objMicrowave.Color = strColor 'thiết lập giá trị thuộc tính
Color (màu sắc)
Cũng không quá khó phải không các bạn!
Trở lại với script
Muốn truy cập các thiết lập cấu hình TCP/IP của máy dùng WMI, bạn cần viết
mã:
Set objWMIService = GetObject("winmgmts:\\" & strComputer &
"\root\cimv2")
Lệnh này sẽ kế
t nối bạn tới namespace root\cimv2 trên máy cục bộ bằng cách
định nghĩa một đối tượng có tên objWMIService và thiết lập nó bằng với giá trị
trả về của phương thức GetObject. Sau khi kết nối tới namespace này, bạn có
thể thu thập thông tin như bên dưới:
Set colNetAdapters = objWMIService.ExecQuery("Select * from
Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")
Dòng lệnh này chạy như thế nào? Đầu tiên, bạn có thể thấy đối tượng có tên
objWMIService mà chúng ta vừa mô tả một phút trước ở dòng bên trên. Sau đối
tượng này là ExecQuery, có thể là thuộc tính mà c
ũng có thể là phương thức
(cấu trúc của lệnh luôn luôn là doituong.thuoctinh hoặc
doituong.phuongthuc). Chúng ta có thể dễ dàng đoán ra đó là một phương
thức vì đằng sau nó là một câu truy vấn. Phương thức ExecQuery được gọi
bằng cách thêm một tham số vào nó. Tham số ở đây là một lệnh SQL
(SELECT), trả ra tập hợp (được đánh dấu bởi tiền tố “col-”) của tất cả (dấu
hoa thị
) cấu hình bộ điều hợp mạng trên máy có đường bao TCP/IP và được cho
phép trên bộ điều hợp. Tập hợp trả về sau khi thực hiện phương thức này sẽ
được gán với biến colNetAdapters.
Chúng ta có thể làm gì với tập hợp này? Khi có một tập hợp trong tay, bạn phải
lặp vòng nó, dùng một lệnh lặp như For Each. Vòng lặp tiếp theo sẽ như thế
này:
For Each objNetAdapter in colNetAdapters
' do something to each network adapter's configuration
Next
Bạn luôn phải lặp vòng các tập hợp cho dù tập hợp đó chỉ có một đối tượng.
Bây giờ, điều chúng ta thực sự muốn là thay đổi địa chỉ IP cho adapter của mình.
Vì thế, hãy định nghĩa thêm một số biến:
arrIPAddress = Array("172.16.11.99")
arrSubnetMask = Array("255.255.255.0")
Chú ý là các biến định nghĩa địa chỉ IP và subnet mask mới phải là các biến
mảng. Tại sao lại như thế? Lý do đầu tiên là các máy tính Windows nhiều khi
không phải chỉ
có một địa chỉ IP, một cổng vào mặc định… Vậy thì tại sao không
dùng biến mảng cho tất cả các thiết lập IP được nhất quán. Và lý do thứ hai, nếu
tìm kiếm lớp Win32_NetworkAdapterConfiguration trong WMI Reference trên
MSDN, bạn sẽ thấy được phải dùng đến biến mảng. Chúng ta sẽ nghiên cứu
sâu hơn về WMI Reference trong tương lai, còn bây giờ thì tạm thời chấp nhận