Que el libro en excel sólo funcione en una PC. Es decir, que no se pueda operar copias en USB ni en otro dispositivo.

Construyo programas en hoja electrónica con utilidad para estudiantes y arquitectos. El problema es que me compran una copia y luego, resulta que toda la facultad tiene una copia sin costo. ¿Es posible que la copia pagada y descargada por internet o enviada por correo electrónico quede limitada a usarse en una sola computadora y que las copias extraídas a partir de esa descarga queden inservibles en otra pc o dispositivo electrónico como celulares y tablets o bien operarse desde una memoria USB?
Una posible situación es que, si las macros están inhabilitadas, el libro pueda abrirse y copiarse.
¿Hay otra manera?

3 respuestas

Respuesta
2

Con un archivo archivo.ini colocado en la ruta mencionada, este caso es \0\archivo.ini

Con esto nadie lo abre SI EL ARCHIVO archivo.ini no esta en esta ruta.

La ruta puedes tu dársela en la ventana de ThisWorkbook. Este el código que por cierto dejame decirte que no es mio y si lo baje, de otra página que tengo mencionada en una hoja

Coloca la totalidad de este código, en la ventana de código del ThisWorkbook.

Const archivoInicial = "C:\0\Archivo.INI" 'Evitar colocar el .ini en carpeta en que su nombre sea número. _
Tambien la ruta tien que ser lo mas secreta o oculta posibleCambia la ruta del INI donde mejor te parezca, con tal que el .ini este donde manda aqui _
El nombre del .ini puede ser cualquiera y vacio, tal que sea mencionado aqui
Private Sub Workbook_Open()
Application.ScreenUpdating = False
Dim W As Worksheet
On Error Resume Next
If Not (existeArchivo(archivoInicial)) Then
MsgBox "No está autorisado a abrir este libro" & vbNewLine & _
vbLf & "Póngase en contacto con el Autor para su verificación.", vbCritical + vbOKOnly, "Producto NO AUTORIZADO"
Application.Quit
'ActiveWorkbook.Close savechanges:=False
'ThisWorkbook.Close True
Exit Sub
End If
For Each W In ThisWorkbook.Worksheets
If W.Name <> Hoja1.Name Then
W.Visible = xlSheetVisible
End If
Next W
Hoja1.Visible = xlSheetVeryHidden
Set W = Nothing
Application.ScreenUpdating = True
End Sub

En un modulo

Function existeArchivo(strArchivo As String) As Boolean
Dim miArchivo As String
existeArchivo = Len(Dir(strArchivo)) > 1
End Function

Ahora bien, si vendes, tienes que ver como te las arreglas para colocar el archivo.ini en la ruta mencionada en ThisWorkbook SIN QUE SEPAN SU UBICACION, ademas, proteger (esconder el codigo)

Tienes este más corto del amigo Dante Amor, experto al cual le debo muchas plantillas, así como muchos de nosotros le debemos por su aporte altruista a los que necesitamos de una o otra ayuda en excel, (mi caso)

Aquí va

El ubicar o guardar el archivo, TIENE QUE SER SIEMPRE en la ruta especificada en la macro.

Si lo guardas o hubicas en otra ruta que no sea la especificada, no te abrirá

'pegar este codigo en ventana de codigo de ThisWorkbook
'No abre archivo si este, ESTE no está en la ruta especifica en la macro
Private Sub Workbook_Open()
'Por.Dante Amor
    ruta = ThisWorkbook.Path
    If ruta <> "C:\0" Then 'ruta especifica
        MsgBox "El archivo no está en condiciones para su apertura, la aplicación se cerrará"
        Application.DisplayAlerts = True 'False
        Application.Quit 'cierra la aplicacion
    End If
End Sub

¡Gracias! 
Estoy muy entusiasmado. Al concretar le enviaré comentarios.

Tu código me funciona perfectamente. Mil gracias.
Tengo la inquietud de que, al inhabilitarse las macros o no tocar la ventana que habilita, el libro se abre, puede operarse y salva normal y salva como un nuevo nombre, aunque esté el archivo.ini en su lugar.
Lo ideal es que, si no se habilitan las macros, el libro tampoco se pueda utilizar.
Ahora te tengo una nueva molestia.
Necesito una macro que copie y pegue ese famoso archivo.ini en la carpeta destino y que elimine el archivo de la carpeta origen. Esta macro deberá ejecutarse al abrirse el libro cuya única hoja contendrá una planilla de datos que el comprador deberá devolverme para que le envíe los archivos (libros) finales de trabajo.

