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

Delphi Discussion :

Lecture du n° de série du disque dur d'un PC qui possède plus d'un disque dur


Sujet :

Delphi

  1. #21
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    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 031
    Points : 40 929
    Points
    40 929
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par aimer_Delphi Voir le message
    j'ai testé le programme sous delphi Berlin 10.1 , j'ai eu le même résultat.
    quel programme, le programme console ? ou l'unité contenant la fonction à inclure dans un programme Delphi

    Citation Envoyé par Cirec
    SergioMaster a raison le sérial retourné est le bon il faut juste le convertir
    merci, tout d'abord de confirmer mes soupçons et d'avoir pris le temps de faire un programme pour la conversion.

    Bien que j'aimerai comprendre pourquoi on obtient cette suite hexadécimale, ce sujet commence à me gaver

    donc, pour essayer de résoudre ce truc je joint un projet simple (sources+exécutable 32 bits release) de façon à ce qu'il soit testé (au moins je serai sur que c'est en unicode )
    Fichiers attachés Fichiers attachés
    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

  2. #22
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 293
    Points
    11 293
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    J'obtiens bien une suite Hexa à convertir (pas fait, par manque de temps...)
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #23
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    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 031
    Points : 40 929
    Points
    40 929
    Billets dans le blog
    62
    Par défaut
    re,
    Citation Envoyé par Tourlourou
    J'obtiens bien une suite Hexa
    Donc la question est : mais pourquoi donc ! si quelqu'un peut se pencher sur l'unité unitWMi.pas je l'en remercierai.
    AMHA Seul un problème de conversion est envisageable (ligne 48) à moins que cela ne soit l'OS (gros doute car j'ai essayé le programme sur VISTA avec le bon retour du moins sur les disques avec n° de série j'ai oublié de traiter le cas où il n'y en a pas, bref les erreurs possibles)
    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

  4. #24
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    re,

    effectivement c'est plus qu'étrange !!!
    j'ai testé l'unité unitWMi.pas
    et elle me renvoie bien un numéro de série avec les octets inversés mais pas de suite Hexa (OS W7)

    Cordialement,
    @+

  5. #25
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    re,

    j'ai inclue à l'unité UnitWMI le code qui permet la conversion des deux formats (Hex et normal) en un SN valable.
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    // ----------------------------------------------------------------------------------------------------
    //     Get Physical Disk Serial number of a logical drive letter
    //
    //     Author  Serge Girard aka SergioMaster https://www.developpez.net
    //     Modification by Cirec  
    //-----------------------------------------------------------------------------------------------------
    //     Part of this code was generated by the Wmi Delphi Code Creator (WDCC) Version 1.9.9.350
    //     http://code.google.com/p/wmi-delphi-code-creator/
    //     Blog http://theroadtodelphi.wordpress.com/wmi-delphi-code-creator/
    //     Author Rodrigo Ruz V. (RRUZ) Copyright (C) 2011-2015
    //-----------------------------------------------------------------------------------------------------
    //
    //     LIABILITY DISCLAIMER
    //     THIS GENERATED CODE IS DISTRIBUTED "AS IS". NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED.
    //     YOU USE IT AT YOUR OWN RISK. THE AUTHOR NOT WILL BE LIABLE FOR DATA LOSS,
    //     DAMAGES AND LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING OR MISUSING THIS CODE.
    //
    //----------------------------------------------------------------------------------------------------
    unit UnitWMI;
     
    interface
    uses
      SysUtils,
      ActiveX,
      ComObj,
      Variants;
     
    function GetSerialNumberOfDrive(drive: string): string;
     
    implementation
     
    function _GetSerialNumberOfDrive(drive: string): string;
    const
      WbemUser          = '';
      WbemPassword      = '';
      WbemComputer      = 'localhost';
      wbemFlagForwardOnly = $00000020;
    var
      FSWbemLocator     : OLEVariant;
      FWMIService       : OLEVariant;
      DisquesPhys, Partitions, DisquesLogiques: OLEVariant;
      WMIObjet, WMIPartition, WMIDisque: OLEVariant;
      oEnum, PartNum, DisqueNum: IEnumvariant;
      iValue            : LongWord;
      requete           : string;
    begin;
      result := '';
      FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
      FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser,
        WbemPassword);
      DisquesPhys := FWMIService.ExecQuery('SELECT * FROM Win32_DiskDrive', 'WQL',
        wbemFlagForwardOnly);
      oEnum := IUnknown(DisquesPhys._NewEnum) as IEnumVariant;
      while oEnum.Next(1, WMIObjet, iValue) = 0 do
      begin
        Requete := 'ASSOCIATORS OF {Win32_DiskDrive.DeviceID=' +
          QuotedStr(string(WMIObjet.DeviceID)) +
          '} WHERE AssocClass = Win32_DiskDriveToDiskPartition';
        Partitions := FWMIService.ExecQuery(requete, 'WQL', wbemFlagForwardOnly);
        PartNum := IUnknown(Partitions._NewEnum) as IEnumVariant;
        while PartNum.Next(1, WMIPartition, iValue) = 0 do
        begin
          requete := 'ASSOCIATORS OF {Win32_DiskPartition.DeviceID=' +
            QuotedStr(string(WMIPartition.DeviceID)) +
            '} WHERE AssocClass = Win32_LogicalDiskToPartition';
          DisquesLogiques := FWMIService.ExecQuery(requete, 'WQL', wbemFlagForwardOnly);
          DisqueNum := IUnknown(DisquesLogiques._NewEnum) as IEnumVariant;
          while DisqueNum.Next(1, WMIDisque, iValue) = 0 do
          begin
            if (not VarIsNull(WMIObjet.DeviceID)) and (not VarIsNull(WMIObjet.SerialNumber)) then
              if string(WMIDisque.DeviceID) = Drive then
                result := string(WMIObjet.SerialNumber);
          end;
        end;
        WMIObjet := Unassigned;
        WMIPartition := Unassigned;
        WMIDisque := Unassigned;
      end;
    end;
     
     
    // Ajouté par Cirec 12/03/2017  https://www.developpez.net
     
    type
      PQuadChar = ^TQuadChar;
      TQuadChar = array[0..1, 0..1] of AnsiChar;
     
     
    function GetSerialNumberOfDrive(drive: string): string;
    var
      HexSNumber,
      StrSNumber        : AnsiString;
      P                 : PQuadChar;
      I                 : Integer;
    begin
      HexSNumber := _GetSerialNumberOfDrive(drive);
      P := @HexSNumber[1];
      if Length(HexSNumber) > 20 then
      begin
        // on a un SN au format Hexa
        SetLength(StrSNumber, Length(HexSNumber) div 2);
        I := 1;
        repeat
          Byte(StrSNumber[I]) := StrToIntDef('$' + string(P^[1]), 0);
          Byte(StrSNumber[I + 1]) := StrToIntDef('$' + string(P^[0]), 0);
          Inc(I, 2);
          Inc(P);
        until I >= Length(StrSNumber);
      end
      else
      begin
        // on a un SN au format Text
        SetLength(StrSNumber, Length(HexSNumber));
        I := 1;
        repeat
          StrSNumber[I] := P^[0][1];
          StrSNumber[I + 1] := P^[0][0];
          StrSNumber[I + 2] := P^[1][1];
          StrSNumber[I + 3] := P^[1][0];
          Inc(I, 4);
          Inc(P);
        until I >= Length(StrSNumber);
      end;
      Result := Trim(string(StrSNumber));
    end;
    end.
    Il faudrait tester sur une machine qui renvoie le SN en Hexa sur 40 caractères.

    Cordialement,
    @+

  6. #26
    Membre actif

    Inscrit en
    Mai 2010
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 401
    Points : 294
    Points
    294
    Par défaut
    Bonjour a tous ,
    et merci pour le suivi .
    1- Pour Sergio , j'ai testé directement ton fichier exécutable , et j'obtiens un n° en Hexa.

    2- Pour Cirec j'ai testé l'unité , j'obtiens une erreur a ligne 117.


    Nom : Erreur1.png
