Soucis avec l'USB

cs_Frenz Messages postés 41 Date d'inscription samedi 6 mars 2004 Statut Membre Dernière intervention 24 mars 2007 - 23 mars 2007 à 12:34
jmfmarques Messages postés 7668 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 - 24 mars 2007 à 11:25
Bonjour, depuis plusieurs heure je cherche une solution a mon probleme et sur le net je ne trouve rien (ou j'ai mal cherché)

Depuis peu, je suis sur un projet en rapport avec l'ultilisation de l'USB.

Aucuns soucis mise à part que je n'arrive pas a ouvrir un dossier d'une clé dans l'explorateur windows que ce soit sur n'importe quel ordinateur (donc changement de Lettre de lecteur de l'USB et du disque dure de l'hote)

C:\windows\explorer.exe peut devenir E:\windows\explorer.exe
quand à L'usb peut etre G:\dossier\ ou f:\dossier... enfin vous voyez ?

J'ai essayé avec le composant "sysinfo" mais pas réussit...
Utilisation de shell avec app.path idem

Si quelqun d'entre vous pourrai m'eclaircir ca serai vraiment sympa.

(-:fr3nz:-)

13 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
23 mars 2007 à 12:49
WMI doit pouvoir t'aider

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
jmfmarques Messages postés 7668 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
23 mars 2007 à 13:06
Bonjour Frenz,

Il va te falloir être très précis :

Plusieurs "clés" USB peuvent être présentes au même moment sur un PC.

A quoi reconnais-tu la tienne, donc ?
Ta réponse précise emportera la mienne, également alors précise... sinon : impossible de voir où tu veux aller ainsi...
0
cs_Frenz Messages postés 41 Date d'inscription samedi 6 mars 2004 Statut Membre Dernière intervention 24 mars 2007
23 mars 2007 à 13:50
Pour etre plus precis je peut dire que la clé USB ciblé contient un certain fichier (le fichier du programme) a la racine de celle ci.

comme par exemple a la racine :
\USBme.exe

Donc le lecteur ciblé contient USBme.exe, le programme doit trouver la clé contenant "USBme" pas bète merci. Mais je ne sais pas comment je pourrait mis prendre

(-:fr3nz:-)
0
cs_Frenz Messages postés 41 Date d'inscription samedi 6 mars 2004 Statut Membre Dernière intervention 24 mars 2007
23 mars 2007 à 13:51
Mais ca peut aussi etre par rapport au nom de volume de la clé USB ? ca serait pe etre plus simple

(-:fr3nz:-)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jmfmarques Messages postés 7668 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
23 mars 2007 à 14:34
Moi, je bveux bien, Frenz, mais j'ai des principes bien ancrés, parmi lesquels ne jamais conduire l'autre sur un chemin s'il en ignore tout.

Je ne t'y conduis donc que si je suis sur que rien ne t'échappe :
Philosophie :

1) on regarde tous les lecteurs disponibles
2) pour chaque lecteur, on regarde son type
3) si le type correpond, on l'examine de plus près et on décide en connaissance de cause ...

Etape 1, donc : recensement des lecteurs présents :
Sur une Form un bouton de commande command1

Code

Const MAX_PATH = 260
Private Type MSGBOXPARAMS
    cbSize As Long
    hwndOwner As Long
    hInstance As Long
    lpszText As String
    lpszCaption As String
    dwStyle As Long
    lpszIcon As String
    dwContextHelpId As Long
    lpfnMsgBoxCallback As Long
    dwLanguageId As Long
End Type
Private Declare Function GetLogicalDrives Lib "kernel32" () As Long


Private Sub Command1_Click()
   Dim MBP As MSGBOXPARAMS, LDs As Long, Cnt As Long, sDrives As String
    disques = GetLogicalDrives
    For Cnt = 0 To 25
        If (disques And 2 ^ Cnt) <> 0 Then
          MsgBox Chr$(65 + Cnt)
        End If
    Next Cnt
End Sub


Vois ce que celà fait et analyse.
La suite viendra ensuite, en ne modifiant que command1, pas à pas...
Tu dis....
0
cs_Frenz Messages postés 41 Date d'inscription samedi 6 mars 2004 Statut Membre Dernière intervention 24 mars 2007
23 mars 2007 à 14:46
Interessant mais j'avoue que là ce n'est pas le code mais toi qui me fascine car j'aime beaucoup ta façon de penser.

