Bài viết này sẽ giới thiệu cho bạn cách dùng kịch bản để dọn dẹp
registry hoặc thay đổi các profile của người dùng trên một máy tính.
Chúng tôi cũng giới thiệu cách sử dụng phương pháp này như thế nào đối
với kịch bản khởi động của máy tính bên trong Group Policy Object (GPO)
để thay đổi tất cả profile người dùng trong miền, site hoặc OU, thay
đổi các thiết lập registry người dùng bằng kịch bản khởi động máy
tính…. Trong một số trường hợp bạn có thể được yêu cầu xóa, thêm, hoặc
thay đổi một số phần của registry – đối với tất cả người dùng trên máy
tính cùng một lúc.
Trong hầu hết các trường hợp chúng tôi sẽ
sử dụng Group Policy Object đối với người dùng để thêm, thay đổi một
giá trị, tuy nhiên khi nói đến việc giải phóng các giá trị thì đôi khi
sẽ sử dụng các kịch bản. Cũng vậy, chúng tôi sẽ thực hiện một nhiệm vụ
cleanup trong một tiến trình cụ thể mà không phải đợi tất cả người dùng
đăng nhập. Bài báo này sẽ thể hiện cho bạn cách thực hiện các vấn đề
trên một cách dễ hiểu nhất.
Chúng tôi sẽ xem xét cách nào có
thể thực hiện việc thay đổi registry bằng một kịch bản – và kết hợp nó
với một GPO trên máy tính (khởi động và tắt máy), thay vì sử dụng một
GPO trên đối tượng người dùng (đăng nhập hoặc đăng xuất).
Tại sao chúng ta lại thực hiện điều này?
Vậy
tại sao đó là một phương pháp thông minh? Có thể bạn muốn thực hiện
“cleanup” suốt đêm, và muốn bảo đảm rằng giá trị nào đó được thay đổi
(xóa, bổ sung hoặc thay đổi) vào sáng hôm sau – điển hình các khóa
‘Run’ hay ‘RunOnce’ trong phần người dùng của registry sau khi bị virus
tấn công – được kết hợp với thủ tục Wake-On-Lan (WOL) và như vậy bạn sẽ
không còn có thời gian để về nhà.
Trong một số trường hợp khác
người dùng có thể không có các đặc quyền cần thiết để thực hiện cleanup
hoặc nhiệm vụ thay đổi. Khóa registry bạn muốn thay đổi có thể được bảo
vệ bằng một chính sách bảo mật, hãy làm cho nó không có hiệu lực để có
thể sử dụng GPO của người dùng (khi nó chạy trong nội dung của người
dùng). Các kịch bản khởi động máy tính thực thi trong nội dung của tài
khoản hệ thống –có thể hữu dụng trong việc ghi nhớ nhiều tình huống.
Cảnh báo! Mã
được thể hiện trong bài báo này được chỉ được lập ra cho mục đích kiểm
tra – sử dụng nó trong sản xuất có thể gây cho bạn sự rủi ro. Mã trong
bài là mã đơn giản để bạn đọc có thể dễ hiểu. Phải xác nhận tính năng
kịch bản trong môi trường kiểm tra trước khi thực hiện phần này trong
sản phẩm. Bạn cũng có thể gộp thêm vào các chức năng quản lý lỗi, ghi
chép,… thay đổi như bạn muốn!
Các thông tin cần biết thêm Trước khi đi sâu vào trong code, một số điều về registry phải được làm rõ ràng.
Thông
thường thì mọi người đều cho rằng phần HKEY_USERS của registry ở một
nơi mà bạn có thể nhìn thấy trong profile cục bộ trên máy tính. Tuy
nhiên sự thật là danh sách profile của HKEY_USERS được nạp trên máy để
biết được các profile là tích cực trong bộ nhớ. Ngay khi người dùng
đăng nhập vào máy tính, mục nhập sẽ xuất hiện trong phần registry này.

