1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

Windows-Batch Programmierung

Discussion in 'Programmieren' started by HSKonnection, Jun 29, 2009.

Thread Status:
Not open for further replies.
  1. Hallo zusammen,

    ich habe auf einem USB-Stick ein portables TrueCrypt. Dieses startet ich über einen Eintrag im Kontextmenu den die "autorun.inf" angelegt hat.

    Nun gibt es aber Probleme, wenn TrueCrypt schon auf dem Rechner installiert ist. Ich benötige nun ein Batch-Script welches prüft, ob TrueCrypt installiert ist und wo. Wenn es installiert ist, dann soll das installiert TrueCrypt benutzt werden ansonsten das vom USB-Stick.

    Folgende Überlegeung habe ich schon angestellt:

    Ich suche in der Registry nach einem Uninstall-Eintrag. Ist der Eintrag nicht vorhanden, gehe ich davon aus, dass es nicht installiert ist.
    Code:
    reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\TrueCrypt /v UninstallString > temp.txt
    if errorlevel 1 goto runFromUsb
    Inhalt temp.txt:
    Code:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\TrueCrypt
        UninstallString    REG_SZ    "C:\Program Files\TrueCrypt\TrueCrypt Setup.exe" /u
    
    
    Hier ist nun mein Problem: Ich benötige den Pfad "C:\Program Files\TrueCrypt\" aus dieser Textdatei in eine Variable, um dann TrueCrypt.exe starten zu können. Daran beiße ich mir leider gerade die Zähne aus...

    Also, ich währe über jede Hilfe dankbar....

    HSKonnection
     
  2. VB-Coder

    VB-Coder Megabyte

    Warum erst in eine Textdatei ?

    Hol dir den Pfad aus der Reg und setz ihn in eine Variable. Dann kannst du gleich den Inhalt der Variablen weiter verarbeiten.

    Beispiel (Pfad muss angepasst werden - ich habs mit HijackThis getestet)
    Code:
    for /f "tokens=1* delims= " %%A in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\HijackThis" /v UninstallString') do set UninstallString=%%B
    
    Den Pfad hast du dann in der Variablen %UninstallString%
     
  3. Schon mal vielen Dank VB-Coder.

    Wenn ich Deinen Code ausprobiere bekomem ich folgende Ausgabe:
    Code:
    REG_SZ    "C:\Program Files\TrueCrypt\TrueCrypt Setup.exe" /u
    Habe dann tokens=1* in tokens=2* geändert und erhalte dann:
    Code:
    "C:\Program Files\TrueCrypt\TrueCrypt Setup.exe" /u
    Allerdings hilft mir das noch nicht richtig weiter. Denn ich brauche nur den fett makierten Teil des Strings.
    Code:
    "[B][SIZE="3"]C:\Program Files\TrueCrypt[/SIZE][/B]\TrueCrypt Setup.exe" /u
    Ob mit oder ohne Slash am Ende ist egeal. Ein einfaches Substring kann ich an der Stelle ja nicht machen, da die Länge des Pfades je nach Installation varieren kann.

    Währe also noch mal für Hilfe dankbar...
     
  4. Hnas2

    Hnas2 Ganzes Gigabyte

    Du kannst doch auch vom Ende der Variablen was "abschneiden", dann wäre die Länge egal.
     
  5. Das stimmt, aber wenn TrueCript irgendwas ändert, dann funktioniert das Script nicht mehr... Vielleicht machen zwei unterschiedliche Versionen es schon anders…
    Wenn man sich auf den Pfad konzentriert, dann ist man auf der sicheren Seite.

    Aber für den Moment geht es, und wenn ich ehrlich bin läuft es im Moment bei mir auch so. Aber ich würde das Batch-Script dahingehend gerne verbessern…
     
  6. VB-Coder

    VB-Coder Megabyte

    Code:
    for /f "tokens=1* delims= " %%A in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\HijackThis" /v UninstallString') do set UninstallString=%%B
    
    set UninstallString=%UninstallString:TrueCrypt Setup.exe" /u=Hier-Der-Befehl.exe" %
    Hier-Der-Befehl.exe musst du entsprechend modifizieren.

    Aktuell sollte das rauskommen:

    Code:
    "C:\Program Files\TrueCrypt\Hier-Der-Befehl.exe"
    Ich kann dir aber gerade nicht sagen ob es so funktioniert.
    Kann natürlich auch sein das ich irgendwo einen Denkfehler habe und gerade was durcheinander bringe.
    Teste es einfach mal. Die grundlegende Idee war den String am ende abzuschneiden und ihn durch den benötigten Rest zu ersetzen.
     
  7. Hnas2

    Hnas2 Ganzes Gigabyte

    Und warum prüft man nicht einfach, ob die TrueCrypt.exe existiert?

    Code:
    if exist "%ProgramFiles%\TrueCrypt\TrueCrypt.exe" "%ProgramFiles%\TrueCrypt\TrueCrypt.exe"
    if not exist "%ProgramFiles%\TrueCrypt\TrueCrypt.exe" "TrueCrypt\TrueCrypt.exe"
     
  8. VB-Coder

    VB-Coder Megabyte

    @Hnas2: und was machst du wenn das ganze unter einem anderen (unbekannten) Pfad installiert wurde ? Ich glaube das ist der Hauptgrund warum er den String aus der Reg haben will.
     
  9. Hallo,

    nochmal vielen Dank.

    @Hnas2
    VB-Coder hat genau richtig vermutet...

    @VB-Coder
    Das ist ja im Prinzip meine Substring-Methode (nur ein wenig elganter..) Aber es hilft mir leider noch immer nicht weiter, wenn die "TrueCrypt Setup.exe" in einer anderen Version plötzlich "TrueCrypt_Setup.exe" oder "TrueCryptSetup.exe" heißt.

    Im Prinzip müßte man die Position des letzten "\" herausfinden und dann ein substring vom Anfang bis zu dieser Position machen.

    Vieleicht hat noch jemand ne Idee...
     
  10. VB-Coder

    VB-Coder Megabyte

    Code:
    for /f "tokens=2* delims= " %%A in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\TrueCrypt" /v UninstallString') do set UninstallString=%%B
    
    - hier hast du jetzt den Pfad in %UninstallString%

    das sieht dann so aus:
    Code:
    "C:\Program Files\TrueCrypt\TrueCrypt Setup.exe" /u
    
    nun nimmst du diesen Pfad und teilst ihn auf

    Code:
    set "Teil2=%UninstallString:*\=%"
    call set "Teil1=%%UninstallString:\%Teil2%=%%"
    
    somit hast du jetzt
    %UninstallString% = kompletter Pfad
    %Teil1% = Pfad bis zum ersten \
    %Teil2% = Pfad ab dem ersten \

    dann kannst du %Teil2% weiter bearbeiten und wieder in 2 Teile zerlegen
    am Ende setzt du dann die Teile einfach wieder zusammen.

    Ist ne Spontanidee. Eventuell einfach mal probieren.
    Vielleicht hat ja auch noch jemand ne einfachere Lösung.
    Ich steh gerade auch auf'm Schlauch
     
  11. kalweit

    kalweit Hüter der Glaskugel

    ...dann scheint etwas mit deinem TrueCrypt nicht zu stimmen. Ich benutze ebenfalls die portable Version und die stört sich nicht an einem bereits installieren. Grundsätzlich gilt: immer die Version vom Stick zu verwenden, um den Container nicht durch verschiedene Programmversionen zu gefährden.

    ...mutige Annahme. Was auf einem USB-Stick funktioniert, geht selbstverständlich auch auf einer lokalen Festplatte. Was du versuchen könntest, ist herauszufinden, ob der TrueCrypt Treiber geladen ist. Dieser wäre vermutlich auch die Ursache deines Problems - d.h. du versuchst mehrere Instanzen von TrueCrypt zu starten.
     
  12. Hallo,

    @kalweit
    So mutig finde ich die Annahme nicht, alternativ hätte ich jetzt nur noch die Idee die ganze Festplatte zu durchsuchen.
    Das der Treiber das eigentliche Problem ist, damit hast Du recht. Dann aber auch nur, wenn die Versionen voneinander abweichen.

    Es gibt vier Möglichkeiten:
    - TrueCrypt ist installiert und der Treiber ist geladen.
    - TrueCrypt ist installiert und der Treiber ist nicht geladen.
    - TrueCrypt ist nicht installiert und kein Treiber geladen.
    - TrueCrypt ist nicht installiert aber ein Treiber geladen.

    Die letzte Möglichkeit vernachlässige ich mal, da sie nur vorkommt, wenn zwei portable Versionen auf einander Treffen. Bei den ersten beiden Möglichkeiten kann ich einfach die installierte Version benutzen (solange sie kompatibel sind). Bleibt noch die dritte Möglichkeit und da lade ich TrueCrypt vom USB-Stick.


    @VB-Coder
    So habe Deine Idee mal umgesetzt:
    Code:
    @ECHO OFF
    
    SET /a counter=0
    SET hasBackslash=false
    
    REM -----------------------------------------------
    REM  extract uninstallString from registry if
    REM  the string doesn't exists run from usb-stick
    REM -----------------------------------------------
    for /f "tokens=2* delims= " %%A in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\TrueCrypt" /v UninstallString') do set uninstallString=%%B
    if errorlevel 1 goto runFromUsb
    
    echo uninstallString=%uninstallString%
    echo\
    
    
    REM ----------------------------------------
    REM  extract path-parts
    REM ----------------------------------------
    
    :next
    echo UninstallString = %UninstallString%
    
    echo %UninstallString%|findstr \ >NUL
    echo Errorlevel = %errorlevel%
    
    if errorlevel 1 goto break
    if %counter% == 3 goto break
    
    REM if "%hasBackslash%"=="false" goto break
    REM SET hasBackslash=false
    
    set "temp=%UninstallString:*\=%"
    echo temp=%temp%
    
    call set "stringPart_%counter%=%%UninstallString:\%temp%=%%"
    echo stringPart_%counter% = %stringPart_0%
    
    set UninstallString=%temp%
    echo UninstallString = %UninstallString%
    
    SET /a counter=%counter%+1
    echo counter = %counter%
    
    echo\
    
    goto next
    :break
    
    echo\
    SET stringPart_
    echo\
    
    REM -------------------------------------
    REM  Build path
    REM -------------------------------------
    
    SET trueCryptPath=
    FOR /F "tokens=2 delims==" %%A IN ('SET stringPart_') DO (
    	echo part = %%A
    	SET trueCryptPath=%trueCryptPath%%%A\
    	echo trueCryptPath = %trueCryptPath%
    )
    
    SET trueCryptPath=%trueCryptPath%TrueCrypt.exe"
    echo trueCryptPath = %trueCryptPath%
    
    goto start
    
    :runFromUsb
    SET trueCryptPath = TrueCrypt.exe
    
    REM -------------------------------------
    REM  start TrueCrypt
    REM -------------------------------------
    
    :start
    REM start %trueCryptPath% /q background /e /m rm /v "%1\TrueCrypt\CryptContainer"
    Dabei habe ich jetzt noch zwei Probleme:
    1) die Pipe wird nicht als Pipe ausgeführt, sondern vom echo ausgegeben.
    Code:
    echo %UninstallString%|findstr \ >NUL
    Ausgabe:
    Code:
    TrueCrypt Setup.exe" /u|findstr \ >NUL

    2) Das Zusammenbauen des Pfades funktioniert nicht.
    Code:
    SET trueCryptPath=
    FOR /F "tokens=2 delims==" %%A IN ('SET stringPart_') DO (
    	echo part = %%A
    	SET trueCryptPath=%trueCryptPath%%%A\
    	echo trueCryptPath = %trueCryptPath%
    )
    
    SET trueCryptPath=%trueCryptPath%TrueCrypt.exe"
    echo trueCryptPath = %trueCryptPath%
    Ausgabe:
    Code:
    part = "C:
    trueCryptPath =
    part = Program Files
    trueCryptPath =
    part = TrueCrypt
    trueCryptPath =
    trueCryptPath = TrueCrypt\TrueCrypt.exe"


    Wäre toll, wenn jemand noch mal helfen könnte.

    Gruß
    HSKonnection
     
  13. Wirklich keiner eine Idee?
     
Thread Status:
Not open for further replies.

Share This Page