1 1 1 1 1 1 1 1 1 1 Rating 5.00 (2 Votes)

 

Problemstellung:

Manchmal will man ein eigenes Programm erstmal nur als Demo weitergeben.
Nun ist das mit VB6 kein großes Problem.
Mit normalem MS-Access gibt es verschiedene Wege, die aber alle nicht 100 %ig sicher sind.
Grundvorraussetzung ist die Weitergabe als MDE-Datei, da ich keinerlei Programmcode sichtbar ist
und manipuliert werden kann.
Eine Lösung wäre die Anzahl von DS in einer Tabelle beschränken und diesen Wert mittels DCount zu prüfen.
Die beiden Lösungen, die hier vorstellen möchte, gehen einen etwas anderen Weg.

Ich hab mal 4 Möglichkeiten vorbereitet.

Um es aber gleich vorweg zu nehmen, es gibt keine absolute Sicherheit das dies jemand knackt.

1. DB startet nur einen bestimmten Zeitraum
1.1 Wert und Prüfung erfolgt über eine Private Property
1.2 Wert und Prüfung erfolgt über einen Eintrag in der Registry

2. DB kann nur eine bestimmte Anzahl von Starts ausgeführt werden
2.1 Wert und Prüfung erfolgt über eine Private Property
2.2 Wert und Prüfung erfolgt über einen Eintrag in der Registry

Voraussetzungen:

Das Bsp ist ab A00 lauffähig.

Funktionsweise:

 

Für alle Lösungen wird das Modul „mod_Crypter“ benötigt.

Dort sind die Routinen zum Verschlüsseln der Werte enthalten.

Für die Property Lösungen wird das Modul „mod_Properties“ benötigt und für die

Registry Lösungen das Modul „mod_Registry“.

Im Download ist für jede Lösung jeweils die MDE- und MDB-Datei enthalten.

Der Prüfcode wird im Load-Ereignis des Startforms hinterlegt.

Das Passwort zum Verschlüsseln wird in der Konstanten „sPWD“, hier im Bsp „geheim“

(beliebig änderbar) im Startform gespeichert.

 

Anzahl Tage:

In den Zeitraumvarianten wird in der Konstanten „intCountDays“ die Anzahl der Testtage festgelegt,

hier im Bsp 30 Tage.

Wobei eine zurücksetzen des Systemdatums nicht unterbunden werden kann bzw. geprüft wird.

Property Version:

Im Load Ereignis des Startforms wird zuerst geprüft ob die Property, hier „Testtime“

(kann beliebig verändert werden), bereits vorhanden ist.
sValue = GetProp("Testtime")

Fehlt die Property wird sie mit dem verschlüsselten aktuellem Datum erstellt

SetProp "Testtime", dbText, Encrypt(sDate, sPWD)

Ist die Property vorhanden wird diese ausgelesen und entschlüsselt  

