Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

USB Sticks erkennen und reagieren - pls. help



  • Please log in to reply
18 replies to this topic
cem80
  • Members
  • 33 posts
  • Last active: Oct 07 2016 04:12 AM
  • Joined: 07 Aug 2013

Hi Leute, 

ich würde gerne folgendes erreichen:

Mein Pc soll nur von mir gewählte USB Sticks akzeptieren, das heisst ich habe 3 USB Anschlüsse 
und möchte nur das "Stick 1" beim einstecken akzeptiert wird und nicht "Stick 2" etc.

Nun habe ich mir überlegt dies währe wohl folgend zu lösen:

Mit AHK ein Script schreiben das sobald ein USB Stick bei den verschiedenen USB Anschlüssen
angeschlossen wird dieses "scannt" ob eine dursichtige Datei "Akzeptieren.exe" drauf ist - wenn ja darf der Stick angewandt werden wenn nein wird diese blockiert.

Problem:

Ich kann zwar ein bisschen mit AHK umgehen aber das ist mir leider zu komplex,
ich hoffe das mir diesbezüglich jemand helfen könnte und bedanke mich!

 

L.G.



Alibaba
  • Members
  • 435 posts
  • Last active: Nov 19 2014 04:21 PM
  • Joined: 01 Nov 2012
Du solltest dich mit dem Befehl "DriveGet" beschäftigen, bzw. in deinem Fall "DriveGet, var, List, REMOVABLE".
In einer Verbindung mit einem Timer, kannst du damit prüfen, ob irgendein portabler Speicher an/abgesteckt wurde. Mit fileexist() kannst du dann noch prüfen, ob deine Datei auf dem gerät liegt, allerdings kann man vlt. auch noch eine sicherere Methode finden.

Bin gerade unterwegs, Beispielcode folgt dann noch.

Find the recent autohotkey version here: ahkscript.org


strobo
  • Members
  • 359 posts
  • Last active: Mar 10 2015 08:13 PM
  • Joined: 19 Jun 2012

Hiermit kannste Stöppsel-Events einfangen:
http://www.autohotke...guids/?p=601808

Das könnte den Timer in Alibabas Ansatz ersetzen. Beim Skript-Start sollte man dann natürlich einmalig die Laufwerke überprüfen.
 


Regards,
Babba

Alibaba
  • Members
  • 435 posts
  • Last active: Nov 19 2014 04:21 PM
  • Joined: 01 Nov 2012
Ja, ein Event wäre natürlich perfekt für die Performance!

Find the recent autohotkey version here: ahkscript.org


Seidenweber
  • Moderators
  • 638 posts
  • Last active: Sep 06 2015 01:51 PM
  • Joined: 10 May 2011
✓  Best Answer

Ich habe das (zugegeben nicht ganz elegant) für mich so gelöst und die relevanten Code-Teile mal für dich in ein Script gepackt.

 

Damit das Beispiel funktionieren kann, musst du einmal mit Alt-F12 die Seriennummern auslesen und statt meiner ins Script einfügen. Dann werden diese Laufwerke bei den Abfragen künftig ignoriert.

 

Das Script unterscheidet nicht zwischen der Art der Geräte. Es geht einfach davon aus, dass ein angestöpseltes Gizmo ein USB-Laufwerk/Stick ist und wirft es raus, wenn die geforderte Datei nicht darauf gefunden wird.

 

Kann man sicher noch verfeinern, aber für das, was ich mache, reicht es wink.png

 

Schau mal, ob du damit etwas anfangen kannst. Bei Fragen -> fragen

; ===============================================================================================================================
;   AHK Version ...: AHK_L 1.1.11.02 x64 Unicode
;   Win Version ...: Windows 7 Ultimate x64 SP1
;   Author(s) .....: Seidenweber
; ===============================================================================================================================
; =='GLOBALE EINSTELLUNGEN'======================================================================================================
; ===============================================================================================================================

    #NoEnv                      ; Nicht nachsehen, ob leere Varibalen evtl. Umgebungsvariablen sind
    #SingleInstance force       ; Bei Neustart des Scriptes die alte Instanz ohne Nachfrage ersetzen
    SetWorkingDir %A_ScriptDir% ; Dateioperationen werden im Scriptverzeichnis vorgenommen, wenn kein Pfad angegeben wird.
    SetBatchLines -1            ; Das Script läuft ohne Zwangspausen. (nur für schnelle Rechner empfohlen)
    SetControlDelay, -1         ; Wartezeit beim Zugriff auf langsame Controls abschalten. (nur für schnelle Rechner empfohlen)
    SetWinDelay, -1             ; Verzögerung bei allen Fensteroperationen abschalten. (nur für schnelle Rechner empfohlen)

