Erkennen ob USB-Gerät angeschlossen ist

  • Hallo.

    Wenn man ein USB-Stick nicht angeschlossen hat sieht der Eintrag unter [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Disk\Enum]
    so aus:

    "Count"=dword:00000002
    "NextInstance"=dword:00000002

    Wenn man ein USB-Stick aber angeschlossen hat sieht der Eintrag unter [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Disk\Enum]
    so aus:
    "Count"=dword:00000003
    "NextInstance"=dword:00000003

    Und jetzt sollte man doch ein Script erstellen können, das prüft, ob ein Stick dran ist oder nicht.

    Da das ganze ja bereits hier im Forum für eine andere Hardware so cirka gefragt wird, habe ich das mal als neues Thema gemacht, da man sich dann da allg. an Hardware dran oder nicht evtl. halten kann.

    Wer möchte darf gerne Scripte posten, die eine Hardwareprüfung anhand des oberen Unterschiedes durchführt. ACHTUNG ! Es muß geschaut werden ob die Zahl sich erhöht hat. Bei mir steht immer ohne Stick die 2, da ich 2 HDD's drinne habe. Das hat aber nicht jede/r.

    Ich bin gespannt ;)

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr

  • Den von dir genannten Reg-Schlüssel würde ich nicht nehmen da es zuviele Fehlerquellen gibt.

    Ich würde eher
    HKLM\SYSTEM\ControlSet001\Control\DeviceClasses\
    benutzen.

    Der gesamte Schlüssel für meinen USB-Stick sieht so aus:
    HKLM\SYSTEM\ControlSet001\Control\DeviceClasses\{53f56307-b6bf-11d0-94f2-00a0c91efb8b}\##?#USBSTOR#Disk&Ven_Kingston&Prod_DT_HyperX&Rev_1.00#0018F30C6AF2SK88060A1199&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}\#\Control\Linked: 0x00000001

    Soll nur eine bestimmte Hardware (könnte ja auch ein Bluetooth-STICK sein) ist der Weg der sicherste.
    Man erfährt den genauen Schlüssel indem man Regshot benutzt.

    Eine allgemeine Abfrage für jede Hardware sollte so auch möglich sein.

    Soll es nur für USB-Laufwerke sein käme noch dieser Schlüssel in betracht:
    HKLM\SYSTEM\ControlSet001\Services\USBSTOR\Enum\Count: 0x00000001
    Hätte den Vorteil das es unabhängig von installierten Festplatten ist.

    Einmal editiert, zuletzt von Bitboy (4. April 2009 um 18:27)

  • Schaue ich mir beides mal an !!!

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr

  • Hallo Alina,
    Oscar hatte mal ein Script zum Sperren des PC's via USB-Stick.
    Er verwendete den Reg-Schlüssel: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\usbstor\Enum
    (wobei 'Enum' nur existiert, wenn ein Usb-Gerät vorhanden ist)

    Hier der Link zu seinem Script

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

    • Offizieller Beitrag

    Hallo,

    Hier noch zwei Möglichkeiten die aktiven USB-Geräte bzw. USB-Massenspeicher-Geräte auszulesen:

    auslesen mit WMI
    [autoit]


    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Const $wbemFlagReturnImmediately = 0x10
    Const $wbemFlagForwardOnly = 0x20

    [/autoit] [autoit][/autoit] [autoit]

    Local $szComputer = "."
    Local $colItems = ""
    Local $objWMIService = ObjGet("winmgmts:\\" & $szComputer & "\root\CIMV2")
    Local $colItems = $objWMIService.ExecQuery('SELECT * FROM Win32_USBControllerDevice', "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

    [/autoit] [autoit][/autoit] [autoit]

    Local $aActiveDevices = "", $aActiveUSBStorDevices = ""
    Local $szActiveDevices = "", $szActiveUSBStorDevices = ""

    [/autoit] [autoit][/autoit] [autoit]

    ; Aktive USB-Geräte auslesen
    If IsObj($colItems) Then
    For $objItem In $colItems
    ; alle USB-Geräte
    $aRegExp = StringRegExp($objItem.Dependent, "(?i).*=""(USB.*\\\\.*)""", 1)
    If IsArray($aRegExp) Then
    If $szActiveDevices <> "" Then $szActiveDevices &= @CRLF
    $szActiveDevices &= $aRegExp[0]
    EndIf
    ; nur USB-Massenspeicher
    $aRegExp = StringRegExp($objItem.Dependent, "(?i).*=""(USBSTOR\\\\.*)""", 1)
    If IsArray($aRegExp) Then
    If $szActiveUSBStorDevices <> "" Then $szActiveUSBStorDevices &= @CRLF
    $szActiveUSBStorDevices &= $aRegExp[0]
    EndIf
    Next
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $aActiveDevices = StringSplit($szActiveDevices, @CRLF, 1)
    _ArrayDisplay($aActiveDevices, "aktive USB-Geräte")

    [/autoit] [autoit][/autoit] [autoit]

    $aActiveUSBStorDevices = StringSplit($szActiveUSBStorDevices, @CRLF, 1)
    _ArrayDisplay($aActiveUSBStorDevices, "aktive USB-Massenspeicher")

    [/autoit]
    auslesen mit DEVCON.EXE
    [autoit]


    #include <Array.au3>
    #include <Constants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Local $szComputer = "."
    Local $aActiveDevices = "", $aActiveUSBStorDevices = ""

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Aktive USB-Geräte auslesen
    $PID = Run(".\devcon.exe -m:\\" & $szComputer & " find @USB*", "", @SW_HIDE, $STDOUT_CHILD)
    $szStdOut = ""

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $szStdOut &= StdoutRead($PID)
    If @error Then ExitLoop
    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    $aActiveDevices = StringRegExp($szStdOut, "(?i)(USB.*\\\S*)\s*:", 3) ; alle aktiven USB-Geräte
    $aActiveUSBStorDevices = StringRegExp($szStdOut, "(?i)(USBSTOR\\\S*)\s*:", 3) ; alle aktiven USB-Massenspeicher-Geräte

    [/autoit] [autoit][/autoit] [autoit]

    _ArrayDisplay($aActiveDevices, "aktive USB-Geräte")
    _ArrayDisplay($aActiveUSBStorDevices, "aktive USB-Massenspeicher")

    [/autoit]


    Die DEVCON.EXE muss im gleichen Verzeichnis vorhanden sein.

  • Danke schön !!!

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr