Weitergabeschutz realisieren

Hallo,

ich möchte, dass eine Exceldatei immer nur von einem Computer genutzt werden kann. Dazu soll beim Öffnen der Datei der Computername ausgelesen werden. Zum Ermitteln des Computernamens verwende ich folgenden code:

Declare Function GetComputerName& Lib „kernel32“ Alias _
„GetComputerNameA“ (ByVal lbbuffer As String, nsize As Long)

Sub CptName()
Dim sTxt As String * 64
Call GetComputerName(sTxt, 64)
End Sub

Was noch eingebaut werden muss: Beim allerersten Öffnen der Datei muss der CompName irgendwo gespeichert werden und ab dem 2. Öffnen soll immer geprüft werden, ob der gespeicherte CompName mit dem CompNamen übereinstimmt, von dem die Datei gerade geöffnet wird. Wenn diese nicht übereinstimmen, soll eine Meldung (z.B. keine Berechtigung vorhanden) ausgegeben werden und die Datei geschlossen werden. Weiß jemand wie der Code dazu geschrieben werden müßte?

Gruß
Denis

Hallo Denis,

ich möchte, dass eine Exceldatei immer nur von einem Computer
genutzt werden kann. Dazu soll beim Öffnen der Datei der
Computername ausgelesen werden. Zum Ermitteln des
Computernamens verwende ich folgenden code:

Was willst du eigentlich genau damit erreichen ??

Normalerweise sperrt man die Datei einfach, also man öffnet sie exclusiv.

Bei deiner Variante, kann man die Datei immer noch mehrfach auf dem einen Computer öffnen…

MfG Peter(TOO)

Hallo Denis.

Die einfachste Methode für Deinen Fall wäre wahrscheinlich, den Computernamen in der Datei selbst zu speichern. Du könntest dazu einfach ein weiteres Tabellenblatt hinzufügen, dessen Visible-Eigenschaft Du auf „VeryHidden“ einstellst, sodaß kein Anwender es von der Excel-Obefläche aus einblenden kann. In diesem Tabellenblatt fragst Du jedesmal beim Öffnen den Inhalt einer Zelle ab (es muß ja nicht A1 sein). Wenn die Zelle keinen Inhalt hat, ist es das erste Öffnen. Wenn die Zelle einen Inhalt hat, kannst Du vergleichen und die Meldung anzeigen.

Viele Grüße
Carsten

ich möchte, dass eine Exceldatei immer nur von einem Computer
genutzt werden kann. Dazu soll beim Öffnen der Datei der
Computername ausgelesen werden. Zum Ermitteln des
Computernamens verwende ich folgenden code:

Hi Denis,
Alt+F11, Doppelklick auf „DieseArbeitsmappe“, wähle dann in der
Mitte „Workbook“ und rechts davon „Open“ aus, dann wird der Rumpf des
Openereignisses ertellt.
Also so was:
Private Sub Workbook_Open(…)
End Sub
Dieser Code wird beim Öffnen der Datei ausgeführt.
Aufgrund der Anregung von Peter würde ich erstmal prüfen ob die Datei schon offen ist

Dim Geöffnet as Boolean,Vorhanden as boolean
For each wb in workbooks
 if wb.name=thisworkbook.name then Geöffnet=true
next wb
if Geöffnet=true then thisworkbook.close savechanges:=false
Anschliessend würde ich prüfen ob unter den "CustomDocumentProberties ein Name wie z.B. "PcName" existiert.
Wenn "nein" (also Erstbenutzung der Datei) wird er angelegt.

for each N in thisworkbook.CustomDocumentProberties.names
 if N=thisworkbook.name then Vorhanden =true
next N
if Vorhanden=False then
 'Syntax aus der Hilfe, der Name wird als String angelegt und ihm der Name des PCs als Wert zugewiesen.
 thisworkbook.CustomDocumentProberties.Add ... 
end if
if GetComputerName(sTxt, 64)thisworkbook.CustomDocumentProberties("PcName") then thisworkbook.close savechanges:=false

Ich habe das jetzt so heruntergeschrieben, mit Sicherheit
Syntaxfehler drin, möglich auch Logikfehler, aber so würde ich da als
Ansatz herangehen.
Gruß
Reinhard

