IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

Récupérer le numéro de série matériel du disque dur sans passer par WMI


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Points : 63
    Points
    63
    Par défaut Récupérer le numéro de série matériel du disque dur sans passer par WMI
    Bonjour,

    Je dois récupérer les numéros de série de disque dur d'une cinquantaine de PC. Pour toutes les autres infos, j'utilise des scripts VBS avec WMI.
    Malheureusement, ces postes étant sous XP, il m'est impossible de récupérer cette info avec WMI, que ce soit avec la classe Win32_PhysicalMedia ou Win32_DiskDrive.

    Existe-t-il un moyen autre de récupérer le numéro de série matériel du disque dur avec Delphi.
    Avec le logiciel CrystalDiskInfo j'arrive bien à récupérer ce numéro.
    J'aimerais le faire avec une application Delphi pour pouvoir le récupérer avec le script et le faire remonter sur mon serveur.

    Pour l'instant, j'épluche le code de CrystalDiskInfo mais c'est du C++ et y a pas mal de lignes, donc c'est pas concluant. Je n'ai pas trouvé d'exemples ni d'API pour Delphi.
    J'ai l'impression que le logiciel passe par le protocole S.M.A.R.T pour récupérer le numéro. J'essaie de trouver une spécification mais je ne trouve rien de concluant.

    Si quelqu'un sait comment faire, cela m'épargnera de longues heures de démontage pour lire le numéro directement sur le DD. =)

    Merci d'avance.

    Bonne soirée

  2. #2
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Points : 63
    Points
    63
    Par défaut
    Bonjour,

    J'ai retrouvé et modifié une source qui utilise la fonction DeviceIoControl. Elle fonctionne sous Windows 7 mais les résultats ne sont pas toujours concluants. Je mets ça en standby pour l'instant, par manque de temps.

    J'essaierais de mettre en ligne les sources ce soir.

    Merci

  3. #3
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 483
    Points : 2 734
    Points
    2 734
    Billets dans le blog
    10
    Par défaut une réponse possible
    Bonjour,
    Tu peux peut être utiliser ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var
      VolSerNum:      DWORD;
      DW1, DW2: DWORD;
    begin
      if GetVolumeInformation(pWidechar(drive + '\'), nil, 0, @VolSerNum,DW1, DW2, nil, 0) then
        Result := Format('%.4x:%.4x', [HiWord(VolSerNum), LoWord(VolSerNum)]);
    end;

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 932
    Points
    40 932
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    @Alweber je crains que GetVolumeInformation ne récupère qu'un numéro logique et non le numéro physique du disque

    Malheureusement, ces postes étant sous XP, il m'est impossible de récupérer cette info avec WMI,
    étrange, je n'ai plus de XP sous la main mais il me semble pourtant qu'il est bien possible d'utiliser les WMI avec XP , et ce même via le réseau (bien que cela nécessite quelques manips activer WMI)

    as-tu déjà essayé de tester via WMI Delphi Code Creator sur un poste XP ?
    sinon voir ce qu'il est possible d'obtenir via les JCL et JVCL (lorsque j'ai commencé a travailler sur les éjections de clés USB j'ai commencé par ces bibliothèques avant d'aborder les WMI)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 483
    Points : 2 734
    Points
    2 734
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Bonjour,
    @Alweber je crains que GetVolumeInformation ne récupère qu'un numéro logique et non le numéro physique du disque
    A priori c'est ce que j'utilisais au début des années 2000 avec la fonction suivante sous delphi 5.
    La procédure que j'ai cité dans mon précédent mail a été compilée avec Delphi XE7

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    function TGestionFichier.FNomDeVolume : string;
    var
      OldErrorMode: Integer;
      NotUsed, VolFlags: DWORD;
      Buf: array [0..MAX_PATH] of Char;
    begin
      if LettreVolumeSource=char(0) then
      begin
        Result := 'Inconnu' ;
        Exit ;
      end ;
      OldErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS);
      try
        Buf[0] := #$00;
        if GetVolumeInformation(PChar(LettreVolumeSource + ':\'), Buf, DWORD(sizeof(Buf)),
          nil, NotUsed, VolFlags, nil, 0) then
          SetString(Result, Buf, StrLen(Buf))
        else Result := '';
        if LettreVolumeSource < 'a' then
          Result := AnsiUpperCaseFileName(Result)
        else
          Result := AnsiLowerCaseFileName(Result);
        if Result<>'' then
          Result := Format('[%s]',[Result]);
      finally
        SetErrorMode(OldErrorMode);
      end;
    end;

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 932
    Points
    40 932
    Billets dans le blog
    62
    Par défaut
    Je ne critiquais pas le code en soit mais l'information obtenue
    GetVolumeInformation récupère ,comme son nom l'indique, des valeurs sur le volume (donc "logique", changeant après un formatage par exemple) et non les informations sur le disque physique (numéro de série établi par le fabricant).
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 483
    Points : 2 734
    Points
    2 734
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Je ne critiquais pas le code en soit mais l'information obtenue
    D'accord !

    Ceci dit il est possible d'utiliser la commande DOS dans un shellExec. Ici l'information est retournée dans le fichier X.TXT qui peut être détruit après lecture


  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour Fab56,

    WMI fonctionne en XP à condition que le pack 2 soit installé. J'ai pas mal planché là-dessus en Qt. Mais il y a un bug lié à Microsoft sur certaines versions de Windows. Il est peut-être sans conséquence pour vous.
    Dernière modification par E.Bzz ; 07/05/2015 à 10h25. Motif: Contestation de la modération (remarques à adresser par MP à un responsable modération, merci)

Discussions similaires

  1. Numéro de série Physique du disque dur C#
    Par ziedzied dans le forum C#
    Réponses: 12
    Dernier message: 03/07/2013, 16h48
  2. Récupérer le numéro de série d'un disque dur
    Par crazy_inf dans le forum C++
    Réponses: 2
    Dernier message: 29/01/2013, 02h01
  3. Réponses: 0
    Dernier message: 04/10/2011, 18h34
  4. Récupérer le numéro de série du disque dûr
    Par Aymen.EUROTECH dans le forum Windows Forms
    Réponses: 2
    Dernier message: 16/05/2007, 17h03
  5. Comment obtenir le numéro de série d'un disque dur?
    Par walidrachid dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 28/09/2005, 16h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo