2008-11-26 9 views
6

Ich habe darüber nachgedacht, wie ein Programm erstellt wird, das nur für X Zeitraum (innerhalb einer C# -App) gültig wäre.C# Datum in Programm eingeben, wenn kompiliert

Was ich dachte war, dass Sie das aktuelle Datum als eine Konstante innerhalb des Programms haben würde und es würde prüfen, ob es X Tage älter ist als das. Natürlich möchte ich das Datum oder das X nicht außerhalb des Programms speichern, da es manipuliert werden kann.

Was ich auch nicht möchte dies regelmäßig manuell ändern und neu kompilieren und bereitstellen. Gibt es eine Möglichkeit, eine Variable als aktuelles Datum festzulegen, wenn sie kompiliert wird?

Ich könnte eine Batchdatei haben, die es kompilieren und die neue exe auf dem Distributionsserver bereitstellen würde.

Dank

Antwort

6

Vorkompilierungsrichtlinien sind Ihr Schlüssel hier. Sie können eine Konstante in Ihrer Anwendung erstellen und sie beim Kompilieren festlegen lassen.

Stellen Sie sicher, dass Sie Ihren Code jedoch verschleiern. Jemand könnte es leicht zerlegen und die Konstante manipulieren. Eine andere Lösung ist, Ihre Software "nach Hause" zu rufen, um sich selbst zu registrieren. Auf diese Weise werden die Registrierungsinformationen auf Ihrem Server und nicht auf dem Computer gespeichert. Es gibt auch Pakete von Drittanbietern, die die gleiche Sicherheit ausführen, die Sie suchen, aber sie sind teuer!

+0

coole Idee. Obfuscate ist ein Muss (nicht, dass ich weiß, wie noch!: P) .. danke – Jon

+0

Sie haben auch Recht über das Problem disassemble, aber in C# nicht sicher, es gibt eine gute Möglichkeit, das zu vermeiden. – Jon

0

Das Problem mit Net ist, dass es einfach wäre, das Datum, das Sie verwenden möchten, dekompilieren und ändern muss konstant. Sie müssen möglicherweise an etwas anderes denken.

Sie könnten es in der Registrierung schreiben, aber dann werden die Leute diesen Wert bearbeiten.

Sie sind keine perfekte Lösung, aber ein Konto zu haben, die mit einer externen (Web-) Server validieren ist eine gute Idee.

5

Check out AssemblyInfo.cs-Datei im Ordner Eigenschaften in Ihrem Projekt:

// You can specify all the values or you can default the Build and Revision Numbers 
// by using the '*' as shown below: 
// [assembly: AssemblyVersion("1.0.*")] 
[assembly: AssemblyVersion("1.0.0.0")] 
[assembly: AssemblyFileVersion("1.0.0.0")] 

Ändern Sie diese an:

[assembly: AssemblyVersion("1.0.*")] 
[assembly: AssemblyFileVersion("1.0.0.0")] 

Dann anderswo in der Versammlung, verwenden Sie diese:

System.Version MyVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; 

// MyVersion.Build = days after 2000-01-01 
// MyVersion.Revision*2 = seconds after 0-hour (NEVER daylight saving time) 
DateTime MyTime = new DateTime(2000, 1, 1).AddDays(MyVersion.Build).AddSeconds(MyVersion.Revision * 2); 
return string.Format("Version:{0} Compiled:{1:s}", MyVersion, MyTime); 
+0

Das ist ein guter Weg, um herauszufinden, wann die Assembly leicht kompiliert wurde; Es ist jedoch zu den gleichen Dekompilierungs-/Neukompilierungsproblemen verdächtig, jede andere Methode, dies zu tun, hat auch ... – configurator

+0

Wenn sie Ihren Code dekompilieren, um Ihr Datum zu bekommen ... können sie Ihren Code dekompilieren, um Ihren Code aufzurufen. Dieses Datum zu verdecken ist eine falsche Maßnahme und bietet keinen Schutz. –

+0

das ist, warum ich die Methode "Telefon nach Hause" empfehlen würde – Kilhoffer

2

Von innerhalb Ihres automatisierten Build-Prozesses (Sie verwenden einen automatisierten Build-Prozess, oder?), Hatte eine einfache App, die generiert eine 1-zeilige C# -Klasse

public struct TimeLimit { public DateTime Date = new DateTime(2009,1,1); } 

Ändern des Datums automatisch und kompilieren.

Dann beziehen Sie sich auf TimeLimit.Date in Ihrer App.

+0

... aber vielleicht verblenden und nicht TimeLimit nennen! ;) –