Declare Function GetComputerName& Lib „kernel32“ Alias _
„GetComputerNameA“ (ByVal lbbuffer As String, nsize As Long)

Sub CptName()
Dim sTxt As String * 64
Call GetComputerName(sTxt, 64)
End Sub

Was noch eingebaut werden muss: Beim allerersten Öffnen der
Datei muss der CompName irgendwo gespeichert werden und ab dem
2. Öffnen soll immer geprüft werden, ob der gespeicherte
CompName mit dem CompNamen übereinstimmt, von dem die Datei
gerade geöffnet wird. Wenn diese nicht übereinstimmen, soll
eine Meldung (z.B. keine Berechtigung vorhanden) ausgegeben
werden und die Datei geschlossen werden. Weiß jemand wie der
Code dazu geschrieben werden müßte?

Gruß
Denis

Die einfachste Methode für Deinen Fall wäre wahrscheinlich,
den Computernamen in der Datei selbst zu speichern. Du
könntest dazu einfach ein weiteres Tabellenblatt hinzufügen,
dessen Visible-Eigenschaft Du auf „VeryHidden“ einstellst,
sodaß kein Anwender es von der Excel-Obefläche aus einblenden
kann. In diesem Tabellenblatt fragst Du jedesmal beim Öffnen
den Inhalt einer Zelle ab (es muß ja nicht A1 sein). Wenn die
Zelle keinen Inhalt hat, ist es das erste Öffnen. Wenn die
Zelle einen Inhalt hat, kannst Du vergleichen und die Meldung
anzeigen.

Hallo Carsten,
die Lösung mit einem Extra-Blatt, wo eine Zelle den Computernamen enthält, favorisiere ich auch. Nur wie stelle ich sicher, dass nur der Computername beim Erstöffnen in der Zelle landet (und dort auch verbleibt) und bei jedem weiteren Öffnen der CompName mit dem Erstnamen verglichen wird. Wenn ich nur GetComputerName(sTxt, 64) verwende wird immer nur der Name des aktuellen Computers ausgelesen mit der Folge, dass die Namen identisch sind und die Datei genutzt werden kann.

Gruß
Denis

ich möchte, dass eine Exceldatei immer nur von einem Computer
genutzt werden kann. Dazu soll beim Öffnen der Datei der
Computername ausgelesen werden. Zum Ermitteln des
Computernamens verwende ich folgenden code:

Was willst du eigentlich genau damit erreichen ??

Hallo Peter,
Ich vertreibe kostenpflichtige Excel-Rechner für spezielle Finanzthemen und möchte verhindern, dass jemand, der einen gekauft hat, diesen an seine Freunde weitergeben kann. Da die Rechner oft klein sind ist das über Email leicht möglich. Daher suche ich nach einer Methode bei der nur die Version, die von mir direkt gekauft wurde, lauffähig ist. Dazu soll beim ersten Öffnen der Datei der Computer identifiziert werden und die Datei nur von diesem benutzbar sein. Sozusagen eine Bindung der Benutzerrechte an den Computer. Statt dem CompNamen könnte man auch die Festplatten-Nr. nehmen.

Normalerweise sperrt man die Datei einfach, also man öffnet
sie exclusiv.

Wie öffnet man eine Datei exklusiv?

Bei deiner Variante, kann man die Datei immer noch mehrfach
auf dem einen Computer öffnen…

Ja stimmt, weil GetComputerName(sTxt, 64) nur den Namen des aktuellen Computers abfragt. Wie ich Carsten schon geschrieben habe, muss ich irgendwie sicherstellen, dass der CompName beim ersten öffnen fest gespeichert wird um als Vergleichsmasstab für jedes weitere Öffnen zu taugen.

Gruß
Denis

Hi Denis,

Was willst du eigentlich genau damit erreichen ??

Ich vertreibe kostenpflichtige Excel-Rechner für spezielle
Finanzthemen und möchte verhindern, dass jemand, der einen
gekauft hat, diesen an seine Freunde weitergeben kann. Da die
Rechner oft klein sind ist das über Email leicht möglich.
Daher suche ich nach einer Methode bei der nur die Version,
die von mir direkt gekauft wurde, lauffähig ist. Dazu soll
beim ersten Öffnen der Datei der Computer identifiziert werden
und die Datei nur von diesem benutzbar sein. Sozusagen eine
Bindung der Benutzerrechte an den Computer. Statt dem
CompNamen könnte man auch die Festplatten-Nr. nehmen.