; =='AUTOEXEC-SEKTION'===========================================================================================================
; ===============================================================================================================================
    SoundPlay, *48
    OnMessage(0x219, "WM_DEVICECHANGE")

; =='ENDE DER AUTOEXEC-SEKTION'==================================================================================================
    Return                    ; Nachfolgend werden Funktionen, Sub-Label und HotKeys definiert
; ===============================================================================================================================

    WM_DEVICECHANGE(wParam) {
        If (wParam <> 0x8000)
            Return
    
        MySerials := "176919428 1376567573 2123396445 2449503051"
        DriveGet,DriveList,List
        Loop, Parse, DriveList
        {
            DriveGet, SerialNumber, Serial, % A_LoopField ":"
            If (SerialNumber && !InStr(MySerials, SerialNumber)) {
                ; unbekanntes Gerät angeschlossen
                ; Benötigt RemoveDrive.exe im Scriptverzeichnis -> http://www.uwe-sieber.de/drivetools.html
                If FileExist(A_LoopField ":\MyStick.sem" )
                    MsgBox,4160,,Entwarnung
                Else
                    Run, % A_ScriptDir "\RemoveDrive.exe " A_LoopField ":"
            }
        }
    }

;   Alt-F12 = Seriennummern der fest eingebauten Laufwerke auslesen
;   und in die Zwischenablage kopieren
    !F12:: 
        Clipboard :=
        DriveGet,DriveList,List
        
        Loop, Parse, DriveList
        {
            DriveGet, SerialNumber, Serial, % A_LoopField ":"
            If SerialNumber
                Clipboard .= (Clipboard = "") ? SerialNumber : " " SerialNumber
        }
        MsgBox % "Seriennummern der fest eingebauten Laufwerke: " Clipboard
    Return

;   Beenden des Scriptes
    Escape::
        SoundPlay, *64
        ExitApp
    Return

All questions & answers are related to AHK 1.1.19.03 x64 Unicode

 


cem80
  • Members
  • 33 posts
  • Last active: Oct 07 2016 04:12 AM
  • Joined: 07 Aug 2013

@all 

Danke für die Bemühungen, es hat mit "Seidenwebers" Script wunderbar geklappt.

L.G.
 



cem80
  • Members
  • 33 posts
  • Last active: Oct 07 2016 04:12 AM
  • Joined: 07 Aug 2013

Hallo, wie schon erwähnt das Programm funktioniert so super.
Würde wenn möglich (habe versucht das Programm abzuändern - ging nicht) gerne
auch die Funktion drinnen haben das wenn Stick erkannt wird "test.exe" ausgeführt wird.

