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 :

mapping / serial d'un disque dur


Sujet :

API, COM et SDKs Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 34
    Par défaut mapping / serial d'un disque dur
    Bonjour à tout ceux qui tomberont sur ce post [^^happy13]

    Je cherche, pour un scanner multithreads, un moyen de savoir sur quel disque physique est situé un lecteur, de préférence à partir de sa lettre.

    J'ai pensé à extraire le numéro de serie physique du disque mais tout les exemple que j'ai trouvé utilisent WMI sous VB ou VB.Net : je n'ai pas les connaissances requises. Il me semble de plus qu'elles partent d'un ./physicalDrive et non d'une lettre de lecteur. Idem avec la base de registre, ou je ne vois d'ailleur que certains disques.

    En conclusion si quelqu'un a un moyen de recupérer le num de série physique, un GUI de disque, ou tout autre identificateur, cela me serrait d'une énorme utilité !

    Vous remerçiant par avance

    mic

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 617
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par LaDentDeLait Voir le message
    En conclusion si quelqu'un a un moyen de recupérer le num de série physique, un GUI de disque, ou tout autre identificateur, cela me serrait d'une énorme utilité !
    Seul l'utilisation des WMI m'a réussi . Pour tester j'avais trouver un composant http://glibwmi.svn.sourceforge.net/svnroot/glibwmi/
    puis j'ai décider de faire quelque chose de moi-même , correspondant mieux a mes besoins . Si la solution de Neftali ne t'agrée pas je peux toujours poster mes élucubrations (après les avoir commentées)

  3. #3
    Membre émérite
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    991
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 991
    Par défaut
    moi sa m'intéresse aussi (même non commenté ), dans la pratique c'est pour vérifier qu'un dossier de sauvegarde n'est pas sur le même disque physique.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 34
    Par défaut
    Je suis également très intéressé par ton code, commenté ou non d'ailleurs , ça ne pourrait que m'aider.

    mic

  5. #5
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 617
    Billets dans le blog
    65
    Par défaut
    Puisque c'est demandé si gentiment , voici mes "élucubrations"

    PREAMBULE

    Tout d'abord cela nécessite quand même de faire des recherches sur le SQL WMI et les résultats à obtenir . Partant de ce constat , j'ai fait une séries de fonctions et une constatation : 'Pas étonnant que Windows plante avec une base de données si (censuré) '


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // Bon , là je triche un peu , puisque je reprends l'unité de neftali
    // grosse flemme 
    uses WbemScripting_TLB

    Code Types et constantes : 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
     
    type TMedia = record
      DriveType : integer;
      MediaType : Integer;
      MediaTypeString : String;
      Interfacetype : String;
      Caption : String;
      FreeSpace : Cardinal;
     
    end;
     
    // Constantes WMI
    const
      STR_LOCALHOST = '.';
      STR_CIM2_ROOT = 'root\cimv2';
      STR_CLASS     = 'Win32_DISKDRIVE';
    // Autres
    const
      STR_EMPTY = '';

    Code Déclarations : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function GetPhysicalDrive(Drive : String) : String;
    function WMIGet(SQL : String) : WideString;
    function WMICollection(Chaine : WideString; out THS :THashedStringList): Integer;
    function WMIPropriete( WMIGot : WideString ;Name : String) : String;
    function WMIProprieteInt(WMIGot: WideString; Name : String): LongInt;
    function WMISubCollection(Chaine : String; out TS : TStrings):Integer;
     
    function RetrieveMedia(disque : String) : TMedia;

    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
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
     
    // WMI ------------------------------------------------------------------------
    // ces fonctions sont faites dans le but de pouvoir traiter toutes les informations WMI
    // pas seulement ,comme c'est mon but ici , obtenir des informations disque 
    function WMIGet(SQL : String) : WideString;
    var
       Locator:ISWbemLocator;
       Services:ISWbemServices;
       ObjSet:ISWbemObjectSet;
       Value:Cardinal;
       SObject:ISWbemObject;
       TempObj : OleVariant;
       Enum :IEnumVariant;
    begin
      try
        Locator := CoSWbemLocator.Create();
        // Connection au service WMI
        Services := Locator.ConnectServer(
            STR_LOCALHOST,        {local}
            STR_CIM2_ROOT,        {root}
            STR_EMPTY, STR_EMPTY, {Utilisateur et Mot de passe -en local inutile-}
            STR_EMPTY,STR_EMPTY, 0, nil);
        // Acceder aux données
        ObjSet := Services.ExecQuery(SQL,'WQL',
                                    wbemFlagReturnImmediately and wbemFlagForwardOnly , nil);
        Enum :=  (ObjSet._NewEnum) as IEnumVariant;
         // un objet trouvé ?
        if (Enum.Next(1, TempObj, Value) = S_OK)
           then begin
             SObject :=IUnknown(TempObj) as ISWBemObject;
            if (SObject <> nil) then
               begin
                 // Acceder aux propriétés
                 // SObject.Properties_;
                 result:=SObject.GetObjectText_(0);
               end;
           end;
      except
        Result:='';
      end;
    end;
     
    function WMICollection(Chaine : WideString;out THS :THashedStringList): Integer;
    var d,f : word;
        start : Boolean;
        Ws : String;
    begin
        Chaine:=AnsiReplaceStr(Chaine,';','');
        Chaine:=AnsiReplaceStr(Chaine,' = ','=');
        Chaine:=AnsiReplaceStr(Chaine,#9,'');
        Ws:='';
        for f := Length(Chaine) downto 0 do
          if chaine[f]='}' then break;
        Start:=False;
        for d:= 0 to f-1 do
          begin
           if Start then ws:=ws+Chaine[d]
                    else Start:=Chaine[d]='{';
          end;
        THS.Text:=ws;
        Result:=THS.Count;
    end;
     
    function WMISubCollection(Chaine : String;out  TS : TStrings):Integer;
    var d,f : word;
        start : Boolean;
        Ws : String;
    begin
        ws:='';
        for f := Length(Chaine) downto 0 do
          if chaine[f]='}' then break;
        start:=False;
        for d:= 0 to f-1 do
         begin
          if Start then ws:=ws+Chaine[d]
                   else Start:=Chaine[d]='{';
         end;
         TS.CommaText:=ws;
         Result:=TS.Count;
    end;
     
    function WMIPropriete(WMIGot : WideString ;Name : String) : String;
    var TS : THashedStringList;
    begin
     TS:=THashedStringList.Create;
     try
     WMICollection(WMIGot,TS);
     Result:=AnsiReplaceStr(TS.ValueFromIndex[TS.IndexOfName(Name)],'"','');
     finally
       FreeAndNil(TS);
     end;
    end;
     
    function WMIProprieteInt(WMIGot: WideString; Name : String): LongInt;
    var TS : THashedStringList;
        R : String;
    begin
     TS:=THashedStringList.Create;
     try
     WMICollection(WMIGot,TS);
     R:=AnsiReplaceStr(Trim(TS.ValueFromIndex[TS.IndexOfName(Name)]),'"','');
     try Result:=StrToInt(R); except Result:=-1; end;
     finally
       FreeAndNil(TS);
     end;
    end;
     
    function GetPhysicalDrive(Drive : String) : String;
    var
       Locator:ISWbemLocator;
       Services:ISWbemServices;
       ObjSet:ISWbemObjectSet;
       Value:Cardinal;
       partition : String;
     
       function DeviceIDFromAssoc(ObjectSet : ISWbemObjectSet): String;
        var SObject:ISWbemObject;
            TempObj : OleVariant;
            Enum :IEnumVariant;
            TS:TStringList;
        begin
         // Obtenir DeviceID de Antécédent
         Enum :=  (ObjSet._NewEnum) as IEnumVariant;
         // un objet trouvé ?
         if (Enum.Next(1, TempObj, Value) = S_OK) then begin
          SObject := IUnknown(TempObj) as ISWBemObject;
          if (SObject <> nil) then begin
            // Acceder aux propriétés
            SObject.Properties_;
            TS := TStringList.Create();
            try
              TS.Text:=AnsiReplaceStr(WMIPropriete(SObject.GetObjectText_(0),'Antecedent'),'"','');
              Result:=Copy(TS.ValueFromIndex[0],2,Length(TS.ValueFromIndex[0])-2);
            finally
              FreeAndNil(TS);
            end;
          end;
          end;
        end;
     
    begin
       try
        Locator := CoSWbemLocator.Create();
        // Connection au service WMI
        Services := Locator.ConnectServer(
            STR_LOCALHOST,        {local}
            STR_CIM2_ROOT,        {root}
            STR_EMPTY, STR_EMPTY, {Utilisateur et Mot de passe -en local inutile-}
            STR_EMPTY,STR_EMPTY, 0, nil);
        // Acceder aux données
       ObjSet := Services.ExecQuery('REFERENCES OF {Win32_LogicalDISK="'+Drive+'"} WHERE ResultClass=Win32_LogicalDiskToPartition ',
                                    'WQL',wbemFlagReturnImmediately and wbemFlagForwardOnly , nil);
       Partition:=DeviceIDFromAssoc(ObjSet);
       // on passe de la partition au disque physique
       ObjSet := Services.ExecQuery('REFERENCES OF {Win32_DiskPartition="'+Partition+'"} WHERE ResultClass=Win32_DiskDriveToDiskPartition',
                                    'WQL',wbemFlagReturnImmediately and wbemFlagForwardOnly , nil);
       result:=AnsiReplaceStr(DeviceIDFromAssoc(ObjSet),'\\','\');
       except
         result:='unknown';
       end;
    end;
    Avec ces dernières on peut aisément retrouver un N° de série disque etc...
    voir Préambule

    Code Utilisation partielle : 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
     
    function RetrieveMedia(disque : String) : TMedia;
    var wmistring : string;
    begin
     wmiString:=WMIGet('SELECT * FROM WIN32_LOGICALDISK WHERE NAME="'+disque+'"');
     result.MediaType:=WMIProprieteInt(WmiString,'MediaType');
     result.FreeSpace:=WMIProprieteInt(WmiString,'FreeSpace');
     result.Drivetype:=WMIProprieteInt(WmiString,'DriveType');
     try
      wmistring:=WMIGet('SELECT * FROM WIN32_DISKDRIVE WHERE deviceID="'+GetPhysicalDrive(Disque)+'"');
      result.Interfacetype:=WMIPropriete(Wmistring,'InterfaceType');
      result.Caption:=WMIPropriete(Wmistring,'Caption');
      result.MediaTypeString:=WMIPropriete(Wmistring,'MediaType');
     except
       result.Interfacetype:='';
       result.Caption:='';
       result.MediaTypeString:='';
     end;
    end;

    l'utilisation ? pour un disque , RetrieveMedia('C:');


    Tout ceci n'est encore qu'un gros brouillon non achevé , lors de recherches personnelles en vu d'obtenir des informations sur les medias physique . Le projet n'est toujours pas achevé faute de temps

  6. #6
    Membre émérite
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    991
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 991
    Par défaut
    Merci de ce partage

Discussions similaires

  1. Réponses: 3
    Dernier message: 31/08/2007, 18h31
  2. Numéro de série du disque dur
    Par h_kamel dans le forum Assembleur
    Réponses: 8
    Dernier message: 21/05/2007, 11h28
  3. Récupèrer la liste des disques durs
    Par Tililian dans le forum C++Builder
    Réponses: 4
    Dernier message: 19/06/2003, 12h42
  4. Monter un disque dur USB
    Par Iced Earth dans le forum Matériel
    Réponses: 5
    Dernier message: 13/01/2003, 22h02
  5. Accès direct au disque dur
    Par Berdo dans le forum x86 16-bits
    Réponses: 4
    Dernier message: 12/01/2003, 16h21

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