none
Wie schütze ich meine Powershellskripte? RRS feed

  • Frage

  • Hi,

    ich habe mehrere Powershellskripte für ein Programmgeschrieben.

    Der Benutzer kann über ein Netzlaufwerk, auf das alle Zugriff haben, einen Installer starten mit dem die Skripte auf C:\Programmordner kopiert werden. Es wird ein Verknüpfung auf dem Desktop erstellt mit dem man das erste Skript öffnet und je nachdem welche Aktion man im Programm durchführt werden die anderen Skript aufgerufen.

    Das ganze habe ich grafisch mit WindowsForms realisiert.

    Die Skripte rufen sich gegenseitig folgendermaßen auf:

    $scriptpath = $MyInvocation.MyCommand.Path
    $dir = Split-Path $scriptpath 
    
    . "$dir\Script1.ps1"
    . "$dir\Script2.ps1"
    . "$dir\Script3.ps1"
    

    Momentan liegen die Skripte ungeschützt auf C:\Programmordner und können theoretisch von jedem Benutzer manuell ohne die Verknüpfung auf dem Desktop geöffnet werden.

    Gibt es eine Möglichkeit die Skripte zu schützen/verschlüsseln, damit man z.B. nach einem Passwort gefragt wird wenn man das Skript öffnen will es aber trotzdem problemlos über die Verknüpfung klappt?

    Danke schon im voraus

    Grüße :)

    Dienstag, 4. Oktober 2016 13:27

Antworten

  • Moin,

    Du ahnst schon, dass es den "Magic Button" nicht gibt.

    Ich nehme ja an, Dir geht es nicht um den direkten Aufruf des "Mutterskriptes", zu dem es ja auch eine Verknüpfung gibt, sondern eher um den von Script1.ps1, Script2.ps1 und Script3.ps1. Da gäbe es evtl. ein paar Möglichkeiten:

    • Wenn Du die Skripte immer dot-sourcest, wird das MyInvocation-Objekt im "inneren" Skript Informationen zum "äußeren" Skript enthalten. Z.B. $MyInvocation.PSCommandPath wird leer sein, wenn Du Script1.ps1 direkt aufrufst und den Pfad des "äußeren" Skriptes enthalten, wenn Du es dot-sourcest.
    • Du kannst ein "Secret" verwenden, z.B. eine Datei, die das "äußere" Skript schreibt und die "inneren" Skripte auswerten.
    • Du kannst die "inneren" Skripte erst zur Laufzeit aus dem "äußeren" Skript generieren (z.B. aus einer Datenbank auslesen) und dann aufrufen.
    • es gibt bestimmt noch mehr perverse Ideen.

    Aber, wie schon Mark Minasi zu sagen pflegte, "there is no silicon-based solution to a carbon-based problem" :-)


    Evgenij Smirnov

    msg services ag, Berlin -> http://www.msg-services.de
    my personal blog (mostly German) -> http://it-pro-berlin.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    In theory, there is no difference between theory and practice. In practice, there is.

    Dienstag, 4. Oktober 2016 16:05
  • Okay, dann wissen wir zumindest, worum es geht.

    Eine spontane Idee wäre, den Code durch seine Unicode-Nummern zu ersetzen, um ihn schwerer lesbar zu machen. Das ganze kannst du dann in einer Textdatei speichern, der du noch eine beliebige kryptische Endung gibst, damit sie nicht so einfach aufgeht. Ein Beispiel für die Codierung hätte ich hier:

    #Codierung
    $Text = Get-Content ".\Beispiel.ps1" -Raw
    $Codiert = ($Text).ToCharArray() | foreach{[int]$_}
    $Codiert -join " " | Out-File ".\CodeBeispiel.abc"
    
    #Decodierung
    $Code = Get-Content ".\CodeBeispiel.abc"
    $Skript = $Code -split " " | foreach{[char][byte]$_}
    $Skript -join "" | Out-File ".\DecodiertBeispiel.ps1"
    
    Vielleicht hilft das ja schon.

    Donnerstag, 6. Oktober 2016 09:23
  • Auch bei Möchtegern-Spezialisten hilft ein vernünftiges Rechtekonzept. :)

    Du kannst mal die "Script-Kompilieren"-Funktion in PowerGUI ausprobieren. Das verwandelt das Script in eine Exe (nur gepackt) das zur Laufzeit wieder nach Temp ausgepackt wird. Allerdings lässt sich ein Passwort vergeben, das vor dem Start abgefragt wird.
    Eigentlich sehr cool, hat aber leider in meinen (wenigen) Tests immer irgendwelche Probleme gemacht. Waren aber auch immer komplexere Konstrukte mit mehreren Scriptfiles, Ordnern und anderen Ressourcen.  Testen kannst du es ja mal.

     

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Neu: Powershell Code Manager v5 ! Link
    (Schneller, besser + komfortabler scripten.)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.



    Donnerstag, 6. Oktober 2016 16:25
    Moderator