Versuchte "keine Gefahr" durch test.exe auszuwechseln etc. - geht nicht obwohl das Script
eigentlich schon so geschrieben wurde das es "fast" gehen sollte - bekomme ich wie vieles nicht hin :(

Danke für die Gedult

l.g.



CodeNewbee
  • Members
  • 104 posts
  • Last active: Dec 02 2015 10:12 PM
  • Joined: 25 Jul 2013

Dann musst Du nur an der entsprechenden Stelle noch den Run Befehl einfügen:

Entweder Du tauschst die Zeile:
 

MsgBox,4160,,Entwarnung

durch
 

Run, % A_ScriptDir "\test.exe ", ,
 

aus, oder Du ergänzt den Befehl, wie in dem nachfolgenden angepassten Script von Seidenweber getan...

{
    MsgBox,4160,,Entwarnung
    ; Benötigt test.exe im Scriptverzeichnis!!!
    Run, % A_ScriptDir "\test.exe ", ,
    }

 

Die Voraussetzung dafür ist dann natürlich auch das sich die Programme RemoveDrive.exe und test.exe im gleichen Verzeichnis wie das ahk Skript befinden.
Ich würde mich freuen wenn das weiterhilft...
 

      ; ===============================================================================================================================
    ; AHK Version ...: AHK_L 1.1.11.02 x64 Unicode
    ; Win Version ...: Windows 7 Ultimate x64 SP1
    ; Author(s) .....: Seidenweber
    ; ===============================================================================================================================
    ; =='GLOBALE EINSTELLUNGEN'======================================================================================================
    ; ===============================================================================================================================
     
    #NoEnv ; Nicht nachsehen, ob leere Varibalen evtl. Umgebungsvariablen sind
    #SingleInstance force ; Bei Neustart des Scriptes die alte Instanz ohne Nachfrage ersetzen
    SetWorkingDir %A_ScriptDir% ; Dateioperationen werden im Scriptverzeichnis vorgenommen, wenn kein Pfad angegeben wird.
    SetBatchLines -1 ; Das Script läuft ohne Zwangspausen. (nur für schnelle Rechner empfohlen)
    SetControlDelay, -1 ; Wartezeit beim Zugriff auf langsame Controls abschalten. (nur für schnelle Rechner empfohlen)
    SetWinDelay, -1 ; Verzögerung bei allen Fensteroperationen abschalten. (nur für schnelle Rechner empfohlen)
     
    ; =='AUTOEXEC-SEKTION'===========================================================================================================
    ; ===============================================================================================================================
    SoundPlay, *48
    OnMessage(0x219, "WM_DEVICECHANGE")
     
    ; =='ENDE DER AUTOEXEC-SEKTION'==================================================================================================
    Return ; Nachfolgend werden Funktionen, Sub-Label und HotKeys definiert
    ; ===============================================================================================================================
     
    WM_DEVICECHANGE(wParam) {
    If (wParam <> 0x8000)
    Return
    MySerials := "176919428 1376567573 2123396445 2449503051"
    DriveGet,DriveList,List
    Loop, Parse, DriveList
    {
    DriveGet, SerialNumber, Serial, % A_LoopField ":"
    If (SerialNumber && !InStr(MySerials, SerialNumber)) {
    ; unbekanntes Gerät angeschlossen
    ; Benötigt RemoveDrive.exe im Scriptverzeichnis -> http://www.uwe-sieber.de/drivetools.html
    If FileExist(A_LoopField ":\MyStick.sem" )
    {
    MsgBox,4160,,Entwarnung
    ; Benötigt test.exe im Scriptverzeichnis!!!
    Run, % A_ScriptDir "\test.exe ", ,
    }
    Else
    Run, % A_ScriptDir "\RemoveDrive.exe " A_LoopField ":"
    }
    }
    }
     
    ; Alt-F12 = Seriennummern der fest eingebauten Laufwerke auslesen
    ; und in die Zwischenablage kopieren
    !F12::
    Clipboard :=
    DriveGet,DriveList,List
    Loop, Parse, DriveList
    {
    DriveGet, SerialNumber, Serial, % A_LoopField ":"
    If SerialNumber
    Clipboard .= (Clipboard = "") ? SerialNumber : " " SerialNumber
    }
    MsgBox % "Seriennummern der fest eingebauten Laufwerke: " Clipboard
    Return
     
    ; Beenden des Scriptes
    Escape::
    SoundPlay, *64
    ExitApp
    Return


cem80
  • Members
  • 33 posts
  • Last active: Oct 07 2016 04:12 AM
  • Joined: 07 Aug 2013

Hallo, danke für die Bemühung.

Ich habe dies schon mal so probiert aber geht so nicht.
Wenn der Stick erkannt wird (true) so geschieht nichts - Falscher Stick so wird dieser deaktiviert.

 

l.g.



Seidenweber
  • Moderators
  • 638 posts
  • Last active: Sep 06 2015 01:51 PM
  • Joined: 10 May 2011

Das sollte aber wirklich so funktionieren. Vielleicht hast du dich nur irgendwie vertippt?

    If FileExist(A_LoopField ":\MyStick.sem" ) {
        MsgBox,4160,,Entwarnung
        Run, % A_ScriptDir "\Test.exe"   ; Test.exe muss im Scriptverzeichnis liegen
        Run, % A_LoopField ":\Test.exe"  ; Test.exe muss im Root auf dem Stick liegen
    } Else
        ...

All questions & answers are related to AHK 1.1.19.03 x64 Unicode

 


cem80
  • Members
  • 33 posts
  • Last active: Oct 07 2016 04:12 AM
  • Joined: 07 Aug 2013

Ne funktioniert nicht, 

ich habe im Scriptverzeichniss und auf dem USB Stick die Test.exe hinterlegt.

Script sieht wie folgt aus:

      ; ===============================================================================================================================
    ; AHK Version ...: AHK_L 1.1.11.02 x64 Unicode
    ; Win Version ...: Windows 7 Ultimate x64 SP1
    ; Author(s) .....: Seidenweber
    ; ===============================================================================================================================
    ; =='GLOBALE EINSTELLUNGEN'======================================================================================================
    ; ===============================================================================================================================
     
    #NoEnv ; Nicht nachsehen, ob leere Varibalen evtl. Umgebungsvariablen sind
    #SingleInstance force ; Bei Neustart des Scriptes die alte Instanz ohne Nachfrage ersetzen
    SetWorkingDir %A_ScriptDir% ; Dateioperationen werden im Scriptverzeichnis vorgenommen, wenn kein Pfad angegeben wird.
    SetBatchLines -1 ; Das Script läuft ohne Zwangspausen. (nur für schnelle Rechner empfohlen)
    SetControlDelay, -1 ; Wartezeit beim Zugriff auf langsame Controls abschalten. (nur für schnelle Rechner empfohlen)
    SetWinDelay, -1 ; Verzögerung bei allen Fensteroperationen abschalten. (nur für schnelle Rechner empfohlen)
     
    ; =='AUTOEXEC-SEKTION'===========================================================================================================
    ; ===============================================================================================================================
    SoundPlay, *48
    OnMessage(0x219, "WM_DEVICECHANGE")
     
    ; =='ENDE DER AUTOEXEC-SEKTION'==================================================================================================
    Return ; Nachfolgend werden Funktionen, Sub-Label und HotKeys definiert
    ; ===============================================================================================================================
     
    WM_DEVICECHANGE(wParam) {
    If (wParam <> 0x8000)
    Return
    MySerials := "3639805961 2689242349 1417670601"
    DriveGet,DriveList,List
    Loop, Parse, DriveList
    {
    DriveGet, SerialNumber, Serial, % A_LoopField ":"
    If (SerialNumber && !InStr(MySerials, SerialNumber)) {
    ; unbekanntes Gerät angeschlossen
    ; Benötigt RemoveDrive.exe im Scriptverzeichnis -> http://www.uwe-sieber.de/drivetools.html
     If FileExist(A_LoopField ":\MyStick.sem" ) {
        MsgBox,4160,,Entwarnung
        Run, % A_ScriptDir "\Test.exe"   ; Test.exe muss im Scriptverzeichnis liegen
        Run, % A_LoopField ":\Test.exe"  ; Test.exe muss im Root auf dem Stick liegen
    } Else
    Run, % A_ScriptDir "\RemoveDrive.exe " A_LoopField ":"
    }
    }
    }
     
    ; Alt-F12 = Seriennummern der fest eingebauten Laufwerke auslesen
    ; und in die Zwischenablage kopieren
    !F12::
    Clipboard :=
    DriveGet,DriveList,List
    Loop, Parse, DriveList
    {
    DriveGet, SerialNumber, Serial, % A_LoopField ":"
    If SerialNumber
    Clipboard .= (Clipboard = "") ? SerialNumber : " " SerialNumber
    }
    MsgBox % "Seriennummern der fest eingebauten Laufwerke: " Clipboard
    Return
     
    ; Beenden des Scriptes
    Escape::
    SoundPlay, *64
    ExitApp
    Return

AHK Scriptverlauf zeigt folgendes auf:
 

---- D:\Dokumente und Einstellungen\Bearbeitung\Desktop\Neu AutoHotkey Script.ahk
011: SetWorkingDir,%A_ScriptDir%
012: SetBatchLines,-1
013: SetControlDelay,-1
014: SetWinDelay,-1
018: SoundPlay,*48
019: OnMessage(0x219, "WM_DEVICECHANGE")  
022: Return (3.00)
026: if (wParam <> 0x8000)  
027: Return
026: if (wParam <> 0x8000)  
027: Return (0.30)
026: if (wParam <> 0x8000)  
027: Return
026: if (wParam <> 0x8000)  
027: Return
026: if (wParam <> 0x8000)  
027: Return
026: if (wParam <> 0x8000)  
027: Return (1.55)
026: if (wParam <> 0x8000)  
027: Return
026: if (wParam <> 0x8000)  
027: Return
026: if (wParam <> 0x8000)  
027: Return
026: if (wParam <> 0x8000)  
027: Return (0.02)
026: if (wParam <> 0x8000)  
028: MySerials := "3639805961 2689242349 1417670601"
029: DriveGet,DriveList,List
030: Loop,Parse,DriveList
032: DriveGet,SerialNumber,Serial,A_LoopField ":"
033: if (SerialNumber && !InStr(MySerials, SerialNumber))  
043: }
032: DriveGet,SerialNumber,Serial,A_LoopField ":"
033: if (SerialNumber && !InStr(MySerials, SerialNumber))  
043: }
032: DriveGet,SerialNumber,Serial,A_LoopField ":"
033: if (SerialNumber && !InStr(MySerials, SerialNumber))  
043: }
032: DriveGet,SerialNumber,Serial,A_LoopField ":"
033: if (SerialNumber && !InStr(MySerials, SerialNumber))  
043: }
032: DriveGet,SerialNumber,Serial,A_LoopField ":"
033: if (SerialNumber && !InStr(MySerials, SerialNumber))  
043: }
032: DriveGet,SerialNumber,Serial,A_LoopField ":" (2.83)
033: if (SerialNumber && !InStr(MySerials, SerialNumber))  
043: }
044: } (0.01)
026: if (wParam <> 0x8000)  
027: Return
026: if (wParam <> 0x8000)  
027: Return (61.95)