Bref.... Je regarde le code et te repond mais sache que je ne met rien dans mes programmes que je ne connaisse pas.

Donc je regarde

(-:fr3nz:-)
0
cs_Frenz Messages postés 41 Date d'inscription samedi 6 mars 2004 Statut Membre Dernière intervention 24 mars 2007
23 mars 2007 à 15:06
Pour l'instant ca va, l'analyse est ok mais je peut bien lui faire analyser le nom du volume à cette étape non ?

(-:fr3nz:-)
0
jmfmarques Messages postés 7668 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
23 mars 2007 à 15:08
Non, pas encore v(étape par étape)

Etape 2 :

voilà le code (à lancer, regarder attentivement les messages reçus, un par un... tu vas voir les choses commencer à prendre raison...) :

Private Type MSGBOXPARAMS
    cbSize As Long
    hwndOwner As Long
    hInstance As Long
    lpszText As String
    lpszCaption As String
    dwStyle As Long
    lpszIcon As String
    dwContextHelpId As Long
    lpfnMsgBoxCallback As Long
    dwLanguageId As Long
End Type
Private Declare Function GetLogicalDrives Lib "kernel32" () As Long
Private Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
Private Declare Function GetVolumeInformation Lib "kernel32" Alias "GetVolumeInformationA" ( _
       ByVal lpRootPathName As String, _
       ByVal lpVolumeNameBuffer As String, _
       ByVal nVolumeNameSize As Long, _
       lpVolumeSerialNumber As Long, _
       lpMaximumComponentLength As Long, _
       lpFileSystemFlags As Long, _
       ByVal lpFileSystemNameBuffer As String, _
       ByVal nFileSystemNameSize As Long) As Long
      
       Private typelecteur As String
Private Sub Command1_Click()
   Dim LDs As Long, Cnt As Long, disques As String
    disques = GetLogicalDrives
    For Cnt = 0 To 30
        If (disques And 2 ^ Cnt) <> 0 Then
          titi = Chr$(65 + Cnt)
          infoslecteur Trim(titi) & ":", toto, nmserie, nomvolume
          If toto = "INSERABLE" And titi <> "A" Then
            toto = toto & vbCrLf & "il nous intéresse donc" & vbCrLf & "car peut-être notre clé USB"
          End If
          MsgBox titi & " est un lecteur " & toto
        End If
    Next Cnt
End Sub


Private Sub infoslecteur(lecteur, typelecteur, nmserie, nomvolume)
  Dim numserie As Long, Serie As String
  Dim retVal As Long
  Dim DriveType As String
  retVal = GetDriveType(lecteur)
  Select Case retVal
    Case 0
        typelecteur = "INDETERMINE"
    Case 1
        typelecteur = "NO ROOT"
    Case 2
        typelecteur = "INSERABLE"
    Case 3
        typelecteur = "DISQUE DUR"
    Case 4
        typelecteur = "DISTANT"
    Case 5
        typelecteur = "CD ROM"
    Case 6
        DriveType = "RAMDISK"
  End Select
  nomvolume = Space$(15)
  ResStr = Space$(32)
  retVal = GetVolumeInformation(lecteur, nomvolume, Len(nomvolume), _
                        numserie, dum, dum, ResStr, Len(ResStr))
  Serie = Right(String(8, "0") + Hex$(numserie), 8)
  nmserie = Left(Serie, 4) + "-" + Right$(Serie, 4)
  numvolume = Trim(nomvolume)
End Sub






 
0
jmfmarques Messages postés 7668 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
23 mars 2007 à 15:08
Non, pas encore v(étape par étape)

Etape 2 :

voilà le code (à lancer, regarder attentivement les messages reçus, un par un... tu vas voir les choses commencer à prendre raison...) :

Private Type MSGBOXPARAMS
    cbSize As Long
    hwndOwner As Long
    hInstance As Long
    lpszText As String
    lpszCaption As String
    dwStyle As Long
    lpszIcon As String
    dwContextHelpId As Long
    lpfnMsgBoxCallback As Long
    dwLanguageId As Long
