Tải bản đầy đủ (.pdf) (6 trang)

Script - Những khái niệm cơ bản Đây là

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (244.24 KB, 6 trang )

Quản lý các mạng Windows dùng Script - Phần 1: Những khái niệm cơ
bản

Đâ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 ở mức độ chưa rõ
ràng một chút.

Cuối cùng, cần gọi phương thức

EnableStatic
của lớp Win32_NetworkAdapterConfiguration để
thay đổi địa chỉ IP và cổng vào mặc định của bộ điều hợp mạng sang thiết lập mới chúng ta đã
định nghĩa trong các biến mảng. Thực hiện như sau:

errEnableStatic = objNetAdapter.EnableStatic(arrIPAddress, arrSubnetMask)


Ở đây, biến err- là cần thiết, giống như một nơi lưu trữ đoạn mã lỗi trả về khi phương thức chạy.

Mang tất cả lại với nhau

Bây giờ, ghép tất cả các phần lại với nhau và hãy xem chúng ta có những gì:

strComputer = "."
arrIPAddress = Array("172.16.11.99")
arrSubnetMask = Array("255.255.255.0")
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colNetAdapters = objWMIService.ExecQuery("Select * from Win32_NetworkAdapterConfiguration")
For Each objNetAdapter in colNetAdapters
errEnableStatic = objNetAdapter.EnableStatic(arrIPAddress, arrSubnetMask)
Next

Bạn biết đấy, đoạn mã này đưa ra các định nghĩa biến, điều khiển lỗi, dùng dữ liệu đầu vào và
kiểm chứng kết quả trả về. Chúng ta sẽ sử dụng lại đoạn mã này trong những phần sau của loạt
bài, nhưng đầu tiên hãy xem liệu nó có làm việc hay không. Ghi script lại với tên
ChangeIPAddress.vbs (nhớ là phải tắt Word Wrap trong Notepad) và copy nó lên desktop của
máy chủ có địa chỉ tĩnh 172.16.11.45. Sau đó, mở cửa sổ dòng lệnh Command Promp với vai trò
người dùng Administrator, chuyển tới thư mục Desktop và chạy script, dùng Cscript.exe. Kết
quả trả về:


C:\Documents and Settings\Administrator\Desktop>ipconfig

Windows IP Configuration

Ethernet adapter Local Area Connection:

Connection-specific DNS Suffix . :
IP Address. . . . . . . . . . . . : 172.16.11.45
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 172.16.11.1

C:\Documents and Settings\Administrator.DC-1\Desktop>cscript ChangeIPAddress.vbs

Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

C:\Documents and Settings\Administrator\Desktop>ipconfig

Windows IP Configuration

Ethernet adapter Local Area Connection:

Connection-specific DNS Suffix . :
IP Address. . . . . . . . . . . . : 172.16.11.99
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 172.16.11.1

Vâng, nó đã làm việc! Địa chỉ IP của máy đã được thay đổi thành công từ .45 thành .99 như hiển

×