Affichages : 626
Taille : 53,9 Ko

  7. #27
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    avec quelle version de Delphi ?

    j'ai écrit le code sous D2009 (Unicode) et
    je viens de tester avec D7 et ça fonctionne aussi !!

    Edit:
    Idem avec Berlin 10.1

  8. #28
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    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 031
    Points : 40 929
    Points
    40 929
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par Cirec Voir le message
    j'ai inclus à l'unité UnitWMI le code qui permet la conversion des deux formats (Hex et normal) en un SN valable.
    Je vois que tu as aussi pris en compte le cas où il n'y avait pas de numéro de série, merci.

    Toutefois ta remarque
    Citation Envoyé par cirec
    et elle me renvoie bien un numéro de série avec les octets inversés
    me laisse songeur

    [Edit] après quelques recherches et lectures celle-ci entre autres dont les deux dernières interventions sont AMHA les plus intéressantes
    il semblerait que non seulement cela provienne de l'OS mais aussi de l'UAC et des privilèges (utilisation en mode administrateur ou non)

    Donc, que se passe t-il si vous exécutez le programme en mode administrateur ? (il est à noter que WMI delphi code creator demande toujours à être lancé avec ces droits)
    Merci de me tenir au courant
    PS. il va falloir aussi que je me penche sur cette phrase
    The most likely explanation is incorrect endian-ness in the WMI code that reads the data.
    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

  9. #29
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2015
    Messages : 252
    Points : 272
    Points
    272
    Par défaut
    Bonjour Serge,

    j'ai rencontré ce problème il y a quelques temps : https://connect.microsoft.com/Visual...-standard-user
    Discussion sur l'approche de ce problème en Qt .

    Extrait du site en question en Août 2014 :
    Commentaire supplémentaire : sous windows, en mode non-administrateur, la chaîne renvoyée pourrait être la chaîne hexa correspondant au string du numéro de série.

    En reprenant l'exemple du message auquel je fais référence quelques lignes plus tard :

    En mode administrateur : Win32_PhysicalMedia = VNVD04G4C08E1G. Pour l'avoir vérifié sur mon propre matériel (et Nux), la chaîne texte est correcte.

    En mode non-administrateur, la chaîne hexa est renvoyée : 2020202020204e56445634303447304345384731. Or cette chaîne hexa traduite en string donne NVDV404G0CE8G1.

    ui->laHEXA->setText("2020202020204e56445634303447304345384731");
    QByteArray text = QByteArray::fromHex("2020202020204e56445634303447304345384731");
    ui->edSTRING->setText(text.data());

    On constate qu'il existe une inversion d'octets. Fort de cette donnée, la solution semble simple. Je "fouine" un peu et une lecture très instructive indique que ce bug n'est pas présent sur toutes les versions de Windows...
    [...]
    Je veux utiliser ce N° matériel de disque dur pour identifier les appareils lors de l'utilisation du programme.[...]nous disposons de 3 types de machines, Win 7, Ubuntu souvent dual-boot et d'OS X, j'avais besoin d'un identifiant commun. La Mac Address en est un (assez facilement modifiable), le N° de carte-mère n'est pas récupérable sans les privilèges de root sous Nux -ce qui l'élimine et le N° de série des disques durs est facile à récupérer sous Nux et OS X sans privilège. Donc restait le problème Windows...

    A la rigueur c'est peu grave pour ma prog., car même si l'appareil est utilisé sous plusieurs OS différents avec la même machine, il suffit de faire 2 comparaisons au lieu d'une (avec inversion ou sans inversion des octets).
    A l'époque, j'avais déjà réalisé une approche en FMX, une pour Windows, une pour Mac OS X. J'ai abandonné sur cette dernière plateforme [Merci le debug, totalement muet alors que je n'obtenais pas le résultat escompté]. Pourtant en Qt, le problème a été réglé dans les 3 OS. Mais, il m'a été impossible de transposer l'approche Qt/OS X en FMX/OS X. Comme souvent. Évidemment l'approche OS X ne passe pas par WMI.

    Cordialement AD.

    * Pour y accéder, il faut se loguer sinon la page reste blanche quand la discussion est "résolue". C'est un problème récurent de ce site jamais réglé. Je ne mets pas le lien puisqu'il sera effacé. C'est un site Persona non grata chez developpez.com. [Très dommage d'ailleurs même si je ne suis pas toujours d'accord avec leurs principaux animateurs].

  10. #30
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    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 031
    Points : 40 929
    Points
    40 929
    Billets dans le blog
    62
    Par défaut
    Merci Pierre,
    Je m'en doutais un peu et cela se confirme donc

    Il m'a été impossible de transposer l'approche Qt/OS X en FMX/OS X.
    je n'aurai pas penser une seconde que les WMI existent sous OSX et donc n'aurait rien fait en ce sens

    Par contre il est étrange que sur mon poste W10 et sur mon poste Vista cela fonctionne sans le mode Admin (pourtant l'UAC est activée), le lieu où se trouve le programme pourrait-il avoir son importance ....

    fromHex je me demande s'il n'y a pas une fonction Delphi pour ça
    mode administrateur ? je me demande s'il n'y a pas une fonction Delphi pour ça
    quant à l'inversion, ça me renvoi au fameux indian (donc là aussi je me demande ...... )
    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

  11. #31
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Par contre il est étrange que sur mon poste W10 et sur mon poste Vista cela fonctionne sans le mode Admin (pourtant l'UAC est activée), le lieu où se trouve le programme pourrait-il avoir son importance ....
    Idem chez moi ... avec ou sans les droits j'ai le même résultat une chaine inversée (W7)
    ps: pour le format Hex ... on peut aussi passer par un Stream pour la conversion ce qui évite le swap des octets
    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
    29
    type
      TBlock = array[0..3] of AnsiChar;
      TSNumber = record
        Full : array[0..9] of TBlock;
        end;
     
    ...
    var
      HexSNumber: AnsiString;
      I: Integer;
      J: Word;
      SN : TSNumber;
     
    begin
      HexSNumber := '2020202020202020202032204633364752325357';
      MoveMemory(@SN.Full[0], @HexSNumber[1], Length(HexSNumber));
      with TMemoryStream.Create do try
        for I := 0 to 9 do  begin
          J := StrToIntDef('$'+SN.Full[I], 0);
          WriteBuffer(J, SizeOf(Word));
        end;
        Position := 0;
        SetLength(HexSNumber, Size);
        ReadBuffer(HexSNumber[1], Size);
        Caption := Trim(HexSNumber);
      finally
        Free;
      end;
    end;

  12. #32
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2015
    Messages : 252
    Points : 272
    Points
    272
    Par défaut
    Bonjour,

    FromHex en Delphi ? Je ne sais pas. J'ai désinstallé tous les Delphi de mes postes, histoire de ne plus pratiquer [Phase de désintox même si ma participation à ce forum montre qu'il y a encore du travail]
    En Lazarus, je pratiquerais ainsi :
    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
    function FromHex(Hex: String): String;
    var
      Bytes: TBytes;
      I: Integer;
    begin
      SetLength(Bytes, Length(Hex) div 2);
      HexToBin(PChar(Hex), @Bytes[0], Length(Bytes));
      SetLength(Result, Length(Bytes));
      for I := 0 to Length(Bytes)-1 do
        Result[I+1] := Char(Bytes[I]);
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Showmessage(FromHex('2020202020204e56445634303447304345384731'));
    end;
    Cordialement. AD

  13. #33
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    Citation Envoyé par ApproxDev Voir le message
    Bonjour,

    FromHex en Delphi ? Je ne sais pas. J'ai désinstallé tous les Delphi de mes postes, histoire de ne plus pratiquer [Phase de désintox même si ma participation à ce forum montre qu'il y a encore du travail]
    En Lazarus, je pratiquerais ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    var
      Hex: String;
      Bytes: TBytes;
      I: Integer;
      S: String;
    begin
      Hex := '2020202020204e56445634303447304345384731';
      SetLength(Bytes, Length(Hex) div 2);
      HexToBin(PChar(Hex), @Bytes[0], Length(Bytes));
      SetLength(S, Length(Bytes));
      for I := 0 to Length(Bytes)-1 do
        S[I+1] := Char(Bytes[I]);
      Showmessage(S);
    end;
    Cordialement. AD
    pas mal ... il ne manque que l'inversion des octets

  14. #34
    Membre actif

    Inscrit en
    Mai 2010
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 401
    Points : 294
    Points
    294
    Par défaut
    Bonjour a tous,
    désolé Cirec ça marche maintenant très bien
    j'ai testé l'unité de Cirec avec delphi 7.
    Merci a vous tous.
    Merci Sergio
    Donc Résolu.

  15. #35
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2015
    Messages : 252
    Points : 272
    Points
    272
    Par défaut
    Bonjour,

    L'inversion des octets je ne l'ai pas faite ni en Lazarus, ni en Delphi mais seulement en C++. Par prudence, j'ai fait 2 (enfin 3) approches : une sur l'inversion probable des octets (détectée sur mes appareils : toujours la même inversion), et une plus large sur l'ensemble des combinaisons possibles. Sans oublier la possibilité "sans inversion"
    Pour la vérification, je commence d'ailleurs par cette dernière, puis par la probable et en cas de réponse négative, je teste la "combinaison".

    Cordialement. AD.

  16. #36
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 685
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 685
    Points : 13 102
    Points
    13 102
    Par défaut
    Il existe aussi la fonction Swap pour croiser deux octets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function FromHex(Hex: String): AnsiString;
    var
      i :integer;
      w :array of word absolute Result;
     
    begin
      SetLength(Result, Length(Hex) div 2);
      HexToBin(PChar(Hex), PChar(Result), Length(Result));
     
      for i := 0 to Length(Result) div 2 -1 do
        w[i] := Swap(w[i]);
     
      Result := Trim(Result);
    end;

  17. #37
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    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 031
    Points : 40 929
    Points
    40 929
    Billets dans le blog
    62
    Par défaut Comment avoir un numéro de série correct alors ?
    Bonjour,

    reste que, même si le sujet est marqué résolu, je reste sur ma "faim", on a les solutions pour traiter la chaine hexa, swapper au besoin mais on ne sait toujours pas pourquoi, selon les postes/os on obtient pas de résultats identiques (c.a.d avoir un numéro de série correct !) ce qui fait que ce qui est développé sur une machine ne sera pas forcément portable sur une autre
    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

  18. #38
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2015
    Messages : 252
    Points : 272
    Points
    272
    Par défaut
    Bonjour Serge,

    je ne vois pas où est le problème dans l'optique d'une identification.

    Premier cas, il n'y a qu'un seul OS installé (disons Windows ). Si le numéro est inversé, il est enregistré tel qu'il est dans la base de données distante par exemple quand l'utilisateur final y enregistre son produit. A chaque fois que le N° du disque dur sera lu, il le sera par WMI quelque soit la plateforme de développement utilisée (Delphi, Lazarus, Windev, Qt...). J'ai testé les 4 !

    Deuxième cas, le programme développé fonctionne sur le même appareil sous 2 Windows différents et un Linux. L'utilisateur enregistre sa licence à partir d'un des Windows. Le N° peut-être faux ou non. Mais on sait comment il est faux s'il l'est. Il s'agit d'une simple inversion d'octets. Donc la fonction pour vérifier le N° de licence à partir de n'importe quel OS récupère le N° "lu" du disque dur et compare avec le N° enregistré dans la base. S'ils sont différents, elle effectue une nouvelle comparaison avec la permutation circulaire connue.

    Ce que je n'ai pas réussi à tester, c'est la récupération sous Delphi du N° de disque dur en cross-compilation Mac. Je n'ai jamais réussi à obtenir un résultat, aucune erreur n'étant signalée, alors qu'en Lazarus (assez difficilement) et en Qt, sur la même machine (mais nativement) je l'obtenais.

    Maintenant, si on veut éliminer cette incertitude au niveau de Windows, il me semble avoir essayé de travailler sur un programme C++ indépendant de WMI. A l'époque, je n'ai pas retenu cette solution dont le code était hors de ma portée. Mais en supposant que l'on retienne ce code, il faut travailler pour l'intégrer comme bibliothèque utilisable par Delphi (les entêtes). Ce serait peut-plus facile en C++ Builder ?... que je connais très mal. Je regarderai dans mes sources si j'ai encore les références de la page.

    Cordialement. AD

    ADD 11:48. En Delphi sans WMI à tester : https://micksmix.wordpress.com/2009/...d-without-wmi/

  19. #39
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2020
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2020
    Messages : 1
    Points : 0
    Points
    0
    Par défaut hhd serial utiliser ce petit code avec bonus
    hdd serial +MULTILIGNES.rar
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs,    StdCtrls   ,
         Registry    ;   {il faut utilisé l'unité des registres}
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        Label1: TLabel;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      SerialNumber: string;
       Registry: TRegistry;
    begin
      //creer un registre  reader(clone)
      Registry := TRegistry.Create(KEY_READ );
     
      try
        // Naviger jusqu'au resistre "repertoire":
        Registry.RootKey := HKEY_LOCAL_MACHINE;
        if Registry.OpenKeyReadOnly('\HARDWARE\DEVICEMAP\Scsi\Scsi Port 0\Scsi Bus 0\Target Id 0\Logical Unit Id 0') then   
          SerialNumber:=Registry.ReadString('SerialNumber'); //lire et recuperer la valeur du registre
     
      finally
        showmessage(SerialNumber);   //   affichage   de la valeur
        edit1.Text:=SerialNumber;    //       du registre
        Registry.Free;               //   libere  le registe alloué
      end;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    Button1.Hint:='exemple de hint multiligne au meme temps'+#13+#13+'cliquer pour'+#13+'recuperer le numero de serie'+#13+'du disque ou l"adresse physique';
    label1.Caption:='LABEL MULITILIGNES'+#13+'Hdd:'+#13+'hard disk drive'+#13+'fr: disque dur'+#13+#13+'HDD SERIAL' ;
    end;
     
    end.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. erreur lors du lecture d'un fichier excel
    Par pato1989 dans le forum Général Java
    Réponses: 3
    Dernier message: 31/03/2011, 12h35
  2. [XSLT] Erreur lors de la lecture d'un fichier XSL
    Par Mobius dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 14/05/2008, 14h25
  3. Erreur lors la lecture d'une table PostgreSQL
    Par choko83 dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 30/04/2008, 14h56
  4. Erreur lors de la lecture d'un fichier
    Par akremb22 dans le forum Delphi
    Réponses: 14
    Dernier message: 11/04/2007, 15h15
  5. Erreur lors de la lecture d'un blob
    Par guille007 dans le forum DB2
    Réponses: 3
    Dernier message: 07/03/2006, 16h37

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