Habe selber abgesehen von dem was ich jetzt gepostet habe noch einige andere veränderungen versucht
aber leider ohne Erfolg.

Der Abschnitt richtiger USB Stick wird vollkommen übersprungen und stattdessen nur Stick auswerfen konzentriert.

l.g. und danke!



Seidenweber
  • Moderators
  • 638 posts
  • Last active: Sep 06 2015 01:51 PM
  • Joined: 10 May 2011

Ich habe dein Script benutzt, meine Seriennummern eingetragen, eine MyStick.sem und eine Test.exe auf den Stick kopiert.

Bei mir funktioniert es. Wenn das semaphore file nicht existiert, will das Script den Stick rauswerfen und wenn es da ist, wird die .exe gestartet.

 

Da bleibt für mich nur als Erklärung, dass eine deiner Seriennummern zu dem Stick gehört, mit dem du das getestet hast.


All questions & answers are related to AHK 1.1.19.03 x64 Unicode

 


Alibaba
  • Members
  • 435 posts
  • Last active: Nov 19 2014 04:21 PM
  • Joined: 01 Nov 2012
Natürlich ist das die Erklärung, sonst würde ja die entsprechende if-abfrage greifen. Stattdessen werden alle übersprungen was ja somit bedeutet, dass alle gefundenen Geräte bzw. deren seriennummer in der Liste vorkommen.

