Dẫn nhập
Xin chào, mình là Phong.
Hôm nay nhân tiện mới lấy máy tính từ chỗ bảo hành về bị sai giờ, trước đây lại cũng gặp tình trạng này ở một số máy, mà cái auto update time mặc định của windows bị lỗi, không tự update nên mình thử làm tool cập nhật thời gian. Do thành công nên mình làm 1 bài hướng dẫn, cũng là để blog đỡ mốc :)) )
Thành quả
Khi làm xong ứng dụng trông sẽ như này:
Thật ra cái hình hơi lừa tình. Vì nó không tự động update, mà phải click bằng tay :))
Cơ chế hoạt động
Ở đây ta “lợi dụng” response trả về của 1 request sẽ có kèm thời gian. Phần mềm của ta sẽ gửi 1 request đến server của minhphong306 (đùa đấy, thực ra là của wordpress, hihi) ở địa chỉ http://www.minhphong306.wordpress.com. Ta hoàn toàn có thể thay bằng server của microsoft, google hay facebook. Lưu ý là không nên là https, chỉ là http thôi. Vì sao? Vì thi thoảng mình test nó có exception là không thể tạo request đến secure server gì đó (quên mất không chụp lại màn hình, test lại nó ứ lỗi nữa :(( ). Do vậy mình sẽ thay bằng http cho ổn định.
Các kĩ thuật cần biết
1. Gửi request, lấy về response, bóc tách datetime
private DateTime getOnlineDate(String server) { var myHttpWebRequest = (HttpWebRequest)WebRequest.Create(server); var response = myHttpWebRequest.GetResponse(); string todaysDates = response.Headers["date"]; return DateTime.ParseExact(todaysDates, "ddd, dd MMM yyyy HH:mm:ss 'GMT'", CultureInfo.InvariantCulture.DateTimeFormat, DateTimeStyles.AssumeUniversal); }
2. Set system datetime
Đẻ đặt thời gian cho hệ thống, ta cần gọi hàm SetSystemTime của Window API (trong kernel32.dll).
Code struct system time
[StructLayout(LayoutKind.Sequential)] public struct SYSTEMTIME { public short wYear; public short wMonth; public short wDayOfWeek; public short wDay; public short wHour; public short wMinute; public short wSecond; public short wMilliseconds; }
Code khai báo hàm set thời gian cho hệ thống, sử dụng kenel32.dll
[DllImport("kernel32.dll", SetLastError = true)] public static extern bool SetSystemTime(ref SYSTEMTIME st);
Trước khi set time cho hệ thống, cần chuyển đổi thành toUniversalTime.
var date_online = getOnlineDate(server); var date_converted = date_online.ToUniversalTime(); SYSTEMTIME st = new SYSTEMTIME { wYear = (short)date_converted.Year, wMonth = (short)date_converted.Month, wDay = (short)date_converted.Day, wHour = (short)(date_converted.Hour), wMinute = (short)date_converted.Minute, wSecond = (short)date_converted.Second, wMilliseconds = (short)date_converted.Millisecond }; SetSystemTime(ref st);
Để set được system datetime, ứng dụng của chúng ta cần có quyền Admin (đối với win 7 trở lên).
Để ứng dụng mặc định chạy được dưới quyền admin, chúng ta làm như sau :
Chuột phải vào project –> add item –> Application Manifest file.
Mặc định sẽ có dòng khởi chạy thông thường như sau.
Chúng ta cần sửa lại để khởi chạy với quyền admin như sau
Tổng kết
Như vậy là tớ đã hướng dẫn xong mọi người đã có thể tự làm 1 ứng dụng auto update time cho riêng mình.
Dưới đây là link source code: https://github.com/minhphong306/Auto-Update-Time/
Good luck