Numéro du disque dur sur \\SERVEUR

GILLESGG - 23 janv. 2013 à 15:34
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 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

7 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
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)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
23 janv. 2013 à 16:43
Ah bah si, autant pour moi : GetVolumeInformation peut renvoyer des infos si on fournit un chemin style C:\

Conversion \\Serveur\Rép en N:\ --> Voir UNC comme dans <cette source> (ça nous rajeunis pas)
0
Bonjour Jack,

je ne veux pas affecter une lettre à un chemin réseau car il s'agit d'une application que je vais déployer chez des clients...

As-tu une autre solution?

Gilles
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
23 janv. 2013 à 19:05
Bah tu crées un lien UNC pour les quelques secondes du test.
Regarde les APIs suivantes :
WNetAddConnection2 et WNetCancelConnection2 (de mpr.dll)

J'ai retrouvé un exemple <dans ce lien>
0

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

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
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.
0
Jack,

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\*" ???


Merci d'avance

Gilles
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
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.
0
Rejoignez-nous