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

Scrip - Xử lý sự cố lỗi

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 (381.81 KB, 7 trang )

Qu
Dim arrIPA
Dim arrSub
Dim colNe
Dim errEn
If WScript
Wscript
WScrip
End If

strComput
strAddres
s
arrIPAddre
arrSubnetM
Set objWM
Set colNetA
IPEnabled=
For Each o
errEnab
Next

Dòng:
strComput
cho chún
XP2 ban

Bây giờ
k
một máy


1. Kịch
b

2. Kịch
b

3. Kịch
b
remote p

uản lý các
Address
bnetMask
etAdapters
nableStatic

t.Arguments.Co
t.Echo "Usage
pt.Quit
er = "xp2"
s = Wscript.Arg
ess = Array(str
Mask = Array("
MIService = Ge
Adapters = obj
=TRUE")
objNetAdapter
bleStatic = objN
er = "xp2"


ng ta biết rằn
đầu có địa c
khi chúng ta
trạm quản l
bản đã hoạt đ
bản cần đến n
bản trả lại lỗi
rocedure ca
c mạng W
ount = 0 Then
: ChangeIPAd
d
guments.Item(0
rAddress)
"255.255.255.0
etObject("winm
jWMIService.E
in colNetAdap
NetAdapter.En
ng máy tính đ
chỉ IP là 172
a chạy kịch b
lý có tên là X
động. Ví dụ
nhiều thời gi
i dưới đây: C
all failed.
Windows d

Tro

n
Chan
dụng
là nh
Optio
Dim o
Dim o
Dim s
Dim s
dress.vbs new_
0)
0")
mgmts:\\" & str
ExecQuery("S
pters
nableStatic(arrI
được tích hợ
2.16.11.43.
bản này bằng
XP, những th
địa chỉ của X
ian để thực t
C:\tools\Cha
dùng scrip
ng bài viết tr
ngeIPAddres
g nó để thay
hững gì mà c
on Explicit
objWMIServic

objNetAdapter
strComputer
strAddress
_IP_address"
rComputer & "
elect * from W
IPAddress, arrS
ợp bởi kịch b
g cách đánh
hứ xảy ra đư
XP2 đã thay
thi
angeIPAddre
pt - Phần
rước chúng t
ss.vbs được
đổi địa chỉ I
chúng ta đã t
ce
r

"\root\cimv2")
Win32_Network
SubnetMask)
bản có tên XP
ChangeIPA
ược đưa ra dư
đổi từ 172.1
ess.vbs(23, 6
7: Xử lý

ta đã dùng đ
phát triển trư
IP trên máy t
thay đổi kịch
kAdapterConfi
P2. Máy tính
Address.vbs
ưới đây:
16.11.43 thà
6) SWbemOb
sự cố lỗi
đến kịch bản
ước đó và đã
tính từ xa. Đ
h bản:
iguration wher
h điều khiển
172.16.11.6
ành 172.16.1
bjectEx: The
i
ã sử
Đây
e
n xa
65 từ
1.65.

Làm thế nào chúng ta có thể giải quyết được các kết quả đó?


Giải pháp dễ dàng

Một thứ chúng ta có thể thực hiện là nói rằng “Hãy bỏ qua lỗi”. Đó là những gì được nói với
phương pháp này. Sau tất cả, bất kỳ quản trị viên trong thế giới thực nào cũng biết rằng CNTT
không phải là một khoa học đúng về mọi chi tiết và chúng thường kết thúc bằng việc áp dụng
“cách giải quyết khác” đối với các vấn đề nảy sinh khi không có những giải pháp đúng cho
chúng.

Vì vậy làm thế nào chúng ta có thể bỏ qua lỗi? Hãy thêm dòng dưới đây vào gần vị trí bắt đầu
của phần đầu (header):
On Error Resume Next

Hay nói cách khác, phần đầu (header) của chúng ta sẽ như sau:
Option Explicit
On Error Resume Next
Dim objWMIService
...

Bây giờ chúng ta không xem lỗi, và kịch bản của chúng ta làm việc. Tuy nhiên nó vẫn cần đến
nhiều thời gian để thực thi, thực tế có thể cần đến vài phút. Vậy cái gì sẽ tiếp diễn?

Xử lý sự cố thông báo lỗi

Các thông báo lỗi đôi khi khá khó hiểu và điều này là một trong những vấn đề đáng quan tâm.
Đây là một thông báo lỗi:
SWbemObjectEx: The remote procedure call failed.
Và đây là dòng mã tạo ra nó:
errEnableStatic = objNetAdapter.EnableStatic(arrIPAddress, arrSubnetMask)

Dòng mã này làm việc (ví dụ địa chỉ IP bị thay đổi trên máy tính mục tiêu) nhưng sau đó nó đưa

ra một thông báo lỗi. Tại sao lại như vậy? Chúng ta hãy bắt đầu bằng cách tìm hiểu
SwebObjectEx có ý nghĩa gì. Tìm kiếm nhanh trong MSDN có thể cho thấy
( />):
Extends the functionality of SWbemObject. This object adds the Refresh method for
SWbemRefresher objects.
(Mở rộng chức năng của SWbemObject. Đối tượng này bổ sung phương pháp Refresh cho các
đối tượng SwbemRefresher)
Vì vậy SwbemObjectEx cơ bản chỉ bổ sung thêm chức năng cho SWbemObject. Vậy
SwbemObject là gì?
Contains and manipulates a single WMI object class or instance.
(Gồm một đối tượng WMI hoặc một sự kiện)
Điều đó có nghĩa gì? Trang này cho chúng ta nhiều thông tin nhưng nó không thích hợp. Mặc dù
vậy trong các trường hợp, SwbemObject (SWbemObjectEx) là tất cả những gì bạn quản lý hay
truy vấn trong WMI. Trong kịch bản của chúng ta, chúng ta đang truy vấn lớp
Win32_NetworkAdapterConfiguration và trả về một bộ sưu tập các đối tượng gọi là
colNetAdapter thể hiện các adapter mạng trên máy tính. Vì vậy SWbemObjectEx (hoặc
SWbemObject) đã đề cập đến trong thông báo lỗi này làm đơn giản hóa đối tượng đang thể hiện
bản thân adapter mạng, ví dụ như objNetAdapter. Vậy tại sao objNetAdapter tạo ra lỗi.

Dẫu sao đây cũng dường như trở thành vấn đề. Theo một trong những chuyên gia có uy tín, có
thể một thành phần nào đó có trong hotfix cho Windows XP bị thay đổi cách mà lệnh gọi trả về
được tạo và được đệ trình khi câu lệnh gây ra lỗi được thực thi. Thông thường nếu gọi phương
pháp EnableStatic của một đối tượng được thuyết minh bằng một ví dụ của lớp
Win32_NetworkAdapterConfiguration hoàn toàn thành công nó sẽ trả về 0, có nghĩa là không có
lỗi. Còn nếu nó trả về 1 thì điều đó có nghĩa cần phải khởi động lại. Rõ ràng với Windows XP sẽ
không cần phải khởi động lại khi bạn thay đổi địa chỉ IP trên adapter mạng. Nếu với một vài lý
do, một hotfix có thể thay đổi gì đó trong WMI hoặc thành phần khác để Windows không khởi
động lại trước khi địa chỉ mới được thay thế trên máy mục tiêu, điều này có thể tạo ra một lỗi vì
cấu hình adapter mạng trên máy rơi vào trạng thái không rõ ràng cho tới khi máy tính này được
khởi động lại. Tuy nhiên khi kịch bản vẫn đang chạy trên máy trạm quản trị, khi cấu hình adapter

mạng của máy tính mục tiêu đang ở trạng thái không xác rõ ràng thì kết nối RPC giữa hai máy
tính là rất tồi trước khi kịch bản này kết thúc. Chính vì vậy sẽ xuất hiện lỗi ở đây.

Chí ít đó cũng là câu trả lời tốt nhất mà chúng tôi có được cho vấn đề này, và chúng tôi vẫn tiếp
tục nghiên cứu tỉ mỉ. Tuy nhiên hãy xem nếu chúng ta có thể xác nhận vì một lý do nào đó mà
vấn đề này được giải quyết, ví dụ lỗi đó chỉ liên quan với phương pháp EnableStatic của
Win32_NetworkAdapterConfiguration. Việc gì sẽ xảy ra nếu chúng ta cố gắng viết một kịch bản
khác để thực hiện một việc gì đó khác với adapter mạ
ng trên máy tính mục tiêu thay vì thay đổi
địa chỉ IP của nó? Ví dụ, làm cách nào để thay đổi được cổng mặc định thay vì địa chỉ IP trên
máy tính mục tiêu? Nếu điều đó được thực hiện thì ít nhất chúng ta cũng có thể kết nối thành
công từ máy trạm quản trị đến máy tính từ xa và gọi phương pháp WMI để thay đổi thiết lập
mạng trên nó.

Thay đổi cổng mặc định

Ở phần này chung tôi khuyên bạn nên quay lại đọc một chút phần 4 của loạt bài này, ở đó chúng
tôi đã giới thiệu cho bạn cách sử dụng MSDN để học cách sử dụng các thuộc tính và phương
pháp của Win32_NetworkAdapterConfiguration. Chúng tôi cho rằng bằng cách làm như vậy bạn
có thể tự viết một kịch bản như vậy. Hãy thử nó!

TẠM NGƯNG

Khi bạn đã cố gắng viết kịch bản cho riêng mình, đôi khi nó có thể làm việc, đôi khi không làm
việc. Nếu nó không làm việc, hãy thực hiện các bước dưới đây:

1. Đầu tiên vào trang MSDN của Win32_NetworkAdapterConfiguration class.

2. Tìm trên trang này phương pháp phải thực hiện để thay đổi cổng trên adapter mạng. Kiểm tra
nhanh trong trang sẽ cho bạn điều này:

SetGateways - Specifies a list of gateways for routing packets destined for a different subnet
than the one this adapter is connected to.
(SetGateways – một danh sách cổng dành cho việc định tuyến các gói đã được trù định trước đối
với subnet khác so với subnet mà adapter này được kết nối đến)
Đó chính là những gì chúng ta muốn, vì vậy kích chuột vào SetGateways để mở trang
SetGateways Method của Win32_NetworkAdapterConfiguration Class

3. Trên trang SetGateways Method này bạn sẽ thấy giải thích này:
The SetGateways WMI class method specifies a list of gateways for routing packets to a subnet
that is different from the subnet that the network adapter is connected to. This method only
works when the Network Interface Card (NIC) is in the static IP mode.
(Phương pháp lớp SetGateways WMI chỉ định một danh sách cổng dành cho việc định tuyến các
gói cho một mạng con khác đối với mạng con mà adapter mạng được kết nối đến. Phương pháp
này chỉ làm việc khi Network Interface Card (NIC) ở chế độ IP tĩnh)
Chính vì vậy bạn đã học được rằng máy tính mục tiêu phải có địa chỉ tĩnh trước khi bạn gọi
phương pháp này. Đọc kỹ hơn bạn có thể tìm thấy cú pháp cho việc gọi phương pháp này như
dưới đây:
SetGateways(A,B)

Ở đây A là biến chuỗi gồm địa chỉ IP cho cổng, B là một giá trị nguyên từ 1 đến 9999 chỉ định
tham số đó. Bây giờ bạn phải có đủ thông tin để viết kịch bản. Cách đơn giản nhất là bắt đầu với
kịch bản ChangeIPAddress.vbs gốc của chúng ta có trong phần 2 và thay đổi nó một chút cho tới
khi chúng ta có được một kịch bản mới như dưới đây:
'=========================
' NAME: ChangeGateway.vbs
'
'AUTHOR: Mitch Tulloch
'DATE: February 2007
'
'ARGUMENTS:

'1. gateway_address
'2. metric
'=========================-

Option Explicit

Dim objWMIService
Dim objNetAdapter
Dim strComputer
Dim strGateway
Dim arrGateway
Dim intMetric
Dim arrMetric
Dim colNetAdapters
Dim errGateway

'Check for missing arguments

If WScript.Arguments.Count = 0 Then
Wscript.Echo "Usage: ChangeGateway.vbs gateway_address metric"
WScript.Quit
End If

strComputer = "xp2"
strGateway = Wscript.Arguments.Item(0)
arrGateway = Array(strGateway)
intMetric = Wscript.Arguments.Item(1)
arrMetric = Array(intMetric)
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colNetAdapters = objWMIService.ExecQuery("Select * from Win32_NetworkAdapterConfiguration where

IPEnabled=TRUE")
For Each objNetAdapter in colNetAdapters
errGateway = objNetAdapter.SetGateways(arrGateway, arrMetric)
Next

'Display result or error code

If errGateway=0 Then
Wscript.Echo "Adapter's gateway has been successfully changed to " & strGateway
Else
Wscript.Echo "Changing the adapter's gateway was not successful. Error code " & errGateway
End If

Copy đoạn kịch bản này vào Notepad (trong chế độ Word Wrap đã bị bỏ) và lưu lại với tên
ChangeGateway.vbs. Giờ hãy kiểm tra nó. Truy cập vào máy từ xa XP2, mở cửa sổ lệnh nhập
vào lệnh ipconfig /all và kết quả như sau:
C:\>ipconfig /all

Windows IP Configuration

Host Name . . . . . . . . . . . . : XP2
Primary Dns Suffix . . . . . . . : contoso.com
Node Type . . . . . . . . . . . . : Unknown
IP Routing Enabled. . . . . . . . : No
WINS Proxy Enabled. . . . . . . . : No

×