Như
những gì thể hiện trong hình 1, bạn có thể thấy được một số profile đã
được nạp – cho dù chỉ một người dùng đăng nhập vào giao diện. Khi người
dùng đăng xuất, Registry Hive (các nhánh trong registry) sẽ không được
nạp và nhanh chóng biến mất trong mục HKEY_USERS. Đây là một giải thích
vắn tắt về các mục được nạp:
“.DEFAULT” là profile người dùng
mặc định – không phải là thứ mà tất cả người dùng sẽ nhìn thấy (giống
như một profile công cộng hoặc cho tất cả người dùng) và không thể sao
chép sang máy tính khác. Bằng các giá trị mặc định trong profile này
bạn có thể thay đổi tùy chọn như màn hình đăng nhập (Ctrl+Alt+Delete),
các thiết lập phím Num/Caps Lock ban đầu,…
"S-1-5-18” là bộ nhận dạng bảo mật “Hệ thống” (SID)
"S-1-5-19" là “LocalService” SID
"S-1-5-20" là “NetworkService” SID
Một
profile hoặc SID bắt đầu là "S-1-5-21-" và kết thúc "-500" là SID của
tài khoản quản trị viên. Các profile người dùng tích cực nằm trong tất
cả các mục khác có trong phần HKEY_USERS. Trong các ví dụ kịch bản
trong bài, các profile là không thể chạm vào – chỉ người dùng “thông
thường” mới có thể được chạm tới – bạn có thể thay đổi một cách dễ dàng
bằng cách xóa một số dòng trong code.
Load Hive
Nếu bạn muốn thay đổi profile của một người dùng không đăng nhập hiện hành thì phải có ít nhất hai tùy chọn:
1-Load hive thủ công trong Regedit
2-Tạo một kịch bản “Load hive” đó
Chúng
ta hãy quan sát tùy chọn đầu tiên. Nếu bạn mở Regedit (Start > Run
> Regedit) và tìm đến mục HKEY_USERS (bạn phải kích hoặc đánh dấu
vào nó), sau đó vào menu File, sẽ có thể chọn “Load Hive…” (xem hình 2)

Ở đây chúng ta phải nhập vào đường dẫn đến file NTUSER.DAT (Hình 3)

File
NTUSER.DAT được đặt trong thư mục profile người dùng. Ở trên, chúng ta
có thể nhìn thấy file NTUSER.DAT của người dùng ‘test2’. File này được
đặt trong thư mục “C:\Documents and Settings\test2\”– trên Windows
Vista, các profile người dùng thường được lưu trong thư mục
“C:\Users\”. Nếu không thể thấy file NTUSER.DAT như trong hình 3 thì
bạn nên vào tùy chọn Tools > Folder và chọn “Show hidden files and
folders”.
Khi thực hiện load hive tạm thời, chúng ta cần đặt
tên cho chúng. Trong hình 4 và các ví dụ kịch bản chúng ta sử dụng tên
là ‘TmpLoadHive’.

Kích OK và cấu trúc hive sẽ xuất hiện như trong hình 5

Trong
hình 5, ‘TmpLoadHive’ có thể được mở rộng để xem cấu trúc của hive
người dùng được nạp – nó trông giống như các registry của người dùng
khác và phân biệt với nhau bằng HKEY_CURRENT_USER (HKCU) khi họ đăng
nhập vào máy tính.
Khi đã thực hiện xong, bạn hãy nhớ upload
hive của người dùng bằng các chọn ‘TmpLoadHive’ hive và vào File menu
> “Unload Hive…” như trong hình 6
Quan trọng
Nếu không
thực hiện unload hive thì bạn không thể thực hiện load hive lại cho tới
khi khởi động lại máy tính, bởi vì bạn không thể load một hive đã được
nạp.

