INFOS WMI DES DISQUES DURS (LIEN LECTEUR LOGIQUE / LECTEUR PHYSIQUE)

moogliber Messages postés 40 Date d'inscription lundi 26 septembre 2005 Statut Membre Dernière intervention 5 janvier 2012 - 3 févr. 2009 à 15:24
Christ_OFF Messages postés 18 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 11 juin 2012 - 2 déc. 2009 à 01:58
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/49166-infos-wmi-des-disques-durs-lien-lecteur-logique-lecteur-physique

Christ_OFF Messages postés 18 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 11 juin 2012
2 déc. 2009 à 01:58
Merci, pour vos réponses.

Finalement, mon "freeze", bizarrement "un peu" long à mon gout, n'était pas seulement lié à la requête Floppy.
Mais, merci PCPT pour l'idée, car je vais effectivement "splashé", ou mettre un "loading ..." au lancement
pour calmer l'impatience de l'utilisateur.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
29 nov. 2009 à 17:43
possible de jouer en async ^^

mais c'est globalement lent, on est d'accord
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
28 nov. 2009 à 18:58
WMI est long pour sa première requête, avec une connexion synchrone

à part tricher (ex : lancer une fausse requête durant un splash) je ne connais pas de parade...
Christ_OFF Messages postés 18 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 11 juin 2012
28 nov. 2009 à 16:49
Bonjour (et help),

Précieuses infos que ces manipulations WMI !
Je viens de les intégrer dans un de mes 'tit prog. pour lister les Disques Physiques/Disques logiques/...

Mais j'ai un petit problème avce ce WMI : Au démarrage, lorsqu'on liste les disques présents (For each ...) l'appli se fige pendant quelques secondes et je pense que c'est dû à la détection du lecteur disquette (présence voyant allumé et tests sur plusieurs PC).
Il y a peut être aussi une autre raison car cela me parait bizarrement long !
Par la suite, je liste les unités avec fso.Drives qui ne me provoque pas ce "bug", puisque filtrage DriveType.

Question : il y aurait-il une méthode pour ce "check" WMI des disques physiques évite la détection Disquette, comme par exemple commencer à la lettre C:\ ? Ou bien y a t-il une autre raison de ce "freeze" ? Ou avez-vous des symptômes différents ?

Merci d'avance pour votre aide
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
6 avril 2009 à 11:02
Je viens de tomber sur cet excellent outil:
http://www.laboratoire-microsoft.org/logiciels/18238/

"MICROSOFT WMI CODE CREATOR"

il viens de me pondre ce code:

Imports System
Imports System.Management
Imports System.Windows.Forms

Namespace WMISample

Public Class MyWMIQuery

Public Overloads Shared Function Main() As Integer

Try
Dim searcher As New ManagementObjectSearcher( _
"root\CIMV2", _
"SELECT * FROM Win32_PhysicalMedia")

For Each queryObj As ManagementObject in searcher.Get()

Console.WriteLine("-----------------------------------")
Console.WriteLine("Win32_PhysicalMedia instance")
Console.WriteLine("-----------------------------------")
Console.WriteLine("SerialNumber: {0}", queryObj("SerialNumber"))
Next
Catch err As ManagementException
MessageBox.Show("An error occurred while querying for WMI data: " & err.Message)
End Try
End Function
End Class
End Namespace

si ça peut vous donner des idées...
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
6 avril 2009 à 10:55
le code fonctionne, sous .NET (je viens de tester)
suffit de l'adapter un peu (App.Path a virer, etc.)

Private Function GetDriveSerialNumber(ByRef vsDriveLetter As String) As String
Dim sBuffer As String
Dim oWMI As Object
Dim oItem As Object = Nothing
Dim oCol As Object

GetDriveSerialNumber = vbNullString

