GILLESGG
-
23 janv. 2013 à 15:34
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 2015
-
24 janv. 2013 à 18:24
Bonjour à toutes et à tous,
J'ai un code (adapté d'un de vos codes ;-) ,merci ) qui me permet de récupérer le numéro de série d'un disque dur du moment qu'il s'appelle : C:\ ou Z:\ ....
Je cherche à faire la même chose sur un serveur avec une adresse du type \\SERVEUR_A_MOI
L'idéal serait que dans la fonction Test() cela fonctionne aussi bien avec PathName$ "Z:" que avec PathName$ "\\SERVEUR_A_MOI"
Merci d'avance pour votre aide
Gilles
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
Public Sub rgbGetVolumeInformationRDI(PathName$, DrvVolumeName$, DrvSerialNo$)
Dim r As Long
Dim pos As Integer
Dim HiWord As Long
Dim HiHexStr As String
Dim LoWord As Long
Dim LoHexStr As String
Dim VolumeSN As Long
Dim MaxFNLen As Long
Dim UnusedStr As String
Dim UnusedVal1 As Long
Dim UnusedVal2 As Long
DrvVolumeName$ = Space$(14)
UnusedStr$ = Space$(32)
r& = GetVolumeInformation(PathName$, DrvVolumeName$, Len(DrvVolumeName$), VolumeSN&, UnusedVal1&, UnusedVal2&, UnusedStr$, Len(UnusedStr$))
If r& = 0 Then Exit Sub
'determine le label
pos% = InStr(DrvVolumeName$, Chr$(0))
If pos% Then DrvVolumeName$ = Left$(DrvVolumeName$, pos% - 1)
If Len(Trim$(DrvVolumeName$)) 0 Then DrvVolumeName$ "(pas de label)"
'determine l'id du disque
HiWord& = GetHiWord(VolumeSN&) And &HFFFF&
LoWord& = GetLoWord(VolumeSN&) And &HFFFF&
HiHexStr$ = HiWord& ' ou Format$(Hex(HiWord&), "0000")
LoHexStr$ = LoWord& ' ou Format$(Hex(LoWord&), "0000")
DrvSerialNo$ = Val(HiHexStr$ & LoHexStr$) 'ou HiHexStr$ & "-" & LoHexStr$
End Sub
Function GetHiWord(dw As Long) As Integer
If dw& And &H80000000 Then
GetHiWord% = (dw& \ 65535) - 1
Else: GetHiWord% = dw& \ 65535
End If
End Function
Function GetLoWord(dw As Long) As Integer
If dw& And &H8000& Then
GetLoWord% = &H8000 Or (dw& And &H7FFF&)
Else: GetLoWord% = dw& And &HFFFF&
End If
End Function
Function test()
PathName$ = "Z:"
rgbGetVolumeInformationRDI PathName$, DrvVolumeName$, DrvSerialNo$
MsgBox DrvSerialNo$
End Function
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 23 janv. 2013 à 16:24
Salut
Sauf erreur de ma part, ce que tu récupères est le n° de série de la partition, mais pas du disque.
Les APIs sont des fonctions qui font appel aux DLL du système.
Si l'objet est externe au système (non géré par l'OS), il n'est pas possible de récupérer ses infos.
Regarde voir du côté du WMI qui peut interroger une autre machine à condition qu'il s'agisse d'un Windows et que les droits le permettent (droits d'accès à la base de registres distante).
Vala
Jack, MVP VB NB : Je ne répondrai pas aux messages privés
Le savoir est la seule matière qui s'accroit quand on le partage (Socrate)
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 23 janv. 2013 à 19:06
Bien entendu, il te faudra surement, à un moment donné, fournir un login et password pour t'authentifier sur ce serveur, je pense. Pas d'idée la dessus.
je me suis débrouillé en utilisant WNetAddConnection2 et WNetCancelConnection2 pour créer et supprimer le lecteur dès que j'ai récupéré le serial number du disque où est mon fichier excel (Thisworkbook.Path). Merci donc pour cela.
Cette solution fonctionne mais elle ne me convient pas terrible car même si je supprime le lecteur dès que j'ai récupéré le DrvSerialNo$ , je suis bel et bien obligé de créer un lecteur temporaire sur le réseau du client. J'ai bien entendu vérifié qu'il n'existait pas déjà avant de le créer ...
Si quelqu'un peut me dire pourquoi rgbGetVolumeInformationRDI me renvoie DrvSerialNo$ ="" si PathName$ Like "\\SERVEUR\*" ???
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 24 janv. 2013 à 18:24
"si je supprime le lecteur dès que j'ai récupéré le DrvSerialNo$ , je suis bel et bien obligé de créer un lecteur temporaire sur le réseau du client"
Je ne comprends pas le cause et l'effet.
Associer un chemin UNC puis le supprimer n'oblige pas à créer un répertoire temporaire.
"pourquoi rgbGetVolumeInformationRDI me renvoie DrvSerialNo$ ="" si PathName$ Like "\\SERVEUR\*" ???"
Dans l'état actuel de ta Sub (premier jet), ça peut être normal puisque cette API n'accepte pas les chemin style \\SERVEUR.
Que vaut VolumeSN& à la sortie de l'appel de ton API ?
Ma doué que je n'aime pas ces raccourcis de type au cul des variables, beurk; d'autant qu'ils sont inutiles puisque tu les as correctement dimensionnées.
Si tu recolles du code, pense que les fenêtre n'ont pas une largeur infinie : utilise les _ pour faire des coupures de ligne.
GetHiWord% = (dw& \ 65535) - 1
Doux mélange d'Integer, de Long ...
Uniformise les types de variable ou utilise des conversions explicites.
Même les constantes peuvent accepter des % & ... pour imposer leur type.