Alle Antworten

  • Moin,

    Du ahnst schon, dass es den "Magic Button" nicht gibt.

    Ich nehme ja an, Dir geht es nicht um den direkten Aufruf des "Mutterskriptes", zu dem es ja auch eine Verknüpfung gibt, sondern eher um den von Script1.ps1, Script2.ps1 und Script3.ps1. Da gäbe es evtl. ein paar Möglichkeiten:

    • Wenn Du die Skripte immer dot-sourcest, wird das MyInvocation-Objekt im "inneren" Skript Informationen zum "äußeren" Skript enthalten. Z.B. $MyInvocation.PSCommandPath wird leer sein, wenn Du Script1.ps1 direkt aufrufst und den Pfad des "äußeren" Skriptes enthalten, wenn Du es dot-sourcest.
    • Du kannst ein "Secret" verwenden, z.B. eine Datei, die das "äußere" Skript schreibt und die "inneren" Skripte auswerten.
    • Du kannst die "inneren" Skripte erst zur Laufzeit aus dem "äußeren" Skript generieren (z.B. aus einer Datenbank auslesen) und dann aufrufen.
    • es gibt bestimmt noch mehr perverse Ideen.

    Aber, wie schon Mark Minasi zu sagen pflegte, "there is no silicon-based solution to a carbon-based problem" :-)


    Evgenij Smirnov

    msg services ag, Berlin -> http://www.msg-services.de
    my personal blog (mostly German) -> http://it-pro-berlin.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    In theory, there is no difference between theory and practice. In practice, there is.

    Dienstag, 4. Oktober 2016 16:05
  • Ich muß mal ein paar nervige Fragen stellen: Warum können alle Nutzer das Programm installieren, wenn nicht alle Benutzer das Programm nutzen dürfen? Warum hat jeder Zugriff auf den Installationsordner? Und vor allem: Was macht das Script, was die Nutzer nicht auf anderem Weg eh machen könnten?
     
    Ich will natürlich darauf hinaus, das ich eher mal grundsätzlich über eure Rechteverwaltung  nachdenken würde, anstatt nur ein kleines von vielen möglichen Problemen mit viel Aufwand zu lösen.

    Ein Powershellscript ermöglicht dir nur das zu tun, was du eh tun darfst. Nur eben automatisiert.Wenn ein Nutzer damit Unsinn anstellen kann, kann er exakt den gleichen Unsinn auch auf anderen Wegen anstellen. Und hier liegt dein Problem und nicht darin nur einen von den Wegen zu verbauen. :)

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Neu: Powershell Code Manager v5 ! Link
    (Schneller, besser + komfortabler scripten.)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.



    Dienstag, 4. Oktober 2016 16:57
    Moderator
  • > "there is no silicon-based
    > solution to a carbon-based problem" :-)
     
    Like! :-)
     
    Mittwoch, 5. Oktober 2016 11:09
  • Die Frage ist, wovor du sie schützen willst. Also im Sinne von missbräuchlichem Gebrauch oder im Sinne von Urheberrecht, damit keiner Teile davon weiterverwenden kann.

    Es kommt auch darauf an, wie computer-affin die Umgebung ist, vor der du sie schützen musst. Ich verteile auch ein paar Skripte in meiner Abteilung und dort sind eigentlich alle einfach nur froh, wenn sie fehlerfrei durchlaufen. Der "normale" Nutzer käme sicher nie auf die Idee, irgendwo im Code rumzupfuschen, weil er schlicht Angst vor dem Code hat.

    Mittwoch, 5. Oktober 2016 11:17
  • Das ist allerdings war.

    Aber bei uns gibt es so möchtegern Spezialisten die meinen in allem rumzupfuschen.

    Deshalb hab ich gefragt ob es eine einfache Lösung gibt mit der ich die Skripte "Oberflächlich" schützen kann. Das hat sich aber dann wohl erledigt :)

    Danke und guten Tag

    Grüße

    Donnerstag, 6. Oktober 2016 06:52
  • Okay, dann wissen wir zumindest, worum es geht.

    Eine spontane Idee wäre, den Code durch seine Unicode-Nummern zu ersetzen, um ihn schwerer lesbar zu machen. Das ganze kannst du dann in einer Textdatei speichern, der du noch eine beliebige kryptische Endung gibst, damit sie nicht so einfach aufgeht. Ein Beispiel für die Codierung hätte ich hier:

    #Codierung
    $Text = Get-Content ".\Beispiel.ps1" -Raw
    $Codiert = ($Text).ToCharArray() | foreach{[int]$_}
    $Codiert -join " " | Out-File ".\CodeBeispiel.abc"
    
    #Decodierung
    $Code = Get-Content ".\CodeBeispiel.abc"
    $Skript = $Code -split " " | foreach{[char][byte]$_}
    $Skript -join "" | Out-File ".\DecodiertBeispiel.ps1"
    
    Vielleicht hilft das ja schon.

    Donnerstag, 6. Oktober 2016 09:23
  • Auch bei Möchtegern-Spezialisten hilft ein vernünftiges Rechtekonzept. :)

    Du kannst mal die "Script-Kompilieren"-Funktion in PowerGUI ausprobieren. Das verwandelt das Script in eine Exe (nur gepackt) das zur Laufzeit wieder nach Temp ausgepackt wird. Allerdings lässt sich ein Passwort vergeben, das vor dem Start abgefragt wird.
    Eigentlich sehr cool, hat aber leider in meinen (wenigen) Tests immer irgendwelche Probleme gemacht. Waren aber auch immer komplexere Konstrukte mit mehreren Scriptfiles, Ordnern und anderen Ressourcen.  Testen kannst du es ja mal.

     

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Neu: Powershell Code Manager v5 ! Link
    (Schneller, besser + komfortabler scripten.)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.



    Donnerstag, 6. Oktober 2016 16:25
    Moderator