2010-02-27 12 views
9

Estoy trabajando con una aplicación WPF/C# donde tengo que bloquear a los usuarios el acceso a una función en particular durante cierto tiempo. Básicamente, desde el momento en que ocurre un determinado evento, quiero evitar cierto acceso durante las próximas 24 horas.¿Hay un tiempo absoluto de Windows para las marcas de tiempo? (.NET)

El caso simple: sucede

  • acontecimiento, ahorre marca de tiempo (usando DateTime o similar)
  • usuario intenta acceder a la zona de 15 horas más tarde, comparar ahora a marca de tiempo ...
  • bloque
  • intentos de los usuarios para acceder al área 25 horas después, comparar ahora con la marca de tiempo ... permitir

Todo bien. Sin embargo, el usuario tiene la capacidad de cambiar la hora del sistema, lo que me encanta. Simplemente pueden configurar el sistema con 24 horas de anticipación y mi aplicación no será más inteligente.

Supongo que cambiando el tiempo en Windows se abre paso al reloj de tiempo real del sistema ... ¿hay algún temporizador de ejecución libre que sea independiente del reloj del sistema? ¿Uno con el que el usuario no puede meterse?

Cualquier idea es apreciada.

Respuesta

3

Environment.TickCount no cambia con los cambios de tiempo del sistema pero se restablece al reiniciar. Una opción es un servicio web seguro HTTPS y una política de certificados que no permite fallas de validación de certificados. De lo contrario, sería bastante trivial falsificar la respuesta del servicio.

Cuando comencé a vender software, era muy paranoico con la piratería y demás. No es que sugiera que tus propósitos sean los mismos. Pero llegué a la conclusión de que, en general, las personas no se meterán con el tiempo de su sistema porque les arruina muchas otras cosas en su computadora que no valen la pena. Las aplicaciones naturalmente diferentes tendrán requisitos de integridad diferentes, pero pensé que agregaría este bit.

+0

pero ambos de ellos son depende del entorno del usuario. ¿Qué sucede al reiniciar (para Environment.TickCount) o si se desenchufa internet (servicio web)? –

+2

@Stephen, específicamente noté que Environment.TickCount se reinicia al reiniciar. En cuanto a si el servicio no está disponible, si la aplicación requiere ese nivel de integridad, no se debe permitir que funcione fuera de línea. – Josh

+1

+1 La parte importante de esta respuesta es que no solo es una fuente de tiempo externa la única opción real, pero si realmente quieres estar seguro, necesitas protegerte contra usuarios malintencionados que falsifican el servicio horario, de ahí la necesidad de SSL . –

1

No realmente. El único temporizador absoluto confiable es uno externo, bajo su control o el de alguien en quien confía, como uno de los servidores de tiempo en Internet (por ejemplo, time.windows.com). Puede acceder a estos usando una biblioteca NTP o SNTP como la publicada en http://www.codeproject.com/KB/IP/ntpclient.aspx. Por supuesto, en este caso (según un comentario a la respuesta de Josh) debe considerar qué hacer si no puede comunicarse con el servidor horario, p. el usuario desconecta la máquina de la red.

Puede usar Environment.TickCount para obtener el tiempo transcurrido desde que se inició el sistema, con lo cual el usuario no puede meterse, pero si el usuario u otra persona reinicia el sistema, se reiniciará, por lo que no es confiable. el propósito que requieres

1

No, no hay un conocimiento absoluto de qué hora es en Windows, ¿cómo podría ser? Si necesita una marca de tiempo confiable, entonces necesita obtener una de una ubicación confiable en internet. Uno con el que el usuario no puede meterse.

Puede obtener el tiempo de un servicio de tiempo de red, o vaya a www.time.gov y elimine el tiempo de espera del html que recibe. http://www.time.gov/about.html

O simplemente vive con los pocos usuarios dispuestos a configurar su reloj.

1

Para tener una marca de tiempo absoluta, tratar una solicitud de NTP para uno de los (gratis) NIST time servers

1

El uso de un servicio de Windows, usted podría fingir un tiempo transcurrido absoluta, por la tala cuando la hora del sistema se actualiza.

Esto requeriría que pueda instalar un servicio en la máquina, por supuesto, y que sus usuarios no sean lo suficientemente inteligentes como para eliminarlo.

Aquí hay algo de información sobre atrapando el mensaje WM_TIMECHANGE en un servicio .NET: detecting a wm_timechange event in a .net windows service

+1

Puede valer la pena señalar que los usuarios aún pueden cambiar el tiempo en la configuración del BIOS, por lo que incluso este trabajo puede evitarse fácilmente. – overslacked

Cuestiones relacionadas