was genau meinst du mit „Excel-Rechner“ ? Eine Excel Arbeitsmappe, Berechnungsmakros oder Add-Ins? Oder …?

Normalerweise sperrt man die Datei einfach, also man öffnet
sie exclusiv.

Wie öffnet man eine Datei exklusiv?

Einen Ansatz schrieb ich dir schon.

Bei deiner Variante, kann man die Datei immer noch mehrfach
auf dem einen Computer öffnen…

Ja stimmt, weil GetComputerName(sTxt, 64) nur den Namen des
aktuellen Computers abfragt. Wie ich Carsten schon geschrieben
habe, muss ich irgendwie sicherstellen, dass der CompName beim
ersten öffnen fest gespeichert wird um als Vergleichsmasstab
für jedes weitere Öffnen zu taugen.

Grundsätzlich sehe ich ein viel gravierenderes Problem, wie willst du verhindern daß jmd. deinen Überprüfungs-Vba-Code lahmlegt? Das Passwort für den Vba-Code ist kein wahrer Schutz.
Zumindest für XL97 und XL2000 habe ich das mit einem Hex-Editor binnen einer Minute entfernt/überschrieben (nur einige spezielle Add-Ins wehren sich dagegen). Und wenn ich das kann, können das einige mehr.

Gruß
Reinhard

Hallo Reinhard,
seltsamerweise konnte ich nicht direkt auf deinen Beitrag antworten, weil die links alle ausgeblendet waren. Zunächst danke für den Code.

'Syntax aus der Hilfe, der Name wird als String angelegt und ihm der Name des PCs als Wert zugewiesen.
thisworkbook.CustomDocumentProberties.Add …
bei dieser Methode gibt es einen Einttrag unter Datei/Eigenschaften/Anpassen. Dort gibt es auch einen Löschen-Button. Die Frage ist was passiert, wenn einer den Namen dort einfach löscht? Mir wäre eine Lösung lieber, wo der User keinen Zugriff auf den Schutz hat. Ich konnte deinen Code auch noch nicht ausprobieren, weil mir der Code hinter Add . . . noch fehlt.

Gruß
Denis

[MOD] Ich habe den Beitrag ‚verschoben‘. :smile: Geht nicht wirklich, sieht aber fast so aus als ob. gg

was genau meinst du mit „Excel-Rechner“ ? Eine Excel
Arbeitsmappe, Berechnungsmakros oder Add-Ins? Oder …?

Es sind einzelne Arbeitsmappen. Die meisten sind ohne Makros. Wenn ich welche verwende, dann nicht für Berechnungen. Kenne mich auch nicht gut genug aus hier. Für die aufwendigeren Rechner möchte ich diesen Weitergabeschutz realisieren. Da komme ich um Makros nicht mehr herum.

Grundsätzlich sehe ich ein viel gravierenderes Problem, wie
willst du verhindern daß jmd. deinen Überprüfungs-Vba-Code
lahmlegt? Das Passwort für den Vba-Code ist kein wahrer
Schutz.

Das ist mir schon klar. Der Durchschnittsuser kann aber keinen VBA-Schutz knacken und schon gar nicht VBA-Code ändern.

Zumindest für XL97 und XL2000 habe ich das mit einem
Hex-Editor binnen einer Minute entfernt/überschrieben (nur
einige spezielle Add-Ins wehren sich dagegen). Und wenn ich
das kann, können das einige mehr.

Gib bitte keine Hinweise hier. Es reicht, dass einige meinen detailierte Anleitungen ins Netz stellen zu müssen. Ein besserer Schutz wäre der Export des VBA-Codes in eine DLL-Datei, wo der Code kompiliert ist. Nur 100ig ist das auch nicht, da man hier mit einem Assembler dran gehen kann. Mein Ziel ist es auch nicht jeden daran zu hindern, den Schutz zu umgehen. Bin schon zufrieden, wenn der Schutz bei der breiten Masse funktioniert.

Gruß
Denis