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 :

[D7][Infos système] Comment lister toutes les classes WMI ?


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre habitué Avatar de phplive
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 179
    Points : 150
    Points
    150
    Par défaut [D7][Infos système] Comment lister toutes les classes WMI ?
    Bjr,

    Je cherche à recupérer les informations sur la configuration des postes sous Windows (mémoiré installé, logiciels, fabriquant, disques durs, BIOS etc ...) dans le cadre de la gestion d'un parc informatique.

    Avec Delphi 7 j'y arrive facilement en utilisant WMI (un grand merci à Laurent Dardenne grand gourou de la doc s'il en est ...)

    Cependant je suis obligé d'indiquer manuellement les classes WMI (Win32_BIOS, Win32_OperatingSystem, Win32_PhysicalMemory etc ...)

    Afin de faire un browser j'aimerais savoir s'il existe un moyen de récuperer la liste des noms de toutes les classes WMI ? Ca doit être faisaible puisque l'utilitaire wbemtest.exe fournit par Microsoft le fait ...

    Comment ?

    Si vous avez une idée ...

    Merci
    @+
    Php

    D7 Enterprise - XP sp2
    The Truth is Out There

  2. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    je ne sais pas si c'est cela que tu demenade mais bon
    a toi de voir

    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
     
    type
      TForm1 = class(TForm)
        Memo1: TMemo;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
        // procedure ButtonClick(Sender: TObject);
      private
        { Déclarations privées }
      Protected
      public
        { Déclarations publiques }
      end;
    var
      Form1: TForm1;
    implementation
    {$R *.dfm}
     
    uses
      ActiveX, WbemScripting_TLB;
     
    function ADsEnumerateNext(pEnumVariant: IEnumVARIANT; cElements: ULONG;
      var pvar: OleVARIANT; var pcElementsFetched: ULONG): HRESULT; safecall; external 'activeds.dll';
     
    procedure DumpWMI_Process(Process: SWBemObject);
    var
      Enum: IEnumVARIANT;
      varArr: OleVariant;
      lNumElements: ULong;
      SProp: ISWbemProperty;
      Prop: OleVariant;
      PropName: string;
      PropType: string;
      PropValue: string;
    begin
      Form1.Memo1.Lines.Add('=> WMI Path: ' + Process.Path_.Path);
      Enum := Process.Properties_._NewEnum as IEnumVariant;
      while (Succeeded(ADsEnumerateNext(Enum, 1, VarArr, lNumElements))) and
        (lNumElements > 0) do
      begin
        if Succeeded(IDispatch(varArr).QueryInterface(SWBemProperty, SProp)) and
          Assigned(SProp) then
        begin
          try
     
            PropName  := SProp.Name;
            Prop := SProp.Get_Value;
            PropType := VarTypeAsText(VarType(Prop));
            PropValue := VarToStr(Prop);
            Form1.Memo1.Lines.Add('  + ' + PropName + '[' + PropType + '] = ' + PropValue);
          except
            on E: Exception do
            begin
              // WriteLn(ErrOutput, PropName, ': ', E.Message);
            end;
          end;
        end;
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Server: string;
      Enum: IEnumVARIANT;
      varArr: OleVariant;
      lNumElements: ULong;
      AName: array[0..255] of Char;
      ASize: DWORD;
    begin
      if (ParamCount = 0) then
      begin
        Server := '';
        ASize  := SizeOf(AName) - 1;
        if GetComputerName(@AName, ASize) then
         Server := AName;
      end
      else
      begin
        Server := ParamStr(1);
      end;
     
       try
        Memo1.Lines.BeginUpdate;
        Enum := CoSWbemLocator.Create.ConnectServer(Server, 'root\cimv2', '',
          '', '', '', 0, nil).ExecQuery('Select * from Win32_Process', 'WQL',
          wbemFlagBidirectional, nil)._NewEnum as IEnumVariant;
        while (Succeeded(ADsEnumerateNext(Enum, 1, varArr, lNumElements))) and (lNumElements > 0) do
        begin
          DumpWMI_Process(IUnknown(varArr) as SWBemObject);
        end;
      finally
        Memo1.Lines.EndUpdate;
      end;
    end;

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  3. #3
    Membre habitué Avatar de phplive
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 179
    Points : 150
    Points
    150
    Par défaut
    Bonsoir,

    Ca ne répondait pas exactement ... Par contre ca m'a donné un ex pour parcourir les propriétés

    Finalement j'ai trouvé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WmiObjectSet := WmiServices.SubclassesOf('', wbemQueryFlagDeep, nil);
    Simple


    Reste plus qu'à collecter toutes ces informations et les enregistrer dans une base MySQL : plus facile à dire qu'à faire ...
    @+
    Php

    D7 Enterprise - XP sp2
    The Truth is Out There

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment lister toutes les classes annotées ?
    Par verbose dans le forum Général Java
    Réponses: 16
    Dernier message: 03/05/2011, 00h38
  2. Comment lister toutes les tables d'une BD ?
    Par jmulans dans le forum Bases de données
    Réponses: 3
    Dernier message: 04/11/2007, 19h29
  3. Réponses: 2
    Dernier message: 14/08/2006, 19h23
  4. Réponses: 2
    Dernier message: 17/06/2005, 23h03

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