2008-11-26 12 views
6

Estaba pensando en cómo crear un programa que solo sería válido por X período de tiempo (dentro de una aplicación C#).C# poner la fecha en el programa cuando se compiló

Lo que estaba pensando es que tendrías la fecha actual como una constante dentro del programa y verificaría si es X días mayor que eso. Naturalmente, no quiero almacenar la fecha, o la X fuera del programa, ya que puede ser alterada.

Lo que tampoco quiero cambiar manualmente esto regularmente y recompilarlo e implementarlo. Entonces, ¿hay alguna manera de establecer que una variable sea la fecha actual cuando se compila?

Podría tener un archivo de proceso por lotes que compilaría e implementaría el nuevo archivo ejecutable en el servidor de distribución.

Gracias

Respuesta

6

Las directivas de precompilación son su clave aquí. Puede crear una constante en su aplicación y configurarla cuando compila.

Sin embargo, asegúrese de ofuscar su código. Alguien podría desarmarlo fácilmente y manipular la constante. Otra solución es tener su software "en casa" para registrarse. De esta forma, la información de registro se almacena en su servidor y no en su máquina. También hay paquetes de terceros que realizan la misma seguridad que usted está buscando, pero son caro!

+0

idea genial. Ofuscar es una obligación (¡no es que yo sepa todavía!: P) .. gracias – Jon

+0

También tiene razón sobre el tema del desmontaje, pero dentro de C# no estoy seguro de que haya una buena manera de evitarlo. – Jon

0

El problema con .NET es que sería fácil de descomponer y cambie la fecha que desea utilizar tiene constantes. Es posible que debas pensar en otra cosa.

Puede escribirlo en el registro pero luego las personas editarán este valor.

No son una solución perfecta, pero tener una cuenta que valide con un servidor externo (web) es una buena idea.

5

archivo de comprobación a cabo AssemblyInfo.cs en la carpeta Propiedades en su proyecto:

// 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")] 

Cambiar esto a:

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

A continuación, en la asamblea en otro lugar, utilice la siguiente:

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

Esa es una buena forma de encontrar cuándo el ensamblado se compiló fácilmente; sin embargo, es sospechoso de los mismos problemas de descompilación/recompilación que cualquier otro método de hacer esto también tiene ... – configurator

+0

Si están descompilando su código para obtener su fecha ... pueden descompilar su código para llamar a su código. Obscurecer esta fecha es una medida falsa y no ofrece protección. –

+0

es por eso que recomendaría el método de "teléfono a domicilio" – Kilhoffer

2

Desde dentro de su proceso de compilación automático (usted usa un proceso de compilación automático, ¿no?), Tenía una aplicación simple que genera una línea de 1 línea clase

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

cambiando la fecha automáticamente y compilando.

Luego solo consulte TimeLimit.Date en su aplicación.

+0

... pero tal vez obscurezca y no lo llame TimeLimit! ;) –

3

Iría con la variante "Phone home". Y haz que esa llamada sea importante. ;) Es decir, alguna función importante en su programa (¿algún cálculo quizás?) Tendrá lugar en el servidor. Entonces, si el usuario descompila el programa y elimina esa "llamada a casa", el programa se volverá inservible.

Sé que no todos los programas tienen las especificaciones que hacen esto posible, pero más de lo que piensas en general.

+0

El teléfono a casa es una buena idea ... pero por lo que has dicho, me doy cuenta de que no es una respuesta fácil. Gracias – Jon

1

Le sugiero que tenga la fecha en un ensamble con un nombre fuerte y separado, entonces al menos al usuario malvado le resultará difícil desensamblar, editar y hacer que su programa lo use. ¿Hay alguna forma de tener dos conjuntos validados entre sí en base a nombres fuertes?

Este tipo de uso lo usamos como primer paso en nuestro control de licencia para uno de nuestros componentes. Si el conjunto que llama tiene la misma huella digital que la licencia controlada, suponemos que se está utilizando dentro de nuestro propio software y se omite la licencia. Si el conjunto llamante tiene una huella dactilar diferente o no tiene ninguna impresión, se llevan a cabo las comprobaciones de licencia normales. Cuando lo pienso, nuestros usuarios probablemente podrían desmontar, compilar sin nombrar y omitir licencias. Pero, una vez más, todos nuestros ensamblajes se envían como x86, no como CIL, ¿eso cambiaría algo?

Nuestra experiencia es que si se trata de clientes corporativos, nadie puede soportar la molestia de manipular sus cosas, especialmente porque existe el riesgo de ser atrapado. Un poco vale mucho, nuestra solución de licencia actual está bastante desactualizada (¡el paquete incluye ejemplos para VC5!) Pero hasta ahora ha sido un obstáculo lo suficientemente alto. Con los consumidores, por otro lado, puedo imaginar que es una amenaza mayor.

Mi sugerencia inicial parece generar más preguntas que respuestas, tal vez no tan útil después de todo. :)

2

Sé que esta es una pregunta de 3 años, pero solo para agregar mis 2 centavos. Usamos un "DateLimit" codificado en una estructura como lo sugiere James Curran.

Pero también usamos esa misma "Fecha" como una simple clave para "cripta" y "descifrar" (más Código y decodificación) todas las cadenas, etiquetas, mensajes. Si algunas personas (los llamamos Cheaters) desean cambiar la fecha de vencimiento, deberán pasar por todo el conjunto para volver a ingresar todas esas cadenas correctamente para la nueva fecha de vencimiento. No es perfecto, pero el costo para nosotros ahora es casi cero y el costo para los Cheaters es alto.

+0

idea interesante. – Jon

Cuestiones relacionadas