[C#] Hướng dẫn làm phần mềm cập nhật thời gian cho windows

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:

413

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

update_time-work-flow

Ở đâ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.

414

Chúng ta cần sửa lại để khởi chạy với quyền admin như sau

415

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

 

 

Bình luận về bài viết này