Thủ
tục đó sẽ rất khó chịu nếu phải thực hiện nó cho tất cả profile người
dùng trên tất cả máy tính trong miền của bạn? Tuy nhiên may thay chúng
ta có một phương pháp khác bằng việc sử dụng “ônh bạn già tốt bụng”
REG.EXE.
Sử dụng Reg.exe để cứu nguy
Lệnh REG.EXE. có
hai tham số rất hữu dụng: LOAD và UNLOAD. Chúng thực hiện chính xác
những gì đã thực hiện thủ công ở trên. Chỉ cần phải chỉ ra tên hive tạm
thời và đường dẫn đầy đủ đến file NTUSER.DAT, file mà chúng ta muốn
load vào bộ nhớ.
Bạn có muốn một kịch bản mẫu? OK, để thiết lập background cho profile người dùng mặc định bạn có thể chạy code dưới đây:
REG.EXE LOAD HKU\DefU "C:\Documents and Settings\Default User\ntuser.dat"
REG.EXE ADD "HKU\DefU\Control Panel\Desktop" /v Wallpaper /d "C:\Windows\Wallpaper.bmp" /f
REG.EXE UNLOAD HKU\DefU
Đoạn code ở trên sẽ LOAD hive cho profile người dùng mặc định
vào hive tạm thời gọi là “DefU” trong “HKEY_USERS” của cơ sở dữ liệu
registry. Sau đó nó sẽ thiết lập một giá trị registry cho background
của profile người dùng mặc định, nó là profile sẽ được tự động copy khi
một người dùng mới được tạo (thời điểm đầu khi họ đăng nhập). Cuối cùng
nó sẽ UNLOAD hive tạm thời đó.
Vậy có thể tìm file Ntuser.dat trong kịch bản bằng cách nào?
Khi
muốn thực hiện load hive cho tất cả người dùng trên máy tính, chúng ta
sẽ muốn tìm tất cả profile người dùng trên máy tính đó một cách an toàn
và dễ dàng ở mức có thể. Chúng ta sẽ tìm đến thư mục trong “Documents
and Settings” hoặc “Users” trên Vista/Windows Server 2008 – nhưng có
một phương pháp khác tốt hơn.
Trong giá trị registry dưới đây:
“HKLM\Software\Microsoft\Windows NT\CurrentVersion\ProfileList\XXX\ProfileImagePath”
bạn
sẽ tìm thấy thư mục profile đúng cho tất cả người dùng cục bộ. XXX là
SID của người dùng, vì vậy bằng cách đi qua tất cả các key này, chúng
ta sẽ có một đường dẫn đầy đủ cho các file NTUSER.DAT cục bộ.
Chúng
tôi đã viết một hàm VB Script để liệt kê danh sách các thư mục profile
người dùng trên máy tính (trong một chuỗi được phân biệt bằng ký tự
“|”) – nó tồn tại cục bộ và từ xa. Các chức năng loại trừ profile của
Systemprofile, LocalService, NetworkService và tài khoản Local
Administrator – trong hầu hết các trường hợp không có yêu cầu cleanup,
nhưng các câu lệnh ElseIf có thể dễ dàng loại trừ được nếu cần. Hàm này
có tên gọi là “GetUserProfileDirsFromRegistry” và bạn có thể tìm thấy ở
đây.
Bạn có thể hỏi gì về các profile Roaming? Các file
NTUSER.DAT là tất cả những gì chúng ta cần vì vậy nếu muốn thay đổi
profile người dùng roaming thì bạn nên viết một kịch bản duyệt thẳng
đến vị trí mạng của profile roaming đó mà bạn có…
Xóa giá trị hoặc khóa
Giờ
thì chúng ta đã biết cách thực hiện load hive (hoặc gán) bên trong một
kịch bản, chúng ta chỉ cần thay đổi một số thứ bên trong hive đó. Bạn
có thể có đến hàng trăm thứ bên trong đó để thực hiện, nhưng chúng tôi
chỉ sử dụng hai chức năng – cả hai chức năng này đều dùng để xóa các
phần bên trong hive đã được load. Đây là một giải thích:
Sau khi một virus tấn công, bạn có thể phải thực hiện việc cleanup khóa “Run”:
“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run”
cho tất cả người dùng cục bộ. Có thể một số malware đã tạo một mục mà
bạn cần phải xóa chúng – với mục đích đó chúng tôi đã tạo một thường
trình con DeleteSingleValueFromTmpLoadHive. Thường trình này có thể xóa
một giá trị trong registry.
Bạn cũng có thể muốn xóa toàn bộ
một khóa registry, gồm có các khóa con và các giá trị,…
“HKEY_CURRENT_USER \Software\Windowsecurity.com”, với mục đích đó chúng
tôi sẽ gộp cả thường trình con
DeleteKeyAndSubsFromTmpLoadHive Sự kết hợp tuyệt vời
Khi
kết hợp những gì đã học được ở đây và đang thực hiện một số kịch bản
VBS cũ, chúng ta có một kịch bản thực hiện các nhiệm vụ dưới đây:
Tìm tất cả các thư mục profile trên máy tính cục bộ bằng cách đọc các giá trị registry được đề cập ở trên.
Bỏ qua các profile có liên quan đến hệ điều hành, gồm có tài khoản quản trị viên cục bộ
Thực hiện load hive cho registry từ các file NTUSER.DAT bên trong thư mục profile
Xóa khóa registry, gồm có tất cả các khóa con, các giá trị,… cho mỗi profile người dùng được gắn (load).
Xóa giá trị registry cho mỗi profile người dùng được gắn (load) **
* ”\Software\Windowsecurity.com” (and all sub keys/values)
** ”\Software\Microsoft\Windows\CurrentVersion\Run\VirusExecutable”
Kịch
bản không nhắc bạn xác nhận khi nó hoàn tất và bất kỳ lỗi nào cũng sẽ
được triệt tiêu (sử dụng cách quản lý ‘On Error Resume Next’). Hành vi
này có thể được thay đổi hợp với nhu cầu của bạn. Vì đây không phải là
một bài về kịch bản thực sự nên chúng tôi không thể đi sâu vào trong
code của nó, tuy nhiên nếu bạn có một chút kiến thức về kịch bản thì có
thể đưa ra những ý tưởng tốt về những gì sẽ thực hiện.
Một ví
dụ code hoàn thiện có thể dowload và xem tại đây. Nó đã được kiểm tra
trên Microsoft Windows XP, Windows Server 2003 và Windows Vista.
Hệ thống
Ở
đây có thể “vấp phải” một máy tính đơn lẻ, máy tính cục bộ từ đó mà
chúng ta thực thi kịch bản – hoặc để chính xác hơn: tất cả các hive
người dùng trên nó. Có một giới hạn lớn ở đây: người dùng nhìn chung
đều không phải là các quản trị viên, và vì vậy họ sẽ không thể thay đổi
registry cho những người dùng khác. Điều này có nghĩa là chúng tôi muốn
chạy kịch bản quản trị nội bộ cho các máy tính trong miền – hoặc thực
hiện một số thứ có hiệu quả cao: sử dụng Group Policy ở mức máy và cấu
hình một kịch bản khởi động máy.
Một thứ thú vị về kịch bản
khởi động máy tính là đầu tiên trên tất cả nó phải chạy trong ngữ cảnh
Local System, đây là một tài khoản mạnh (vì vậy bạn có thể thực hiện
hầu hết các việc), và thứ hai đó là nó có thể thiết lập để thực thi
trên hàng nghìn máy tính trong vòng một vài phút, bằng cách đặt GPO
trên miền Active Directory, site hoặc Organizational Unit (OU)
Bạn
cần phải biết rằng, lần load đầu tiên của GPO máy tính mới có thể thất
bại, trong trường hợp này chúng ta sẽ phải khởi động lại máy tính (và
có thể thực hiện lệnh GPUPDATE /FORCE cho chắc chắn). Bạn cũng nên đưa
ra một kịch bản thời gian để thực thi trước khi đăng nhập – cả hai đều
liên quan đến các vấn đề có thể xuất hiện khi chính sách này được nạp
lúc hệ thống khởi động. Tuy nhiên chúng tôi sẽ không nhắm vào các tính
năng sâu trong GP ở bài này.
Nếu có chức năng Wake-On-LAN
(WOL) trên mạng thì bạn có thể khởi động các máy tính suốt đêm để thực
hiện việc cleanup và tắt máy tính sau đó. Bằng cách kết hợp kịch bản
WOL và Group Policy, chúng ta có thể thực hiện cleanup một cách có hiệu
quả trong một thời gian ngắn hoặc một số công việc mà chúng ta muốn
thực hiện mà không cần phải làm quá nhiều công việc: Khả năng sáng tạo
không hạn chế!
Kết luận
Chúng ta đã thấy được cách kết
hợp viết kịch bản và các kịch bản khởi động máy tính trong Group Policy
để thực hiện việc cleanup một cách có hiệu quả. Bây giờ chúng ta có thể
cập nhật profile người dùng thậm chí khi họ không được load vào bộ nhớ
- không cần đăng nhập vào hệ thống.
Phương pháp này có thể
được phát triển xa hơn nữa để thay đổi các phần khác của profile, có
thể là các file và thư mục cho tất cả người dùng trên máy tính.
Văn Linh (Theo Window Security)