Find the recent autohotkey version here: ahkscript.org


cem80
  • Members
  • 33 posts
  • Last active: Oct 07 2016 04:12 AM
  • Joined: 07 Aug 2013

Tatsächlich, der Grund für das nicht funktionieren ist das ich die Seriennummer vom Stick mit eingegeben habe.

Nun, dann läuft das Script eigentlich, wobei diesmal das Problem mit einem fremden Stick vorhanden ist.
Das heisst, wenn irgend ein fremder Stick mit diesen 2 Dateien eingesteckt wird, würde dieser nicht mehr deaktiviert
sondern akzeptiert werden.

Kombination zwischen nur "registrierte" Seriennnummern und bei erkennung die Datei Test.exe
starten würde da wohl die Sache einiges komplizierter machen?

 

Danke für die Zeit.



Alibaba
  • Members
  • 435 posts
  • Last active: Nov 19 2014 04:21 PM
  • Joined: 01 Nov 2012

Wie jetzt? Du willst also das die Test.exe nur ausgeführt wird, wenn die Seriennummer des Sticks gespeichert ist?

Dann musst du hinter dem

If (SerialNumber && !InStr(MySerials, SerialNumber))

noch ein "ElseIf" anfügen über dass du prüfst, ob die Test.exe auf dem entsprechendem Laufwerk existiert und falls ja, einfach ausführen.


Find the recent autohotkey version here: ahkscript.org