USB Schnittstelle: Gerät softwaremäßig an- und ausstecken

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von dive26.

    USB Schnittstelle: Gerät softwaremäßig an- und ausstecken

    Hallo Leute,

    gibt es in vb.net irgend eine Möglichkeit das Aus- und wieder Anstecken eines oder aller Geräte am USB Port zu simulieren.
    Hintergrund: Beim Systemstart gibt es ein Gerät welches erst nach An- und Abstecken funktioniert. Ich würde das gerne gezielt softwaregesteuert anstoßen.

    LG Roland
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Hi @dive26,

    google doch bitte erst einmal, bevor du hier Dinge erfragst. Zum Auswerfen, nur als Beispiel (Quelle: activevb.de/tipps/vb6tipps/tipp0718.html)
    Spoiler anzeigen

    Quellcode

    1. Option Explicit
    2. ' ----==== KERNEL32 Deklarationen ====----
    3. Private Declare Function GetLogicalDrives Lib "kernel32" () As Long
    4. Private Sub cmdEject_Click()
    5. Dim strDriveLetter As String
    6. ' sind Einträge in der ComboBox vorhanden
    7. If cbDrive.ListCount > 0 Then
    8. ' Laufwerksbuchstaben auslesen
    9. strDriveLetter = Chr$(65 + cbDrive.ItemData(cbDrive.ListIndex))
    10. ' Laufwerk auswerfen
    11. If EjectUsbDrive(strDriveLetter, True) Then
    12. MsgBox "Laufwerk '" & strDriveLetter & ":\' wurde " & _
    13. "erfolgreich enfernt.", vbOKOnly Or vbInformation
    14. ' alle auswerfbare Laufwerke ermitteln
    15. Call ListRemovableDrives
    16. Else
    17. MsgBox "Laufwerk '" & strDriveLetter & ":\' konnte nicht " & _
    18. "enfernt werden.", vbOKOnly Or vbExclamation
    19. End If
    20. End If
    21. End Sub
    22. Private Sub ListRemovableDrives()
    23. Dim lngDriveNum As Long
    24. Dim lngRet As Long
    25. Dim strDriveName As String
    26. ' Button deaktivieren
    27. cmdEject.Enabled = False
    28. ' alle Items in der ListBox löschen
    29. cbDrive.Clear
    30. ' alle verfügbare Laufwerke ermitteln
    31. lngRet = GetLogicalDrives
    32. ' alle Laufwerksnummern durchlaufen
    33. For lngDriveNum = 0 To 25
    34. ' ist das entsprechende Bit in lngRet <> 0
    35. If (lngRet And 2 ^ lngDriveNum) <> 0 Then
    36. ' Laufwerksbuchstabe
    37. strDriveName = Chr$(65 + lngDriveNum)
    38. ' Laufwerkstyp ermitteln (USB-Laufwerke)
    39. If Len(GetDevInstStr(strDriveName)) > 0 Then
    40. ' Daten in der ComboBox ausgeben und speichern
    41. cbDrive.AddItem strDriveName & ":\"
    42. cbDrive.ItemData(cbDrive.NewIndex) = lngDriveNum
    43. End If
    44. End If
    45. ' nächste Laufwerksnummer
    46. Next lngDriveNum
    47. ' sind Einträge in der ComboBox vorhanden
    48. If cbDrive.ListCount > 0 Then
    49. ' erster Eintrag in der ComboBox
    50. cbDrive.ListIndex = 0
    51. ' Button aktivieren
    52. cmdEject.Enabled = True
    53. End If
    54. End Sub
    55. Private Sub Form_Load()
    56. ' alle auswerfbare Laufwerke ermitteln
    57. Call ListRemovableDrives
    58. End Sub
    59. '-------- Ende Formular "frmMain" alias frmMain.frm --------
    60. '-------- Anfang Modul "modEject" alias modEject.bas --------
    61. Option Explicit
    62. ' ----==== Const ====----
    63. Private Const CR_SUCCESS As Long = &H0
    64. Private Const DN_REMOVABLE As Long = &H4000
    65. Private Const DRIVE_CDROM As Long = 5
    66. Private Const DRIVE_FIXED As Long = 3
    67. Private Const DRIVE_REMOVABLE As Long = 2
    68. Private Const DIGCF_DEVICEINTERFACE As Long = &H10
    69. Private Const DIGCF_PRESENT As Long = &H2
    70. Private Const ERROR_INSUFFICIENT_BUFFER As Long = 122
    71. Private Const ERROR_NO_MORE_ITEMS As Long = 259&
    72. Private Const FILE_SHARE_READ As Long = &H1
    73. Private Const FILE_SHARE_WRITE As Long = &H2
    74. Private Const INVALID_HANDLE_VALUE As Long = -1
    75. Private Const IOCTL_STORAGE_GET_DEVICE_NUMBER As Long = &H2D1080
    76. Private Const MAX_PATH As Long = 260
    77. Private Const OPEN_EXISTING As Long = 3
    78. Private Const GUID_DEVINTERFACE_DISK As String = _
    79. "{53F56307-B6BF-11D0-94F2-00A0C91EFB8B}"
    80. Private Const GUID_DEVINTERFACE_FLOPPY As String = _
    81. "{53F56311-B6BF-11D0-94F2-00A0C91EFB8B}"
    82. Private Const GUID_DEVINTERFACE_CDROM As String = _
    83. "{53F56308-B6BF-11D0-94F2-00A0C91EFB8B}"
    84. ' ----==== Type ====----
    85. Private Type GUID
    86. Data1 As Long
    87. Data2 As Integer
    88. Data3 As Integer
    89. Data4(7) As Byte
    90. End Type
    91. Private Type SP_DEVICE_INTERFACE_DATA
    92. cbSize As Long
    93. InterfaceClassGuid As GUID
    94. flags As Long
    95. Reserved As Long
    96. End Type
    97. Private Type STORAGE_DEVICE_NUMBER
    98. DeviceType As Long
    99. DeviceNumber As Long
    100. PartitionNumber As Long
    101. End Type
    102. ' ----==== KERNEL32 Deklarationen ====----
    103. Private Declare Function CloseHandle Lib "kernel32" ( _
    104. ByVal hObject As Long) As Long
    105. Private Declare Function CreateFile Lib "kernel32" _
    106. Alias "CreateFileA" ( _
    107. ByVal lpFileName As String, _
    108. ByVal dwDesiredAccess As Long, _
    109. ByVal dwShareMode As Long, _
    110. ByRef lpSecurityAttributes As Any, _
    111. ByVal dwCreationDisposition As Long, _
    112. ByVal dwFlagsAndAttributes As Long, _
    113. ByVal hTemplateFile As Long) As Long
    114. Private Declare Function DeviceIoControl Lib "kernel32" ( _
    115. ByVal hDevice As Long, _
    116. ByVal dwIoControlCode As Long, _
    117. ByRef lpInBuffer As Any, _
    118. ByVal nInBufferSize As Long, _
    119. ByRef lpOutBuffer As Any, _
    120. ByVal nOutBufferSize As Long, _
    121. ByRef lpBytesReturned As Long, _
    122. ByRef lpOverlapped As Any) As Long
    123. Private Declare Function GetDriveType Lib "kernel32" _
    124. Alias "GetDriveTypeA" ( _
    125. ByVal nDrive As String) As Long
    126. Private Declare Function QueryDosDevice Lib "kernel32.dll" _
    127. Alias "QueryDosDeviceA" ( _
    128. ByVal lpDeviceName As String, _
    129. ByVal lpTargetPath As String, _
    130. ByVal ucchMax As Long) As Long
    131. ' ----==== OLE32 Deklarationen ====----
    132. Private Declare Function IIDFromString Lib "ole32" ( _
    133. ByVal lpsz As Long, _
    134. ByRef lpiid As GUID) As Long
    135. ' ----==== SETUPAPI Deklarationen ====----
    136. Private Declare Function CM_Get_DevNode_Status Lib "setupapi.dll" ( _
    137. ByRef pulStatus As Long, _
    138. ByRef pulProblemNumber As Long, _
    139. ByVal dnDevInst As Long, _
    140. ByVal ulFlags As Long) As Long
    141. Private Declare Function CM_Get_Parent Lib "setupapi.dll" ( _
    142. ByRef pdnDevInst As Long, _
    143. ByVal dnDevInst As Long, _
    144. ByVal ulFlags As Long) As Long
    145. Private Declare Function CM_Locate_DevNodeA Lib "setupapi.dll" ( _
    146. ByRef pdnDevInst As Long, _
    147. ByVal pDeviceID As Long, _
    148. ByVal ulFlags As Long) As Long
    149. Private Declare Function CM_Request_Device_EjectA Lib "setupapi.dll" ( _
    150. ByVal dnDevInst As Long, _
    151. ByRef pVetoType As Long, _
    152. ByVal pszVetoName As Long, _
    153. ByVal ulNameLength As Long, _
    154. ByVal ulFlags As Long) As Long
    155. Private Declare Function SetupDiDestroyDeviceInfoList Lib "setupapi.dll" ( _
    156. ByVal DeviceInfoSet As Long) As Long
    157. Private Declare Function SetupDiEnumDeviceInterfaces Lib "setupapi.dll" ( _
    158. ByVal DeviceInfoSet As Long, _
    159. ByRef DeviceInfoData As Any, _
    160. ByRef InterfaceClassGuid As GUID, _
    161. ByVal MemberIndex As Long, _
    162. ByRef DeviceInterfaceData As SP_DEVICE_INTERFACE_DATA) As Long
    163. Private Declare Function SetupDiGetDeviceInterfaceDetail Lib "setupapi.dll" _
    164. Alias "SetupDiGetDeviceInterfaceDetailA" ( _
    165. ByVal DeviceInfoSet As Long, _
    166. ByRef DeviceInterfaceData As SP_DEVICE_INTERFACE_DATA, _
    167. ByRef DeviceInterfaceDetailData As Any, _
    168. ByVal DeviceInterfaceDetailDataSize As Long, _
    169. ByRef RequiredSize As Long, _
    170. ByRef DeviceInfoData As Any) As Long
    171. Private Declare Function SetupDiGetClassDevs Lib "setupapi.dll" _
    172. Alias "SetupDiGetClassDevsA" ( _
    173. ByRef ClassGuid As GUID, _
    174. ByVal Enumerator As String, _
    175. ByVal hwndParent As Long, _
    176. ByVal flags As Long) As Long
    177. ' ------------------------------------------------------
    178. ' Funktion : EjectUsbDrive
    179. ' Beschreibung : USB-Laufwerk sicher entfernen/auswerfen
    180. ' Übergabewert : DriveLetter = Laufwerksbuchstabe
    181. ' ShowStdMessage = Standardnachricht anzeigen oder nicht
    182. ' Rückgabewert : True/False
    183. ' ------------------------------------------------------
    184. ' USB Gerät abmelden. (Sicheres Entfernen)
    185. ' Als Hilfestellung diente der Anno 2003 in c't veröffentlichter C++ Code
    186. ' DevEject von Matthias Withopf.
    187. ' ------------------------------------------------------
    188. Public Function EjectUsbDrive(ByVal DriveLetter As String, Optional _
    189. ShowStdMessage As Boolean = True) As Boolean
    190. Dim strDevInst As String
    191. Dim hDevInst As Long
    192. Dim lngStatus As Long
    193. Dim lngProblem As Long
    194. Dim lngVetoType As Long
    195. Dim strVetoName As String
    196. ' Storagename aus der Registry auslesen
    197. strDevInst = GetDevInstStr(DriveLetter)
    198. ' ist ein Storagename vorhanden
    199. If Len(strDevInst) <> 0 Then
    200. ' Handle auf den Node holen
    201. If CM_Locate_DevNodeA(hDevInst, StrPtr(StrConv(strDevInst, _
    202. vbFromUnicode)), 0&) = CR_SUCCESS Then
    203. ' wenn dieser Node nicht auswerfbar ist, dann solange bis zum
    204. ' Parentnode raufgehen bis dieser auswerfbar ist
    205. If CM_Get_DevNode_Status(lngStatus, lngProblem, hDevInst, 0&) = _
    206. CR_SUCCESS Then
    207. ' solange die Schleife durchlaufen bis (lngStatus And
    208. ' DN_REMOVABLE) = DN_REMOVABLE
    209. Do While Not (lngStatus And DN_REMOVABLE) = DN_REMOVABLE
    210. ' wenn kein Parentnode mehr vorhanden, dann Schleife
    211. ' verlassen
    212. If Not CM_Get_Parent(hDevInst, hDevInst, 0&) = _
    213. CR_SUCCESS Then Exit Do
    214. ' wenn CM_Get_DevNode_Status nicht = CR_SUCCESS ist,
    215. ' dann Schleife verlassen
    216. If Not CM_Get_DevNode_Status(lngStatus, lngProblem, _
    217. hDevInst, 0&) = CR_SUCCESS Then Exit Do
    218. Loop
    219. ' ist dieser Node auswerbar
    220. If (lngStatus And DN_REMOVABLE) = DN_REMOVABLE Then
    221. ' wenn nicht die Standardnachricht angezeigt werden soll
    222. If Not ShowStdMessage Then
    223. ' strVetoName mit vbNullChar auffüllen
    224. strVetoName = String$(MAX_PATH, vbNullChar)
    225. End If
    226. ' wenn das auswerfen erfolgreich war
    227. If CM_Request_Device_EjectA(hDevInst, lngVetoType, _
    228. StrPtr(strVetoName), Len(strVetoName), 0&) = _
    229. CR_SUCCESS Then
    230. ' wenn nicht
    231. ' nicht die Standardnachricht anzeigt werden soll
    232. If Not ShowStdMessage Then
    233. MsgBox "Das Gerät 'USB-Massenspeichert' [" & _
    234. DriveLetter & ":\] kann jetzt entfernt " & _
    235. "werden.", vbOKOnly Or vbInformation
    236. End If
    237. ' entfernen war erfolgreich
    238. EjectUsbDrive = True
    239. Else
    240. ' wenn nicht
    241. ' nicht die Standardnachricht anzeigt werden soll
    242. If Not ShowStdMessage Then
    243. ' ist lngVetoType <> 0
    244. If lngVetoType <> 0 Then
    245. ' strVetoName konvertieren
    246. strVetoName = StrConv(strVetoName, vbUnicode)
    247. ' strVetoName bis zum ersten vbNullChar
    248. strVetoName = Left$(strVetoName, InStr(1, _
    249. strVetoName, vbNullChar) - 1)
    250. MsgBox "Das Gerät '" & strVetoName & "' " & _
    251. "[" & DriveLetter & ":\] kann zur " & _
    252. "Zeit nicht deaktiviert werden. " & _
    253. "Wiederholen Sie den Vorgang " & _
    254. "später.", vbOKOnly Or vbExclamation
    255. End If
    256. End If
    257. ' entfernen war nicht erfolgreich
    258. EjectUsbDrive = False
    259. End If
    260. End If
    261. End If
    262. End If
    263. End If
    264. End Function
    265. ' ------------------------------------------------------
    266. ' Funktion : GetDevInstStr
    267. ' Beschreibung : Gerätenamen zu einem Laufwerk ermitteln
    268. ' Übergabewert : DriveLetter = Laufwerksbuchstabe
    269. ' Rückgabewert : Gerätename
    270. ' ------------------------------------------------------
    271. ' Der Original C++ Code zu dieser Funktion ist auf der Seite
    272. ' [url]http://www.codeproject.com/KB/system/RemoveDriveByLetter.aspx[/url]
    273. ' zu finden. Einge Teile zu dieser Funktion stammen auch von
    274. ' [url]http://www.vbarchiv.net/workshop/workshop78s2.html[/url]
    275. ' ------------------------------------------------------
    276. Public Function GetDevInstStr(ByVal DriveLetter As String) As String
    277. Dim hVolume As Long
    278. Dim hDevInfo As Long
    279. Dim bolIsFloppy As Boolean
    280. Dim bytBuff() As Byte
    281. Dim lngRet As Long
    282. Dim lngBuffLen As Long
    283. Dim lngDevNumber As Long
    284. Dim lngIndex As Long
    285. Dim strRet As String
    286. Dim strBuff As String * MAX_PATH
    287. Dim strDosDevName As String
    288. Dim tGUID As GUID
    289. Dim tSDN As STORAGE_DEVICE_NUMBER
    290. Dim tSPDID As SP_DEVICE_INTERFACE_DATA
    291. ' Handle auf das Laufwerk holen
    292. hVolume = CreateFile("\\.\" & DriveLetter & ":", 0&, FILE_SHARE_READ Or _
    293. FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING, 0&, ByVal 0&)
    294. ' ist ein gültiges Handle vorhanden
    295. If hVolume <> INVALID_HANDLE_VALUE Then
    296. ' Laufwerksnummer ermitteln
    297. If DeviceIoControl(hVolume, IOCTL_STORAGE_GET_DEVICE_NUMBER, ByVal _
    298. 0&, 0&, tSDN, Len(tSDN), lngRet, ByVal 0&) Then
    299. ' Laufwerksnummer speichern
    300. lngDevNumber = tSDN.DeviceNumber
    301. End If
    302. ' Handle schließen
    303. Call CloseHandle(hVolume)
    304. End If
    305. ' DOS-Gerätenamen vom Laufwerk ermitteln
    306. If QueryDosDevice(DriveLetter & ":", strBuff, MAX_PATH) Then
    307. ' DOS-Gerätename
    308. strDosDevName = Left$(strBuff, InStr(1, strBuff, vbNullChar) - 1)
    309. ' ist das Laufwerk ein Diskettenlauferk
    310. If InStr(1, strDosDevName, "\Floppy") Then
    311. ' Laufwerk ist ein Diskettenlaufwerk
    312. bolIsFloppy = True
    313. End If
    314. End If
    315. ' Laufwerkstyp ermitteln
    316. Select Case GetDriveType(DriveLetter & ":\")
    317. ' auswerfbare Laufwerke
    318. Case DRIVE_REMOVABLE
    319. ' Diskettenlaufwerke
    320. If bolIsFloppy Then
    321. ' String zu GUID konvertieren
    322. Call IIDFromString(StrPtr(GUID_DEVINTERFACE_FLOPPY), tGUID)
    323. Else
    324. ' andere auswerfbare Laufwerke
    325. ' String zu GUID konvertieren
    326. Call IIDFromString(StrPtr(GUID_DEVINTERFACE_DISK), tGUID)
    327. End If
    328. ' HD-Laufwerke
    329. Case DRIVE_FIXED
    330. ' String zu GUID konvertieren
    331. Call IIDFromString(StrPtr(GUID_DEVINTERFACE_DISK), tGUID)
    332. ' CDROM-Laufwerke
    333. Case DRIVE_CDROM
    334. ' String zu GUID konvertieren
    335. Call IIDFromString(StrPtr(GUID_DEVINTERFACE_CDROM), tGUID)
    336. End Select
    337. ' Handle auf die Geräteklasse holen
    338. hDevInfo = SetupDiGetClassDevs(tGUID, vbNullString, 0&, DIGCF_PRESENT Or _
    339. DIGCF_DEVICEINTERFACE)
    340. ' ist ein gültiges Handle vorhanden
    341. If hDevInfo <> INVALID_HANDLE_VALUE Then
    342. tSPDID.cbSize = Len(tSPDID)
    343. ' alle Geräte in dieser Geräteklasse durchlaufen
    344. Do
    345. ' Geräte in dieser Geräteklasse auflisten
    346. If SetupDiEnumDeviceInterfaces(hDevInfo, ByVal 0&, tGUID, _
    347. lngIndex, tSPDID) = 0 Then
    348. ' wenn keine Geräte mehr in dieser Geräteklasse vorhanden sind
    349. If Err.LastDllError = ERROR_NO_MORE_ITEMS Then
    350. ' Schleife verlassen
    351. Exit Do
    352. Else
    353. ' Funktion verlassen
    354. Exit Function
    355. End If
    356. End If
    357. ' hier ermitteln wir die erforderliche Buffergröße zur
    358. ' Aufnahme des Gerätenamens
    359. If SetupDiGetDeviceInterfaceDetail(hDevInfo, tSPDID, ByVal 0&, _
    360. 0&, lngBuffLen, ByVal 0&) = 0 Then
    361. ' wenn der Buffer zu klein ist
    362. If Err.LastDllError = ERROR_INSUFFICIENT_BUFFER Then
    363. 'Type SP_DEVICE_INTERFACE_DETAIL_DATA
    364. ' cbSize As Long
    365. ' DevicePath(0) As Byte
    366. 'End Type
    367. ' anstelle von SP_DEVICE_INTERFACE_DETAIL_DATA
    368. ' verwenden wir hier ein BytaArray
    369. ' Buffer dimensionieren
    370. ReDim bytBuff(lngBuffLen - 1)
    371. ' Len(SP_DEVICE_INTERFACE_DETAIL_DATA)
    372. bytBuff(0) = 5
    373. ' Gerätenamen ermitteln
    374. If SetupDiGetDeviceInterfaceDetail(hDevInfo, tSPDID, _
    375. bytBuff(0), lngBuffLen, lngBuffLen, ByVal 0&) <> 0 _
    376. Then
    377. ' Handle auf das Gerät holen
    378. hVolume = CreateFile(Mid$(StrConv(bytBuff, _
    379. vbUnicode), 5, lngBuffLen - 5), 0&, _
    380. FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, _
    381. OPEN_EXISTING, 0&, ByVal 0&)
    382. ' ist ein gültiges Handle vorhanden
    383. If hVolume <> INVALID_HANDLE_VALUE Then
    384. ' Gerätenummer ermitteln
    385. If DeviceIoControl(hVolume, _
    386. IOCTL_STORAGE_GET_DEVICE_NUMBER, ByVal 0&, _
    387. 0&, tSDN, Len(tSDN), lngRet, ByVal 0&) Then
    388. ' ist die Laufwerksnummer gleich der
    389. ' Gerätenummer
    390. If lngDevNumber = tSDN.DeviceNumber Then
    391. ' Handle auf das Gerät schließen
    392. Call CloseHandle(hVolume)
    393. ' Handle auf die Geräteklasse schließen
    394. Call SetupDiDestroyDeviceInfoList( _
    395. hDevInfo)
    396. ' Gerätename
    397. strRet = Mid$(StrConv(bytBuff, _
    398. vbUnicode), 5, lngBuffLen - 5)
    399. ' # durch \ ersetzen
    400. strRet = Replace(strRet, "#", "\")
    401. ' die ersten 4 Zeichen und die Geräte-GUID
    402. ' wegschneiden
    403. strRet = Mid$(strRet, 5, InStr(1, _
    404. strRet, "{") - 6)
    405. ' für EjectUsbDrive benötigen wir
    406. ' nur auswerfbare USB-Laufwerke
    407. If UCase$(Left$(strRet, 7)) = _
    408. "USBSTOR" Then
    409. ' Gerätenamen zurückgeben
    410. GetDevInstStr = strRet
    411. End If
    412. End If
    413. End If
    414. ' Handle auf das Gerät schließen
    415. Call CloseHandle(hVolume)
    416. End If
    417. End If
    418. End If
    419. End If
    420. ' nächste Geräteindexnummer
    421. lngIndex = lngIndex + 1
    422. ' nächstes Geräte in dieser Geräteklasse
    423. Loop
    424. ' Handle auf die Geräteklasse schließen
    425. Call SetupDiDestroyDeviceInfoList(hDevInfo)
    426. End If
    427. End Function


    Ich weiß allerdings nicht was du mit anstecken bezwecken willst denn wenn man trennt dann benutzt man den USB Stick üblicherweise nicht mehrund wenn doch lässt man ihn stecken. Ich weiß weder, wie man in Windows, noch per VB anschließt....

    Grüße, ExteNesia.de
    Das ist nicht das was ich gefragt oder gesucht habe. Ich möchte keine Datenträger vom System dismounten. Wenn ich etwas über google gefunden hätte, dann müsste ich hier nicht fragen. Deine Antwort impliziert, dass Du meine Frage nicht bis zu Ende gelesen hast. Ich schrieb nichts von einem USB-Stick.
    Wenn ich mal wieder nur Mist poste, dann tut das mir Leid
    passt ja ;)

    Ich möchte das Aus- und Einstecken eines Gerätes an der USB-Schnittstelle simulieren. Es geht im speziellen um einen Smartcard-Reader der leider erst angesprochen werden kann, wenn er NACH dem Hochfahren von Windows angesteckt wird. Da der Smartcard-Reader aber dauerhaft am Gerät stecken bleibt und wir dem Benutzer nicht zumuten können jeden Tag den Reader aus- und einzustecken, suche ich eine Softwarelösung dafür. Würde auch helfen wenn man eine USB-Schnittstelle deaktivieren und wieder aktivieren könnte - würde das selbe bewirken. Aber eben über vb.net Programmcode gesteuert.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Sorry, aber ich glaube, da muss ein anderer ran oder es mir erklären. Das was ich verstehe, wäre so sinnlos dass ich weiß, du meinst was anderes oder ich bin gerade nur ein bissch. verwirrt
    Danke Pasta,

    devcon.exe hatte ich auch schon gefunden. Aber leider ist das laut vielen Meinungen im Netz oft mit unerwarteten Fehlern behaftet. Es ist eine externe Anwendung. Und die Weitergabe ist laut Microsoft Lizenzrichtlinien nicht erlaubt.

    Wenn es soetwas direkt in vb.net gäbe, das wäre das die ideale Lösung
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Das geht auch über die Registry, was da allerdings sein kann (habe es nicht probiert), daß man sich neu anmelden muß, das wäre für dich natürlich nicht sinnvoll.
    Und das Programm braucht Adminrechte, wenn das ein Problem darstellt, kannst du die Möglichkeit knicken.
    Habe es mal manuell versucht und festgestellt, daß es auch nicht mit Adminrechten funktioniert, man muß sich den Schlüssel erst aneignen. :(

    Ich befürchte dein Problem ins nicht so einfach zu lösen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Pasta“ ()

    And i think to myself... what a wonderfuL World!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Eddy“ ()

    Hallo,

    da sollte mal der Hersteller des Smartcard-Readers angesprochen werden. Warum tricksen, wenn der zu doof ist und trotzdem die Kohle dafür kassiert?
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    da sollte mal der Hersteller des Smartcard-Readers angesprochen werden. Warum tricksen, wenn der zu doof ist und trotzdem die Kohle dafür kassiert?


    Das Problem liegt daran, dass dies kein spezifisches Problem nur eines Herstellers ist, sondern eine Kombination von bestimmter Hardware und Betriebssystem und Middleware in verschiedenen Leveln und mehrere Reader betrifft. Es ist ein Hardware/Windows/Software Problem.
    Andere Lösungsansätze wurden hier leider bereits ausgeschöpft.

    Ich habe mir gerade nochmals devcon.exe angesehen. Die einzige Möglichkeit nur den Smartcard-Reader softwaremäßig neu anzustecken wäre:

    HTML-Quellcode

    1. devcon.exe restart usb\class_0B*
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Hallo,

    wir haben auf der Arbeit auch SmartCard-Reader (USB-Token). Die funktionieren auch, wenn das Teil vor dem Rechnerstart angesteckt ist. Es braucht doch der Treiber, wenn er geladen wird, nur 'sein' Gerät zurücksetzen. Ansonsten einen USB-Schalter zwischenstecken. Dann braucht der Anwender nur noch zweimal schalten statt zu stöpseln.
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Ein Programmierer löst seine Probleme mit einer neuen Programmierung und nicht mit zusätzlicher Hardware ;)

    Zur Info wie ich es nun gelöst habe:

    Bei den Hardware/Softwarekombinationen wo das Problem auftritt wird einfach ein zusätzliches Optionsfeld aktiviert welches das Reconnect steuert.

    Wird beim ersten Zugriff auf die Smartcard (bzw. die digitale Signaturfunktion) der Reader / die Smartcard nicht gefunden, so wird vor dem nächsten Versuch devcon.exe restart USB\Class_0B ausgeführt und alle Kartenleser softwaremäßig "neu angesteckt". Das funktioniert so auch wie gewünscht. Auch wenn es bei aktivierter Benutzerkontensteuerung einer Quittierung seitens des Users bedarf.

    Aber immerhin besser als wenn der (nicht berechtigte) Benutzer jeden Tag beim Starten der Computerkasse den Kartenleser mit der Signaturkarte neu anstecken müsste. Ein normaler User sollte auf diese Signaturkarte gar keinen Zugriff haben - der Reader ist meist irgendwo über ein USB-Verlängerungskabel gesichert oder befindet sich im Kassenterminal.

    Das Problem betrifft aktuell nur einige Notebooks mit Windows 10. Diese dürften beim Start des Notebooks an die USB-Schnittstelle zu wenig Strom schicken wodurch sich die Smartcardreader nicht 100%ig initialisieren.

    Als Hintergrundinfo: Es geht um die digitale Signatur von Rechnungen die von der österreichischen Finanz ab 1.4.2017 zwingend vorgeschrieben ist. Wir greifen zwar über ein Webservice zu welches das alles steuern sollte, jedoch sehen wir unseren Kunden gegenüber verpflichtet alles nur mögliche zu machen um das Arbeiten mit unseren Softwareprodukten so angenehm und EINFACH wie möglich zu gestalten.
    Bilder
    • 25082016172651.jpg

      251,61 kB, 670×580, 136 mal angesehen
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „dive26“ ()