End Type
Private Declare Function GetLogicalDrives Lib "kernel32" () As Long
Private Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
Private Declare Function GetVolumeInformation Lib "kernel32" Alias "GetVolumeInformationA" ( _
       ByVal lpRootPathName As String, _
       ByVal lpVolumeNameBuffer As String, _
       ByVal nVolumeNameSize As Long, _
       lpVolumeSerialNumber As Long, _
       lpMaximumComponentLength As Long, _
       lpFileSystemFlags As Long, _
       ByVal lpFileSystemNameBuffer As String, _
       ByVal nFileSystemNameSize As Long) As Long
      
       Private typelecteur As String
Private Sub Command1_Click()
   Dim LDs As Long, Cnt As Long, disques As String
    disques = GetLogicalDrives
    For Cnt = 0 To 30
        If (disques And 2 ^ Cnt) <> 0 Then
          titi = Chr$(65 + Cnt)
          infoslecteur Trim(titi) & ":", toto, nmserie, nomvolume
          If toto = "INSERABLE" And titi <> "A" Then
            toto = toto & vbCrLf & "il nous intéresse donc" & vbCrLf & "car peut-être notre clé USB"
          End If
          MsgBox titi & " est un lecteur " & toto
        End If
    Next Cnt
End Sub


Private Sub infoslecteur(lecteur, typelecteur, nmserie, nomvolume)
  Dim numserie As Long, Serie As String
  Dim retVal As Long
  Dim DriveType As String
  retVal = GetDriveType(lecteur)
  Select Case retVal
    Case 0
        typelecteur = "INDETERMINE"
    Case 1
        typelecteur = "NO ROOT"
    Case 2
        typelecteur = "INSERABLE"
    Case 3
        typelecteur = "DISQUE DUR"
    Case 4
        typelecteur = "DISTANT"
    Case 5
        typelecteur = "CD ROM"
    Case 6
        DriveType = "RAMDISK"
  End Select
  nomvolume = Space$(15)
  ResStr = Space$(32)
  retVal = GetVolumeInformation(lecteur, nomvolume, Len(nomvolume), _
                        numserie, dum, dum, ResStr, Len(ResStr))
  Serie = Right(String(8, "0") + Hex$(numserie), 8)
  nmserie = Left(Serie, 4) + "-" + Right$(Serie, 4)
  numvolume = Trim(nomvolume)
End Sub






 
0
jmfmarques Messages postés 7668 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
23 mars 2007 à 15:57
Bon...
Je dois sortir...
voilà la 3ème étape :

Private Type MSGBOXPARAMS
    cbSize As Long
    hwndOwner As Long
    hInstance As Long
    lpszText As String
    lpszCaption As String
    dwStyle As Long
    lpszIcon As String
    dwContextHelpId As Long
    lpfnMsgBoxCallback As Long
    dwLanguageId As Long
End Type
Private Declare Function GetLogicalDrives Lib "kernel32" () As Long
Private Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
Private Declare Function GetVolumeInformation Lib "kernel32" Alias "GetVolumeInformationA" ( _
       ByVal lpRootPathName As String, _
       ByVal lpVolumeNameBuffer As String, _
       ByVal nVolumeNameSize As Long, _
       lpVolumeSerialNumber As Long, _
       lpMaximumComponentLength As Long, _
       lpFileSystemFlags As Long, _
       ByVal lpFileSystemNameBuffer As String, _
       ByVal nFileSystemNameSize As Long) As Long
      
       Private typelecteur As String
       'Private numvolume As String
Private Sub Command1_Click()
   Dim LDs As Long, Cnt As Long, disques As String
    disques = GetLogicalDrives
    For Cnt = 0 To 30
        If (disques And 2 ^ Cnt) <> 0 Then
          titi = Chr$(65 + Cnt)
          infoslecteur Trim(titi) & ":", toto, nmserie, nom
          If toto = "INSERABLE" And titi <> "A" Then
            toto = toto & vbCrLf & "il nous intéresse donc" & vbCrLf & "car peut-être notre clé USB"
          End If
          MsgBox titi & " est un lecteur " & toto & vbCrLf & "N° série : " & nmserie & _
          " et s'appelle :  " & nom
        End If
    Next Cnt
