2010-02-27 31 views
9

Tôi đang làm việc với ứng dụng WPF/C# nơi tôi cần khóa người dùng truy cập một tính năng cụ thể trong một khoảng thời gian. Về cơ bản, từ thời điểm một sự kiện nào đó xảy ra, tôi muốn ngăn chặn truy cập nhất định trong 24 giờ tới.Có thời gian tuyệt đối của Windows cho dấu thời gian không? (.NET)

Trường hợp đơn giản:

  • tổ chức sự kiện xảy ra, lưu dấu thời gian (sử dụng DateTime hoặc tương tự)
  • tài cố gắng truy cập khu vực 15 giờ sau đó, so sánh Bây giờ để đánh dấu thời gian ... khối
  • cố gắng tài để truy cập khu vực sau 25 giờ, hãy so sánh Hiện hành với dấu thời gian ... cho phép

Tất cả đều tốt. Tuy nhiên, người dùng có khả năng thay đổi thời gian của hệ thống, điều này khiến tôi phải rên rỉ. Họ có thể chỉ cần thiết lập thời gian hệ thống trước 24 giờ và ứng dụng của tôi sẽ không còn khôn ngoan hơn nữa.

Tôi giả định rằng việc thay đổi thời gian trong Windows sẽ chuyển sang đồng hồ thời gian thực của hệ thống ... vậy có đồng hồ hẹn giờ chạy độc lập với đồng hồ hệ thống không? Một người dùng không thể gây rối?

Bất kỳ thông tin chi tiết nào được đánh giá cao.

Trả lời

3

Environment.TickCount không thay đổi với các thay đổi về thời gian của hệ thống nhưng nó sẽ đặt lại khi khởi động lại. Một tùy chọn là dịch vụ web bảo mật HTTPS và chính sách chứng chỉ không cho phép lỗi xác thực chứng chỉ. Nếu không, nó sẽ là khá tầm thường để giả mạo phản ứng từ dịch vụ.

Quay lại khi lần đầu tiên tôi bắt đầu bán phần mềm, tôi rất hoang tưởng về vi phạm bản quyền và như vậy. Không phải là tôi đề xuất mục đích của bạn là như nhau. Nhưng tôi đã đi đến kết luận rằng mọi người thường sẽ không gây rối với thời gian hệ thống của họ bởi vì nó vít lên rất nhiều thứ khác trên máy tính của họ mà nó không có giá trị phức tạp. Các ứng dụng tự nhiên khác nhau sẽ có các yêu cầu về tính toàn vẹn khác nhau nhưng tôi chỉ nghĩ rằng tôi sẽ thêm bit này.

+0

nhưng cả hai đều phụ thuộc vào môi trường của người dùng. Điều gì xảy ra khi khởi động lại (đối với Environment.TickCount) hoặc nếu internet được rút phích cắm (dịch vụ web)? –

+2

@Stephen, tôi đặc biệt lưu ý rằng Environment.TickCount đặt lại khi khởi động lại. Đối với nếu dịch vụ không có sẵn - nếu ứng dụng yêu cầu mức độ toàn vẹn đó không được phép hoạt động ngoại tuyến. – Josh

+1

+1 Phần quan trọng của câu trả lời này không chỉ là nguồn thời gian bên ngoài mà còn là lựa chọn thực, nhưng nếu bạn thực sự muốn chắc chắn, bạn cần tự bảo vệ mình trước những người dùng độc hại giả mạo dịch vụ thời gian - vì thế cần có SSL . –

1

Không thực sự. Bộ hẹn giờ tuyệt đối đáng tin cậy duy nhất là bộ hẹn giờ bên ngoài, dưới sự kiểm soát của bạn hoặc sự kiểm soát của người bạn tin tưởng, chẳng hạn như một trong những máy chủ thời gian trên Internet (ví dụ: time.windows.com). Bạn có thể truy cập chúng bằng cách sử dụng thư viện NTP hoặc SNTP, chẳng hạn như thư viện được đăng tại http://www.codeproject.com/KB/IP/ntpclient.aspx. Tất nhiên, trong trường hợp này (theo nhận xét cho câu trả lời của Josh), bạn cần phải xem xét việc cần làm nếu bạn không thể liên lạc với máy chủ thời gian, ví dụ: người dùng ngắt kết nối máy tính khỏi mạng.

Bạn có thể sử dụng Environment.TickCount để có thời gian kể từ khi hệ thống khởi động, người dùng không thể gây rối - nhưng nếu người dùng hoặc người khác khởi động lại hệ thống thì điều này sẽ được khởi động lại, vì vậy nó không đáng tin cậy mục đích bạn yêu cầu.

1

Không, không có kiến ​​thức tuyệt đối về thời gian trong Windows, làm cách nào có thể? Nếu bạn cần một dấu thời gian đáng tin cậy, sau đó bạn cần để có được một từ một vị trí đáng tin cậy trên internet. Người dùng không thể gây rối.

Bạn có thể lấy thời gian từ dịch vụ Thời gian mạng hoặc truy cập www.time.gov và tiết kiệm thời gian ra khỏi html mà bạn nhận được. http://www.time.gov/about.html

Hoặc chỉ sống với một vài người dùng sẵn sàng đặt đồng hồ của họ về phía trước.

1

Để có được một thời gian tem tuyệt đối, hãy thử một yêu cầu NTP với một trong những (miễn phí) NIST time servers

1

Sử dụng một dịch vụ Windows, bạn có thể giả mạo một thời gian trôi qua tuyệt đối, do khai thác gỗ khi thời gian hệ thống được cập nhật.

Điều này sẽ yêu cầu bạn có thể cài đặt dịch vụ trên máy, tất nhiên, và người dùng của bạn không đủ thông minh để nhổ tận gốc.

Dưới đây là một số thông tin về việc bẫy thông báo WM_TIMECHANGE trong dịch vụ .NET: detecting a wm_timechange event in a .net windows service

+1

Có thể đáng lưu ý rằng người dùng vẫn có thể thay đổi thời gian trong cấu hình BIOS, vì vậy, ngay cả công việc này cũng có thể dễ dàng bị phá vỡ. – overslacked

Các vấn đề liên quan