3

Ich würde mit der "Phone home" -Variante gehen. Und diesen Anruf wichtig machen. ;) Ich meine, einige wichtige Funktionen in Ihrem Programm (einige Berechnungen vielleicht?) Werden auf dem Server stattfinden. Wenn also der Benutzer das Programm dekompiliert und das "call home" entfernt, wird das Programm nutzlos.

Ich weiß, dass nicht alle Programme diese Spezifikationen haben, die dies möglich machen, aber mehr als Sie im Allgemeinen denken.

+0

Telefon zu Hause ist eine gute Idee .. aber von dem, was Sie alle gesagt haben, merke ich, es ist keine einfache Antwort überhaupt. Danke – Jon

1

Ich würde vorschlagen, dass Sie das Datum in einer separaten, stark benannten Assembly haben - dann wird zumindest der böswillige Benutzer es schwer finden, es zu disassemblieren, zu bearbeiten und Ihr Programm zu benutzen. Gibt es eine Möglichkeit, zwei Assemblies basierend auf starken Namen zu validieren?

Wir verwenden dies als einen ersten Schritt in unserer Lizenzkontrolle für eine unserer Komponenten. Wenn die aufrufende Assembly denselben Fingerabdruck hat wie der lizenzierte, gehen wir davon aus, dass sie in unserer eigenen Software verwendet wird und die Lizenzierung umgangen wird. Wenn die aufrufende Assembly einen anderen Fingerabdruck oder gar keinen Druck hat, werden normale Lizenzprüfungen durchgeführt. Wenn ich darüber nachdenke, könnten unsere Benutzer wahrscheinlich disassemblieren, ohne starke Namensgebung kompilieren und Lizenzen umgehen. Aber dann werden alle unsere Baugruppen als x86 ausgeliefert, nicht als CIL - würde das irgendetwas ändern?

Unsere Erfahrung ist, dass, wenn Sie mit Firmenkunden zu tun haben, niemand die Mühe der Manipulation Ihrer Sachen ertragen kann, besonders da ein Risiko besteht, erwischt zu werden. Ein wenig ist ein langer Weg, unsere aktuelle Lizenzierungslösung ist ziemlich veraltet (das Paket enthält Beispiele für VC5!), War aber bisher eine ausreichend hohe Hürde. Bei den Verbrauchern kann ich mir andererseits vorstellen, dass dies eine größere Bedrohung darstellt.

Mein erster Vorschlag scheint mehr Fragen zu beantworten - vielleicht nicht so hilfreich. :)

2

Ich weiß, das ist eine 3 Jahre alte Frage, aber nur um meine 2 Cent hinzuzufügen. Wir verwenden ein "DateLimit", das in einer von James Curran vorgeschlagenen Struktur fest codiert ist.

Aber wir verwenden auch das gleiche "Datum" als einen einfachen Schlüssel zu "krypten" und "entschlüsseln" (mehr Code und entschlüsseln) alle Strings, Labels, Nachrichten. Wenn einige Leute (wir nennen sie Betrüger) das Ablaufdatum ändern wollen, müssen sie durch die ganze Versammlung gehen, um alle diese Zeichenfolgen korrekt für das neue Ablaufdatum einzugeben. Es ist nicht perfekt, aber die Kosten für uns sind jetzt fast Null und die Kosten für die Betrüger sind hoch.

+0

interessante Idee. – Jon

Verwandte Themen