La ultima parte, te recomiendo crerar nueva pregunta "Macro que copie y pegue determinado archivo en carpeta destino y que elimine el archivo de la carpeta origen"

Recomiendo que hagas una pregunta publica, es decir, para cualquier experto ya que yo no soy tan para crear macros.

Una pregunta (solicitud), una respuesta de expertos, NO una respuesta (o varias) para una pregunta

Respuesta
1

Fíjate si esto te puede ayudar

https://youtu.be/3rMSMuYwPqE

¡Gracias! 

Me parece que puedo usar la información. Se me ocurre probar unos injertos para lograr mi propósito. Le comentaré los resultados.

Respuesta
1

Bueno los de excel to exe y demás no creo que dieran buen resultado (porque lo que hacen en descomprimir el archivo excel en una carpeta temporal, que se podría localizar y copiar y abrirlo) por lo que me sumo al hilo de las respuestas, haría falta ofuscar el código o por lo menos el texto 'ruta/archivo.ini' para que no fuera legible con un editor, tipo:

Esta función es una forma fácil para encriptar un texto.

La misma función sirve para desencriptar.

Function Encriptar(Texto) As Variant

For x = 1 To Len(Texto): Encriptar = Encriptar & Chr(255 - Asc(Mid(Texto, x, 1))): Next

End Function

[/CODE]

Digamos que se podría llamar solo la primera vez para que nos encriptara la variable 'texto' que contendría la ruta/archivo.ini y que nosotros después la utilizaríamos para comprobar si ciertamente está ese archivo.ini, pj;

ruta="gjugfrhjjvrewwuiok" ;el texto cifrado

Llamamos a la función Encriptar(ruta) para que la desencripte y continuamos el código...

Const archivoInicial = ruta
..
.
...

Como vemos en ningún momento aparece el nombre de el archivo ni la ruta.

Y si procuramos no dar pistas ( en lo de la detección del archivo) mejor ; podemos escribir estas partes del código ' lo ponemos como letra's ' esto es solo un ejemplo no es código bien escrito;

Jkhi ="gjugfrhjjvrewwuiok"

Func iyrg(jkhi)

Cons xfd = jkhi

If xfd = true then gfdhj

...

Etc

En vez de;

ruta="gjugfrhjjvrewwuiok"

Encriptar(ruta)

Cons ArchivoInicial = ruta

.....

If  NoEstaElArchivo then WindowClose

...

Eso seria ofuscar un poco el código, aunque lo ideal seria distribuir esas partes de el codigo por todo el documento y y ofuscarlo un poco más ej; abc= ddea

....

...

ddea=gikj

....

Cons gikj = open

...

En vez de poner directamente abc = open

Bueno y para la colocación del archivo ini se puede utilizar alguna función vba para la creación del mismo con la misma técnica de cifrar el texto de la ruta/archivo algo así como;

Func encriptar(RUTA)

.....

Set fs = CreateObject("Scripting.FileSystemObject")

Set a = fs.CreateTextFile(RUTA, True)

Como vemos se crea la primera vez el archivo de marras sin saber de su paradero.

Y podemos rematar añadiendo una funcion comprobación de checksum por lo menos en la parte de el codigo ejecutable para que no nos modifiquen el documento una vez creado vallan que nos añadan una linea algo como

Print RUTA o nos cambien un If RUTA= then  , por un If RUTA<> then

Lo ideal sería crear una macro solo para este acometido es decir llamarla para que cojiera el documento recién creado e incrustara el código y checksum automáticamente.

Bajo mi punto de vista yo creo que es mejor a la antigua usanza; tu me pagas yo te mando el serial,

Hay funciones en vba para cojer el id único de el equipo;

Tan sencillo como;

Si es la primVez entonces

CapturarID(idd) : MsgBox 'su id es xxxx suministre lo a su distribuidor para que le asigne su serial'

InputText 'introduzca su serial'; seri

Desencript(seri); orig

Si orig = idd entonces guardar(seri) ' sea en archivo o en el registro de win.

Si no es primvez entonces:

Cuando se ejecuta el docu;

Load(seri) ' ya sea por arch o reg de win ( el id cifrado) 

CapturarId(idd)

Si seri = idd entonces abreDocu

Como cada pc tiene una id distinta el documento no se abrirá si no coinciden ( comparacion de su id con su propia id cifrada suministrada por ti) solo es cuestión de crear una macro aparte que suministrandote una id te la cifre para dársela al que le vendiste el docu., este método junto con la verificación del checksum para no seguir con el docu abierto en caso de modificación de código, bajo mi opinión en la mejor forma de protegerlo sin mucha complicación, solo es unas cuantas líneas de código.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas