Kartenleser abfragen ob Karte steckt

  • Hallo zusammen,

    hab schon gesucht aber nichts brauchbares gefunden. Ich möchte gern überprüfen ob in Kartenleser eine Karte steckt oder nicht. Denk mal das sollte ja irgendwie möglich sein. Eventuell hat sich damit schon einmal einer auseinander gesetzt und kann mir ein paar Tipps geben.

    Wäre für jede Hilfe dankbar.

    Gruß DevFly

  • Probier es doch mal mit

    [autoit]

    DriveStatus ( "path" )

    [/autoit]

    Returns:
    Value_____________Interpretation
    UNKNOWN________Drive may be unformatted (RAW).
    READY____________Typical of hard drives and drives that contain removable media.
    NOTREADY________Typical of floppy and CD drives that do not contain media.
    INVALID___________May indicate the drive letter does not exist or that a mapped network drive is inaccessible.


    Für dich sollte "NOTREADY" - wenn keine SD-Karte eingelegt ist - und "READY" interessant sein

    Grüße

  • Ich sollte meine Texte besser formulieren. Die rede ist von ein Smartcard Kartenleser nicht SD-Karte. Die Smartcard erzeugt kein laufwerk deswegen würde das nicht gehen.

    Gruß DevFly

  • Das ist schade, denn das macht es nahezu unmöglich heraus zu finden ob sie steckt oder nicht. Da es wahrscheinlich hunderte von Herstellern gibt, welche natürlich alle ihren eigenen Sandart haben wirst du auch nicht so leicht eine UDF finden.
    Ich würde folgendes probieren:

    Gibt es eine Software für den Smartcard-leser, welche diese Funktion unterstützt (also anzeigt ob Karte steckt)? Wenn ja: Schau mal ob es eine DLL gibt welche eventuell eine Funktion enthält welche das prüfen kann.

  • Hmm dachte das man das eventuell aus den Smartcard Dienst auslesen kann. Das mit den DLL auslesen hab ich noch nie gemacht und da die Software einges an DLL´s hat wäre es nicht einfach da die richtige Funktion zu finden denke ich mir mal.

    Gruß DevFly

  • Die information, dass es ein SmartCard-Reader ist, ist nicht unbedingt sehr hilfreich, eine etwas genauere Beschreibung wäre schon nötig (und wenn du jetzt sagst: "es ist ein schwarzer", dann komm ich persönlich bei dir vorbei und hau ich dich 8o ). Zumindest Hersteller und Typ sollte doch möglich sein anzugeben oder?

    Bild1: Ich beim debuggen

  • [autoit]

    If DeviceExists("USB\\VID_0B97&PID_7772\\7&14677936&0&2") Then
    MsgBox(64, "", "Kartenleser ist verbunden.")
    Else
    MsgBox(64, "", "Kartenleser ist nicht verbunden.")
    EndIf

    [/autoit]

    Danke @James1337 für die Mühe aber das hilft nicht wirklich weiter das Gerät ist ja immer vorhanden und es wird bei deiner Abfrage ja nur geprüft ob das Gerät da ist.


    Wow, also so viel Dummheit (von meiner Seite, natürlich) habe ich auch schon lange nicht mehr erlebt... :wacko:

  • Oh klasse. Ich nutz ein O2Micro OZ776 Smartcardreader der ist fest verbaut aber spricht die USB schnittstelle an. @James1337 Namentlich wird er nicht angezeigt habe aber einfach den Geräteinstanzpfad verglichen und dann finde ich ihn auch:

    PartComponent: \\MC0QDTEC\root\cimv2:Win32_PnPEntity.DeviceID="USB\\VID_0B97&PID_7772\\7&14677936&0&2"

    Hoffe das hilft etwas weiter. :)

    Gruß DevFly

  • Das hilft in der Tat.

    Funktioniert folgendes Skript bei dir?

    [autoit]

    If DeviceExists("USB\\VID_0B97&PID_7772\\7&14677936&0&2") Then
    MsgBox(64, "", "Kartenleser ist verbunden.")
    Else
    MsgBox(64, "", "Kartenleser ist nicht verbunden.")
    EndIf

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

    Func DeviceExists($DeviceID, $Computer="localhost")
    Local $A, $B
    $A = ObjGet("winmgmts:\\" & $Computer & "\")
    If @error Then Return SetError(1, 0, False)
    $B = $A.ExecQuery('SELECT * FROM Win32_PnPEntity WHERE DeviceID="'&$DeviceID&'"', "WQL", 0x30)
    If @error Then Return SetError(2, 0, False)
    If (Not IsObj($B)) Then SetError(3, 0, False)
    Return True
    EndFunc

    [/autoit]
  • Danke @James1337 für die Mühe aber das hilft nicht wirklich weiter das Gerät ist ja immer vorhanden und es wird bei deiner Abfrage ja nur geprüft ob das Gerät da ist. Mir gehts aber darum was in Gerät steckt oder nicht sprich ob dort eine Karte eingelegt ist oder nicht und beim ziehen der Karte bleibt das Gerät ja vorhanden.

    Edit: Ich hab mal Google gequält zum Thema und habe das gefunden: http://msdn.microsoft.com/de-de/magazine/cc163521.aspx für mich böhmische dörfer. Gibs hier jemand der C++ oder C# kann? Und das mal in AutoIt stil hier posten kann? Denk mir mal das es darüber gehen sollte den Status ob Karte steckt oder nicht abzufragen.

    Gruß DevFly

    2 Mal editiert, zuletzt von DevFly (7. März 2013 um 11:45)

  • Versuchs mal mit dem:

    [autoit]

    $Context = DllStructCreate("ptr")
    $Handle = DllStructCreate("ptr")
    DllCall("winscard.dll", "long", "SCardEstablishContext", "DWORD", 0, "ptr", 0, "ptr", 0, "ptr", DllStructGetPtr($Context))
    $Result = DllCall("winscard.dll", "long", "SCardConnect", "ptr", $Context, "str", "USB\\VID_0B97&PID_7772\\7&14677936&0&2", "DWORD", 0, "DWORD", 1, "ptr", DllStructGetPtr($Handle), "DWORD*", 1)
    If($Result[0] = 0) Then MsgBox(0, "Erfolg!", "Karte eingesteckt")

    [/autoit]


    Hab keine Ahnung ob das Funktioniert (wahrscheinlich nicht ;) ) aber es ist mal ein Ansatz. Wahrscheinlich kann die jemand etwas DLL-erfahrenes noch besser weiterhelfen.

    Gruss Shadowigor

  • Nein hat nicht wirklich funktioniert aber hast mich so dazu gebracht etwas zu Googlen mit diesen Code bin ich ein Stück weiter:

    [autoit]

    #include <Array.au3>
    Global Const $SCARD_SCOPE_USER = 0
    Dim $hContext
    $Handle = DllStructCreate("ptr")
    $Context = DllStructCreate("ptr")
    Dim $pcchReaders = 500
    Dim $szReaderList
    $dll = DllOpen("WinScard.dll")
    if @error Then MsgBox(0,"1","Fail Load")
    $result = DllCall($dll, "long", "SCardEstablishContext","long",$SCARD_SCOPE_USER,"long",0,"long",0,"long*",$hContext)
    $hContext = $result[4];
    if @error Then
    MsgBox(0,"2","Fail" & @error & $hContext & $result)
    DllClose($dll)
    Exit
    EndIf

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

    $result = DllCall($dll, "lparam", "SCardListReaders","long",$hContext,"str","","STR",$szReaderList,"long*",$pcchReaders)
    if @error Then
    MsgBox(0,"3","Fail" & $pcchReaders & $result)
    DllClose($dll)
    Exit
    EndIf
    _ArrayDisplay($result)
    ;MsgBox(0,"", $result[3])
    DllClose($dll)

    [/autoit]

    Er zeigt mir in $result[3] den Kartenleser an:
    [3]|O2Micro CCID SC Reader 0

    Wenn jetzt noch der SCardConnect gehen würde könnte man mit SCardStatus den sTand abfragen das gelingt mir aber irgendwie nicht.

    P.S: Habe da noch eine Intressante Seite zum Thema gefunden: http://pyscard.sourceforge.net/epydoc/smartca…tml#SCardStatus vieleicht bringt die ja noch was um das Problem zu lösen.

    Gruß DevFly

  • hallo leute,

    ich müsste auch den status meines smartcard-readers abfragen: karte steckt oder steckt nicht.

    hat irgend jemand weitere infos oder gar eine lösung dazu?

    danke für eure hilfe.

    sg