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.
Hình 1
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)
Hình 2
Ở đây chúng ta phải nhập vào đường dẫn đến file NTUSER.DAT (Hình 3)
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’.
Hình 4
Kích OK và cấu trúc hive sẽ xuất hiện như trong hình 5
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.
Hình 6
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)