End Sub


Private Sub infoslecteur(lecteur, typelecteur, nmserie, couic)
  Dim numserie As Long, Serie As String, nomvolume As String
  Dim retVal As Long
  Dim DriveType As String
  retVal = GetDriveType(lecteur)
  Select Case retVal
    Case 0
        typelecteur = "INDETERMINE"
    Case 1
        typelecteur = "NO ROOT"
    Case 2
        typelecteur = "INSERABLE"
    Case 3
        typelecteur = "DISQUE DUR"
    Case 4
        typelecteur = "DISTANT"
    Case 5
        typelecteur = "CD ROM"
    Case 6
        DriveType = "RAMDISK"
  End Select
  nomvolume = Space$(15)
  ResStr = Space$(32)
  retVal = GetVolumeInformation(lecteur, nomvolume, Len(nomvolume), _
                        numserie, dum, dum, ResStr, Len(ResStr))
  Serie = Right(String(8, "0") + Hex$(numserie), 8)
  nmserie = Left(Serie, 4) + "-" + Right$(Serie, 4)
  couic = Trim(nomvolume)
End Sub


Tu remarqueras que le nom du volume n'apparait que si le volume a un nom qui lui a été donné.

Pendant mon absence : à toi de jouer dans la boucle for.
Il te suffit de mettre cette condition :
S"il s'agit d'un insérable et s'il porte ce_nom, alors.....
Si tu as des difficultés, parle-m'en...
Bon travail... (et nettoie un peu mon code, que j'ai bâclé en essai et il doit y rester des choses devenues inutiles).
0
cs_Frenz Messages postés 41 Date d'inscription samedi 6 mars 2004 Statut Membre Dernière intervention 24 mars 2007
24 mars 2007 à 10:50
Tres bien merci mais je vais avoir plusieurs jours avant de le comprendre a 100%

(-:fr3nz:-)
0
cs_Frenz Messages postés 41 Date d'inscription samedi 6 mars 2004 Statut Membre Dernière intervention 24 mars 2007
24 mars 2007 à 11:03
Il recconais donc tres bien la clé usb !

Seulement apres quelle sera la ligne de commande pour acceder au dossier ?

Si j'ai bien compris "toto" est le lecteur ciblé. Il faudrai que je mette une ligne d'execution de l'explorateur avec (toto & "\nomdudossier") mais je pense que je m'emmelle lol

Mais je vais regarder ca et essayer de comprendre d'avantage.

(-:fr3nz:-)
0
jmfmarques Messages postés 7668 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
24 mars 2007 à 11:25
Je te laisse essayer (c'est salutaire)...
Je reste toutefois présent si tu n'y parviens pas (mais tu devrais à mon avis pouvoir t'en sortir seul...)

Conseil : n'hésite pas à utiliser msgbox pour voir ce que contient la variable de ton lecteur...


toto me parait te nonner le type de lecteur, non... ?


Quid de titi ? (ce ne serait pas sa lettre ?.... et si oui : un dossier qu'il contient serait peut-être dans titi & ":\chemin..." non ?

Je te laisse chercher et tripatouiller un peu ...

Nota : Je pense que ti tu fais tout celà, c'est pour des raisons de sécurité (sinon, il y a beaucoup plus simple à mettre en oeuvre si tu te contentes de vérifier que le lecteur concerné contient bien un fichier donné... mais nul sur le plan de la sécurité...)

Pour avoir la sécurité maximale, en effet, il faut n'accepter que si, à la fois :
- le lecteur est un "INSERABLE" (cas d'une clef USB)
- il porte un nom précis
- il contient bien un élément précis (ici un fichier, si j'ai bien compris)
- s'il s'agit d'une clef USB UNIQUE, on peut y ajouter son N° de série (impossible par contre si plusieurs clefs sont utilisables à cette fin)
- dans certains cas (je le faisais avec des CD : le support est de surcroît "signé" (et...refusé si mauvaise signature)

On prend en général de telles précautions pour éviter qu'un utilisateur puisse lancer depuis son PC un exe autre que celui souhaité mais auquel il aurait donné le même nom que l'exe souhaité, et mis sur un SUPPORT auquel il aurait donné le même nom que le support souhaité.
0