oWMI = GetObject("winmgmts:root\cimv2")
If Not Nothing Is oWMI Then
'# On récupère la partition liée au lecteur logique
oCol = oWMI.ExecQuery("REFERENCES OF {Win32_LogicalDisk='" & vsDriveLetter & ":'} WHERE ResultClass = Win32_LogicalDiskToPartition")
For Each oItem In oCol
'# On passe du lien, à la partition
oItem = GetObject("winmgmts:" & oItem.Antecedent)
Exit For
Next oItem

If Not Nothing Is oItem Then
'# On refait la même, on passe de la partition au disque physique
sBuffer = oItem.DeviceId
oCol = oWMI.ExecQuery("REFERENCES OF {Win32_DiskPartition='" & sBuffer & "'} WHERE ResultClass=Win32_DiskDriveToDiskPartition")
For Each oItem In oCol
'# On passe du lien "partition/disque" au disque
oItem = GetObject("winmgmts:" & oItem.Antecedent)
Exit For
Next oItem

If Not Nothing Is oItem Then
'# On refait la même, on passe du disque physique au physical media
sBuffer = oItem.DeviceId
oCol = oWMI.ExecQuery("REFERENCES OF {Win32_PhysicalMedia='" & sBuffer & "'} WHERE ResultClass=Win32_DiskDrivePhysicalMedia")
For Each oItem In oCol
'# On passe du lien "partition/disque" au disque
oItem = GetObject("winmgmts:" & oItem.Antecedent)
Exit For
Next oItem

GetDriveSerialNumber = Trim$(oItem.SerialNumber)
End If
End If
End If
End Function

c'est pas du bon .NET, hein, par contre ^^
tooffy123 Messages postés 55 Date d'inscription vendredi 16 mai 2003 Statut Membre Dernière intervention 16 mars 2009
16 mars 2009 à 17:57
Bien le bonjour,

y'a t-il un équivalent vb.net de cette source ?

ou une source permettant de lire les informations smart d'un disque en vb.net ?

Je cherche, je cherche et je ne trouve pas...

Merci d'avance !
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
5 févr. 2009 à 17:08
bien d'accord ^^
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
5 févr. 2009 à 16:34
Mais comment c'est moche WMI .... pouah j'arrive pas m'y faire :p
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
4 févr. 2009 à 08:55
comme je te le disais, en utilisant WMI Helper, simple de savoir comment récuperer un physicalMedia, et donc, le SerialNumber...

Private Function GetDriveSerialNumber(ByRef vsDriveLetter As String) As String
Dim sBuffer As String
Dim oWMI As Object
Dim oItem As Object
Dim oCol As Object
If LenB(vsDriveLetter) Then
sBuffer = Left$(vsDriveLetter, 1)
Else
sBuffer = Left$(App.Path, 1)
End If

Set oWMI = GetObject("winmgmts:root\cimv2")
If Not Nothing Is oWMI Then
'# On récupère la partition liée au lecteur logique
Set oCol = oWMI.ExecQuery("REFERENCES OF {Win32_LogicalDisk='" & sBuffer & ":'} WHERE ResultClass = Win32_LogicalDiskToPartition")
For Each oItem In oCol
'# On passe du lien, à la partition
Set oItem = GetObject("winmgmts:" & oItem.Antecedent)
Exit For
Next oItem

'# On refait la même, on passe de la partition au disque physique
sBuffer = oItem.DeviceId
Set oCol = oWMI.ExecQuery("REFERENCES OF {Win32_DiskPartition='" & sBuffer & "'} WHERE ResultClass=Win32_DiskDriveToDiskPartition")
For Each oItem In oCol
'# On passe du lien "partition/disque" au disque
Set oItem = GetObject("winmgmts:" & oItem.Antecedent)
Exit For
Next oItem

'# On refait la même, on passe du disque physique au physical media
sBuffer = oItem.DeviceId
Set oCol = oWMI.ExecQuery("REFERENCES OF {Win32_PhysicalMedia='" & sBuffer & "'} WHERE ResultClass=Win32_DiskDrivePhysicalMedia")
For Each oItem In oCol
'# On passe du lien "partition/disque" au disque
Set oItem = GetObject("winmgmts:" & oItem.Antecedent)
Exit For
Next oItem

