2012-04-06 5 views
1

Ich möchte auch fragen, ob meine App läuft, dann kann ich einen Daemon-Prozess erstellen, um dies zu überprüfen (vorausgesetzt, dass dieser Prozess läuft die ganze Zeit).Ist es möglich, dass meine Anwendung eine Zeit anzeigt, unabhängig davon, ob systime geändert wurde?

Die Situation ist so etwas wie diese: Der Benutzer ändert das sys Datum vom 1. Januar 2012 bis zum 1. Januar 2013, aber die Anwendung noch die 1. Januar 2012

Ich bin mit einem Windows-Betriebssystem verwenden.

+2

Eine Problemumgehung: Holen Sie sich die Zeit von einer anderen Quelle (Webdienst, zentraler Server usw.) statt von der lokalen Maschine. – Keith

+0

Ich vergaß zu erwähnen, ich möchte keine externe Quelle, um die Zeit zu synchronisieren –

+0

@NitinChhajer: Nein dann. –

Antwort

2

Es gibt keine zuverlässige Möglichkeit, die Zeit zu verfolgen, ohne sich auf die Systemzeit oder von einer externen Quelle (Webservice oder NTP) verlassen zu müssen, da das Datum vom Benutzer auf verschiedene Arten manipuliert werden kann.

Ihre angenommene Option, die Zeit mit einem Hintergrunddienst zu verfolgen, kann eine Zeitänderung während eines Neustarts (z. B. aus dem BIOS) nicht verhindern. Was ist also der Zweck, interne Zeit zu behalten? Es bezieht sich auf ein Kopierschutzsystem (wie Testzeitlimit)?

Wenn ja, können Sie einen Blick auf eine Bibliothek wie CryptoLicensing nehmen, die eine Ermittelt Datum Manipulieren algoritm haben Anspruch und kann Ihnen nützlich sein.

aber ich denke, dass die Art und Weise versuchen soll Überblick über die Zeit intern mit einer statischen Klasse Datum/Zeit Tempern, anstatt zu versuchen, um zu verfolgen Zeit zu erfassen, indem Sie sich ...

1

Es gibt keine Möglichkeit zu erreichen, wonach Sie fragen, oder zumindest weiß ich es nicht.

Ich nehme gerade dies ist ein Software-Studie Lizenzierungsproblem, wenn ja, gibt es mehrere workarrounds sind, wie

  • wie es vorgeschlagen wurde, überprüfen Sie die Echt Datum Zeit von entfernten Quelle, einige sichere Web-Service .

  • Testversion nicht pünktlich, aber auf Ausführung zählen oder speichern zählen. Speichern Sie diese Werte irgendwo in der Registry oder im temporären Ordner des Benutzers in der verschlüsselten Datei.

Hoffe das hilft.

0

Sie halten konnten , wie die interne Datumszeitklasse unten. Zu Beginn des Programms, initialisiert es mit:

DateTime now = InternalDateTime.Now; 

Sie können nun die Systemzeit ändern und haben beiden Male in der Hand, auch zur Messung von lokaler Taktdrift verwendet werden könnte, wenn Sie mit einem Zeitserver synchronisieren und das ist deine Sache.

MessageBox.Show(
    DateTime.Now.ToString()+Environment.NewLine+ 
    InternalDateTime.Now.ToString()); 

und greifen Sie auf die gleiche Weise statt DateTime.Now zu verwenden, verwenden InternalDateTime.Now Es wird auf die Zeit hält sogar WHE eine Systemzeitänderung auftritt.

public class InternalDateTime 
{ 
    private static volatile InternalDateTime _instance; 
    private static object syncRoot = new Object(); 
    //threadsafe singleton 
    public static InternalDateTime Instance 
    { 
     get 
     { 
      if (_instance == null) 
      { 
       lock (syncRoot) 
       { 
        if (_instance == null) 
         _instance = new InternalDateTime(); 
       } 
      } 

      return _instance; 
     } 
    } 

    private Stopwatch sw; 
    private DateTime dtAppStart; 

    private InternalDateTime() 
    { 
     dtAppStart = DateTime.Now; 
     sw = new Stopwatch(); 
     sw.Start(); 
    } 
    public static DateTime Now { get { return InternalDateTime.Instance.DateTimeNow; } } 

    public DateTime DateTimeNow 
    { 
     get 
     { 
      return new DateTime(dtAppStart.Ticks).AddMilliseconds(sw.ElapsedMilliseconds); 

     } 
    } 
} 
Verwandte Themen