cs_Frenz
Messages postés41Date d'inscriptionsamedi 6 mars 2004StatutMembreDernière intervention24 mars 2007
-
23 mars 2007 à 12:34
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 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.
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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...
cs_Frenz
Messages postés41Date d'inscriptionsamedi 6 mars 2004StatutMembreDernière intervention24 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
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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....
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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).
cs_Frenz
Messages postés41Date d'inscriptionsamedi 6 mars 2004StatutMembreDernière intervention24 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.
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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é.