GetDriveSerialNumber = Trim$(oItem.SerialNumber)
End If
End Function
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
3 févr. 2009 à 21:23
salut,

moogliber => l'api GetLogicalDrives existe..., y'a juste à l'utiliser (cf msdn comme proposé)

Renfield => bouhh le petit code ^^, c'est codyx qui doit être triste.
pas le courage de vérifier mais je crois avoir déposé un snippet pour PHYSIQUE
(le logique changeant à chaque formatage, moins utile donc, hormis pour concurrencer sandra, ce qui ne doit pas être faisable en vb6, cf certaines infos bios / température/ vitesse ventilos etc...)

++
moogliber Messages postés 40 Date d'inscription lundi 26 septembre 2005 Statut Membre Dernière intervention 5 janvier 2012
3 févr. 2009 à 18:33
Mais ton code ne marche pas sous XP
moogliber Messages postés 40 Date d'inscription lundi 26 septembre 2005 Statut Membre Dernière intervention 5 janvier 2012
3 févr. 2009 à 18:30
Oui galain tu as raison, je m'ne suis rendu compte après avoir posté.
Il faudrait donc que j'arrive à récuperer le numéro de lecteur physique courant. (celui sur lequel est installé l'appli)
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
3 févr. 2009 à 18:29
si ton code fonctionne

en relevant tes manches, tu parviendras surement a adapter mon code pour récuperer un Win32_PhysicalMedia

tu apprendras plus en mettant les yeux dans MSDN et tes mains dans le code
Profil bloqué
3 févr. 2009 à 18:25
Salut Moglober

J'ai comme l'impression que tu confonds lecteur physique ( le disque dur lui-même) et lecteur logique ( les partitions C:\ , D:\ etc....)
Le numéro que tu cherches est le numéro du lecteur physique et ceci n'a rien à voir avec la partition logique.

La source "Accès direct disque" donne un exemple pour faire la relation entre lecteur logique et disque associé
moogliber Messages postés 40 Date d'inscription lundi 26 septembre 2005 Statut Membre Dernière intervention 5 janvier 2012
3 févr. 2009 à 18:13
dsl j'aurais dû regarder dans le zip.
J'ai un autre code qui lui fonctionne sous bien sous XP, comme sous vista.
Seulement il faut lui fournir en entrée le NUMERO(intDriveNumber) de lecteur logique (et non la lettre du lecteur C:)

Le seul truc manquant est donc de faire le lien entre le numéro de lecteur(ex: 0) et le nom du lecteur (C:\).
Si j'arrive à faire le lien entre les 2 c'est gagné.

------------------------------
Private Function GetDriveSerialNumber(intDriveNumber As Integer) As String
Dim objWMIService As Object, _
colItems As Object, _
objItem As Object, _
strDrive As String
strDrive = "\\\\.\\PHYSICALDRIVE" & intDriveNumber
'On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:\" & strComputer & "\root\cimv2")
Set colItems objWMIService.ExecQuery("Select * from Win32_PhysicalMedia Where Tag '" & strDrive & "'", , 16)
'Set objItem = colItems.Item(strKey)
For Each objItem In colItems
GetDriveSerialNumber = Trim(objItem.SerialNumber)
'exit for
Next

End Function
-------------------------------------
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
3 févr. 2009 à 15:29
ben, y'a un exemple dans le fichier zip ^^

MsgBox GetDiskDriveFromLogical("C:").SerialNumber

gaffe:
http://msdn.microsoft.com/en-us/library/aa394132(VS.85).aspx

Windows Server 2003, Windows XP, Windows 2000, and Windows NT 4.0: This property is not available.
moogliber Messages postés 40 Date d'inscription lundi 26 septembre 2005 Statut Membre Dernière intervention 5 janvier 2012
3 févr. 2009 à 15:24
Pourrais tu stp donner un exemple d'utilisation de la fonction GetDiskDriveFromLogical.
Par ex, comment retourner le numéro de série du dd, qui correspond au lecteur logique C: ?
Rejoignez-nous