varTemp = Decrypt(sValue, sPWD)dateTemp = DateSerial(Right(varTemp, 2), Mid(varTemp, 3, 2), Left(varTemp, 2
intDays = DateDiff("d", Date, dateTemp)
sValue = GetProp("Testtime")

Danach erfolgt der Vergleich des aktuellen Datums mit dem gespeicherten Wert der Property
 
If intDays < (intCountDays * -1) Then
        MsgBox "Testzeitraum abgelaufen"
        DoCmd.Quit
Else
        MsgBox "Sie können das Programm noch " & intCountDays + intDays & " Tage testen"
End If

Ist der Wert der Konstanten überschritten wird das Programm geschlossen. Die Sache hat aber einen Haken.
Nach jeder Neuinstallation des Programms fehlt die Property und der Zeitraum beginnt von vorn.
Da wäre die Lösung mit der Registry besser.

Registry Version:
Mit den Standardfunktionen aus Access „GetSetting“ und „SaveSetting“ kommt man nicht weit, da hier
nur im Standard VBA Verzeichnis gespeichert wird und die findet jeder.
Deshalb die etwas aufwendigere Lösung mittels API.
Wichtig wäre das die Schlüsselbezeichnungen keinen Hinweis auf das eigene Programm zulassen.
Im Load Ereignis des Startforms wird zuerst geprüft ob der Registryeintrag (kann beliebig verändert werden),
bereits vorhanden ist.

1. Parameter: Hauptschlüssel : z.B. HKEY_CURRENT_USER
2. Parameter: Schlüsselpfad : z.B. WinApp
3. Parameter: Schlüsselname: z.B. WinAppValue

sTemp = fWertLesen(HKEY_CURRENT_USER, "WinApp", "WinAppValue")

Fehlt der Registryeintrag wird dieser mit dem verschlüsselten aktuellem Datum erstellt.

If sTemp = "" Then
    fStringSpeichern HKEY_CURRENT_USER, "WinApp", "WinAppValue", sValue

Ist der Registryeintrag vorhanden wird diese ausgelesen und entschlüsselt.

sDateTemp = Decrypt(sTemp, sPWD)
dateTemp = DateSerial(Right(sDateTemp, 2), Mid(sDateTemp, 3, 2), Left(sDateTemp, 2))
intDays = DateDiff("d", Date, dateTemp)

Danach erfolgt der Vergleich des aktuellen Datums mit dem gespeicherten Wert des Registryeintrags

If intDays < (intCountDays * -1) Then
   MsgBox "Testzeitraum abgelaufen"
   DoCmd.Quit
Else
   MsgBox "Sie können das Programm noch " & intCountDays + intDays & " Tage testen"
End If

Ist der Wert der Konstanten überschritten wird das Programm geschlossen.

 

Anzahl Programmstarts:
Die Festlegung der Konstanten für das Verschlüsselungspasswort ist die Gleiche wie oben.
In den Programmstartvarianten wird in der Konstanten „intCountStart“ die Anzahl der Programmstarts festgelegt,
hier im Bsp 30 Tage.
Die Konstante „intFactor“ ist als Faktor für Verschlüsselung gedacht, hier im Bsp 221.
Es ist darauf zuachten das die Multiplikation der beiden Konstanten nicht den Wertebereich des
IntegerTyps, also 32768, nicht überschreitet.
Property Version:
Im Load Ereignis des Startforms wird zuerst geprüft ob die Property, hier „CountStart“ (kann beliebig verändert werden),
bereits vorhanden ist.

sValue = GetProp("CountStart")

Fehlt die Property wird sie mit dem Wert 1 * dem Faktor verschlüsselt erstellt.

If fProp = False Then
    intValueTemp = 1 * intFactor
    SetProp "CountStart", dbText, Encrypt(CStr(intValueTemp), sPWD)

Ist die Property vorhanden wird diese ausgelesen und entschlüsselt und um den Wert 1 erhöht.
Der neue Wert wird gleich wieder verschlüsselt in die Property zurück geschrieben

sValueTemp = Decrypt(sValue, sPWD)
intValueTemp = CInt(sValueTemp) / intFactor
intValueTemp = intValueTemp + 1
SetProp "CountStart", dbText, Encrypt(CStr(intValueTemp * intFactor), sPWD)

Danach erfolgt der Vergleich mit dem Wert der Konstanten für die max. Anzahl der Starts mit dem
gespeicherten Wert der Property.

intDiff = intCountStart - intValueTemp
If intDiff < 0 Then
     MsgBox "Testzeitraum abgelaufen"
     DoCmd.Quit
Else
     MsgBox "Sie können das Programm noch " & intDiff & " mal starten"
End If

Ist der Wert bei 0 angekommen wird das Programm geschlossen.
Die Sache hat aber auch hier den gleichen Haken.
Nach jeder Neuinstallation des Programms fehlt die Property und die Zählung beginnt von vorn.

Registry Version:
Hier gelten die gleichen Regeln bzw. Hinweise wie bei der Zeitraumvariante.
Die benötigten Konstanten sind die gleichen wie in der Propertyvariante.
Im Load Ereignis des Startforms wird zuerst geprüft ob der Registryeintrag (kann beliebig verändert werden),
bereits vorhanden ist.
1. Parameter: Hauptschlüssel : z.B. HKEY_CURRENT_USER
2. Parameter: Schlüsselpfad : z.B. WinApp
3. Parameter: Schlüsselname: z.B. WinAppStart

sTemp = fWertLesen(HKEY_CURRENT_USER, "WinApp", "WinAppStart")

Fehlt der Registryeintrag wird dieser mit dem Wert 1 * dem Faktor verschlüsselt erstellt.

If sTemp = "" Then
    intValueTemp = 1 * intFactor
    sValue = Encrypt(CStr(intValueTemp), sPWD)
    fStringSpeichern HKEY_CURRENT_USER, "WinApp", "WinAppStart", sValue
    intValueTemp = 1

Ist der Registryeintrag vorhanden wird dieser ausgelesen und entschlüsselt und um den Wert 1 erhöht.
Der neue Wert wird gleich wieder verschlüsselt in den Registryeintrag zurück geschrieben.

sValueTemp = Decrypt(sTemp, sPWD)
intValueTemp = CInt(sValueTemp) / intFactor
intValueTemp = intValueTemp + 1
sValue = Encrypt(CStr(intValueTemp * intFactor), sPWD)
fStringSpeichern HKEY_CURRENT_USER, "WinApp", "WinAppStart", sValue

Danach erfolgt der Vergleich mit dem Wert der Konstanten für die max. Anzahl der Starts mit dem gespeicherten
Wert der Registry.

intDiff = intCountStart - intValueTemp
If intDiff < 0 Then
     MsgBox "Testzeitraum abgelaufen"
     DoCmd.Quit
Else
     MsgBox "Sie können das Programm noch " & intDiff & " mal starten"
End If

Ist der Wert der Konstanten überschritten wird das Programm geschlossen.

Um bei Testzwecken die Properties bzw. Registryeinträge zu löschen geht man so vor:
Für Registry:
In eine beliebige Access-DB das Modul „mod_Registry“ kopieren und daraus die Sub „fWerteLoeschen“ aufrufen.
z.B.:

fWerteLoeschen HKEY_CURRENT_USER, "WinApp", "WinAppValue"

Aufgrund dieser Lösung ist es erforderlich das andere Pfade als in dem Bsp verwendet werden.
Es kann nur der Schüssel gelöscht werden wenn dieser bekannt ist.

Für Property:
In eine beliebige Access-DB die folgende Sub kopieren:

Public Sub DeleteProp(strDBPfad As String, strProp As String)
'*******************************************
'Name:      GetProp (Sub)
'Purpose:   Auslesen von Datenbank Einstellungen
'Author:    Thomas Keßler
'Date:      Dezember 15, 2002, 11:00:15
'Inputs:    strDBPfad = Datenbank mit komplettem Pfad, strprop= Die Eigenschaft die 
'           gelöscht werden soll
'*******************************************
Dim wsp As DAO.Workspace
Dim db As DAO.DATABASE

On Error GoTo Err_Prop
    Set wsp = DBEngine.Workspaces(0)
    Set db = wsp.OpenDatabase(strDBPfad)
    
    db.Properties.Delete (strProp)
    db.Close

    GoTo Err_Ende

Err_Ende:
    Exit Sub
Err_Prop:
    If Err.Number = 3270 Then
        Exit Sub
  Else
        Dim strErrString As String
        strErrString = "Error Information..." & vbcrlf
        strErrString = strErrString & "Error#: " & Err.Number & vbcrlf
        strErrString = strErrString & " Description: " & Err.Description & vbcrlf
        MsgBox strErrString, vbCritical + vbOKOnly, _
               "Error in Modul mod_Property in Sub: GetProp"
        Resume Err_Ende
    End If
End Sub

Der Aufruf sähe z.B. so aus:

DeleteProp "C:\DeinPfad\DeineDB.mdb", "Testtime"

Auch hier gilt andere Bezeichnungen zu verwenden, denn es kann nur gelöscht werden wenn der Name der Property bekannt ist.

Fazit:
Die Registryvariante ist sicherer als die Lösung mittels Property.

Ich übernehme aber keinerlei Haftung, für entstandene Schäden durch die Verwendung dieses Beispiels und/oder durch Dritte



Dateien:
(0 Stimmen)

Beispiel-DB für eine Userverwaltung mit verschlüsselten Passwörtern und individuellen verschlüsselten Formularrechten.

ab A00

Die Setup-Datei enthält eine Version ab A00

Datum 05.02.2018
Dateigröße 632.44 KB
Download 3.812

Ähnliche Artikel

You have no rights to post comments

Login Form

Neueste Artikel

SQL zu VBA Konverter
26. Oktober 2018
Problemstellung: Nur für 32Bit Office Versionen Gibt es eine Möglichkeit SQL-Code einer Abfrage so zu konvertieren das der Code in VBA genutzt werden kann? Lösung: Bis Access 2010 gibt das Tool...
1.png5.png7.png6.png1.png1.png6.png
Heute112
Gestern206
Diese Woche318
Dieser Monat4739
Total1576116

  • IP: 3.235.42.157
  • Browser: Unknown
  • Version:
  • OS: Unknown

Online

1
Online

19. März 2024

Letzte Kommentare

  • Berechnen von Zeiträumen als Abfragekriterium

    elmard 02.02.2021 21:02
    1000 Dank
    für diese Datenbankanwendung! Eine sehr gute Umsetzung mit den vielen Möglichkeiten des Datums.

    Weiterlesen...

     
  • SQL zu VBA Konverter

    Tommy Admin 03.11.2019 16:33
    RE: SQL zu VBA Konverter
    Hallo Elmard, danke für die Info. :lol:

    Weiterlesen...

     
  • SQL zu VBA Konverter

    elmard 03.11.2019 14:49
    Bei SmartTools neue Version 4.0
    Dieses Tool liegt inzwischen in der Version 4 vor und läuft nun auch von A2013 und A2016 sowie im ...

    Weiterlesen...

     
  • Workshop zur Benutzung des Multi-Column TreeView Control unter MS-Access

    TommyK 27.02.2019 06:52
    Workshop
    Hallo mpegjunkie, danke für Dein Feedback. Schön das Dir Workshop weiter hilft. :D

    Weiterlesen...

     
  • Workshop zur Benutzung des Multi-Column TreeView Control unter MS-Access

    mpegjunkie 26.02.2019 20:10
    Perfekter Workshop
    Hallo Tommy, perfekter Workshop, toll und umfassend erläutert. Jetzt nutze ich diese Controls auch.

    Weiterlesen...