Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   WMI - Obteniendo el numero de serie de la placa base. (https://www.clubdelphi.com/foros/showthread.php?t=67287)

yapt 10-04-2010 02:44:28

WMI - Obteniendo el numero de serie de la placa base.
 
Hola,

estoy tratando de leer el Nº de serie de la placa base de cualquier ordenador con WMI (teoricamente, todos desde W2000).

Se que Neftali tiene unos fantasticos componentes, pero, los he descargado y parece que solo están para Delphi2007 (no he probado a instalar y testear en Delphi2010) y, además, es que solo quiero saber el id de la placa.

Esto es lo que tengo (tras importar la libreria de tipos -type library-):

Código Delphi [-]
function GetMotherBoardSerial:string;
var
  WMIServices : ISWbemServices;
  Root        : ISWbemObjectSet;
  Item        : Variant;
begin
  WMIServices := CoSWbemLocator.Create.ConnectServer('.', 'root\cimv2','', '', '', '', 0, nil);
  Root  := WMIServices.ExecQuery('Select SerialNumber From Win32_BaseBoard','WQL', 0, nil);
  Item := Root.Item('Base Board',0);   <<--- aquí el error...
  Result:=VarToStr(Item.SerialNumber);
end;

En la línea que marca el error, ya he probado de todo. El código está recogido de algún sitio (que no consigo encontrar de nuevo).

A ver si a alguien se le ocurre algo.

Saludos y gracias anticipadas.

yapt 12-04-2010 12:15:11

Hola.... alguna idea sobre esto ?

Muchas gracias y perdón por la insistencia... :o

yapt 12-04-2010 16:27:09

Bueno, solucionado:

http://stackoverflow.com/questions/2...-number-delphi

Saludos.

jhonny 12-04-2010 16:38:51

Si yo hubiera visto este mensaje antes, al igual que en este momento te hubiera recomendado echarle un vistazo a los componentes basados en WMI de Neftali... en http://www.clubdelphi.com/foros/showthread.php?t=65935

yapt 13-04-2010 00:48:05

Si, lo decia en mi primer mensaje de este hilo. El asunto es que me corria un poco de prisa y al descargar los GlibWMI, vi que solo había paquete para Delphi 2007, con lo que supuse que no estaban listos para Delphi 2010.

Saludos.

ptorres 08-09-2011 09:37:54

Clase para sacar la informacion de la Placa Base
 
Amigos esta es una clase para sacar los datos de la tarjeta madre y el CPU no se si les sirva la acabo de hacer.

espero que les sirva

Código Delphi [-]
unit clSistema;

interface

uses Registry,Windows,SysUtils;
type
  TBIOS = class
    constructor create;
   Public
    Fabricante,ProductoBase,VersionTarjeta,
    Fecha,Vendedor,VersionBios,FamiliaSistema,FabricanteSistema,
    NombreProducto,SKU,VersionSistema:String;
  end;

  TCPU = class
   constructor create(NoCPU : Integer);
   Public
    Identificador,NombreProcesador,Vendedor,ActualizacionMicroCode:String;
  end;
  TSistema = class
   constructor create;
   destructor Destroy;
  Public
   Bios : TBios;
   CPU1  : TCPU;
   CPU2  : TCPU;
   CPU3  : TCPU;
   CPU4  : TCPU;
  end;

implementation
const vBios: string = '\HARDWARE\DESCRIPTION\System\BIOS';
const vCPU: string = '\HARDWARE\DESCRIPTION\System\CentralProcessor';

////////////////////
////////// clase sistema
///////////////////

constructor TSistema.create;
Begin
 Bios:=TBios.create;
 CPU1:=TCPU.create(0);
 CPU2:=TCPU.create(1);
 CPU3:=TCPU.create(2);
 CPU4:=TCPU.create(3);
End;

destructor TSistema.Destroy;
Begin
 Bios.Free;
 CPU1.Free;
 CPU2.Free;
 CPU3.Free;
 CPU4.Free;
End;
////////////////////
////////// clase bios
///////////////////

constructor TBIOS.create;
var Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    Reg.Rootkey:= HKEY_LOCAL_MACHINE;
    Reg.OpenKey(vBios, False);
    Fabricante:=Reg.ReadString('BaseBoardManufacturer');
    ProductoBase:=Reg.ReadString('BaseBoardProduct');
    VersionTarjeta:=Reg.ReadString('BaseBoardVersion');
    Fecha:=Reg.ReadString('BIOSReleaseDate');
    Vendedor:=Reg.ReadString('BIOSVendor');
    VersionBios:=Reg.ReadString('BIOSVersion');
    FamiliaSistema:=Reg.ReadString('SystemFamily');
    FabricanteSistema:=Reg.ReadString('SystemManufacturer');
    NombreProducto:=Reg.ReadString('SystemProductName');
    SKU:=Reg.ReadString('SystemSKU');
    VersionSistema:=Reg.ReadString('SystemVersion');
  finally
    Reg.Free;
  end;
End;
////////////////////
////////// clase CPU
///////////////////

constructor TCPU.create;
var Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    Reg.Rootkey:= HKEY_LOCAL_MACHINE;
    if Reg.OpenKey(vCPU+'\'+IntToStr(NoCPU), False) then
     Begin
      Identificador:=Reg.ReadString('Identifier');
      NombreProcesador:=Reg.ReadString('ProcessorNameString');
      Vendedor:=Reg.ReadString('VendorIdentifier');
      ActualizacionMicroCode:=Reg.ReadString('MicrocodeUpdateStatus');
     End
    else
     Begin
      Identificador:='No Presente';
      NombreProcesador:='No Presente';
      Vendedor:='No Presente';
      ActualizacionMicroCode:='No Presente';
     End;
  finally
    Reg.Free;
  end;
End;

end.

ptorres 08-09-2011 09:40:04

Clase para sacar la informacion de la Placa Base
 
Comenten que les parece gracias

koiji 04-08-2014 16:45:06

Ejemplo de uso
 
Hola ptorres pues no lo e podido probar usted cree que me pueda dar un ejemplo de uso para poder ver su funcionamiento porfabor Muchas Gracias por su ayuda

Casimiro Notevi 04-08-2014 17:05:35

Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo?, gracias por tu colaboración :)

¿Por qué no lo has podido probar?, ¿por qué solicitas un ejemplo si ahí arriba tienes el código y solamente tienes que copiar y pegar?

ecfisa 04-08-2014 17:10:58

Hola koiji.
Cita:

Empezado por koiji (Mensaje 479693)
Hola ptorres pues no lo e podido probar usted cree que me pueda dar un ejemplo de uso para poder ver su funcionamiento porfabor Muchas Gracias por su ayuda

Bueno, si no lo has podido probar... debe ser difícil ver su funcionamiento :rolleyes:

Con el permiso de ptorres, pongo un ejemplo del uso:
(File->New->Unit. (borrar, copiar y pegar el código de ptorres)
Código Delphi [-]
...
implementation

uses clSistema;

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TBIOS.create do
  try
    Memo1.Clear;
    Memo1.Lines.Add(Fabricante);
    Memo1.Lines.Add(ProductoBase);
    Memo1.Lines.Add(VersionTarjeta);
    Memo1.Lines.Add(Fecha);
    Memo1.Lines.Add(Vendedor);
    Memo1.Lines.Add(VersionBios);
    Memo1.Lines.Add(FamiliaSistema);
    Memo1.Lines.Add(FabricanteSistema);
    Memo1.Lines.Add(NombreProducto);
    Memo1.Lines.Add(SKU);
    Memo1.Lines.Add(VersionSistema);
  finally
    Free;
  end;
end;

Saludos :)

ecfisa 04-08-2014 17:12:02

Cita:

Empezado por ptorres (Mensaje 411233)
Comenten que les parece gracias

Hola ptorres.

No había visto el mensaje, acabo de probar el código, me parece muy bueno y funciona correctamente ^\||/

Saludos :)

nlsgarcia 06-08-2014 04:31:26

koiji

Cita:

Empezado por koiji
...usted cree que me pueda dar un ejemplo...

:rolleyes:

Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ActiveX, ComObj;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    ComboBox1: TComboBox;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  WMIList : TStringList;

implementation

{$R *.dfm}

// Obtiene Información del Sistema por medio de WMI (Windows Management Instrumentation)
procedure GetSystemInformation(ClassName, NameSpace : String; S : TStrings);
var
   FSWbemLocator : OLEVariant;
   FWMIService : OLEVariant;
   FWbemObjectSet : OLEVariant;
   FWbemObject : OLEVariant;
   oEnum : IEnumvariant;
   iValue : LongWord;
   FProperties : OLEVariant;
   oEnumProp : IEnumvariant;
   iValueProp : LongWord;
   FPropObj : OLEVariant;
   SQLWMI : String;
   AuxString : String;
   i : Integer;

begin;

   SQLWMI := 'SELECT * FROM ' + ClassName;

   FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
   FWMIService := FSWbemLocator.ConnectServer('localhost', NameSpace, '', '');
   FWbemObjectSet := FWMIService.ExecQuery(SQLWMI,'WQL',0);
   oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;

   S.Clear;

   while (oEnum.Next(1, FWbemObject, iValue) = 0) do
   begin

      FProperties   := FWbemObject.Properties_;
      oEnumProp     := IUnknown(FProperties._NewEnum) as IEnumVariant;

      S.BeginUpdate;

      S.Add(StringOfChar('-', 100));

      while oEnumProp.Next(1, FPropObj, iValueProp) = 0 do
      begin

         if VarIsArray(FPropObj.Value) then
         begin
            for i:= VarArrayLowBound(FPropObj.Value,1) to VarArrayHighBound(FPropObj.Value,1) do
               AuxString := AuxString + ' ' + String(FPropObj.Value[i]);

            S.Add(FPropObj.Name + ' : ' + AuxString);
         end
         else if not VarIsNull(FPropObj.Value) then
            S.Add(FPropObj.Name + ' : ' + String(FPropObj.Value))
         else
            S.Add(FPropObj.Name + ' : ' + 'Empty');

         FPropObj := Unassigned;

      end;

      S.Add(StringOfChar('-', 100));

      S.EndUpdate;

      FWbemObject := Unassigned;

   end;

end;

// Inicialización de Clases y Namespaces de Windows Management Instrumentation
procedure TForm1.FormCreate(Sender: TObject);
var
   i : Integer;

begin

   WMIList := TStringList.Create;
   WMIList.Add('Win32_BIOS' + '=' + 'root\CIMV2');
   WMIList.Add('CIM_Processor' + '=' + 'root\CIMV2');
   WMIList.Add('Win32_MotherboardDevice' + '=' + 'root\CIMV2');
   WMIList.Add('Win32_PhysicalMemory' + '=' + 'root\CIMV2');
   WMIList.Add('Win32_USBHub' + '=' + 'root\CIMV2');
   WMIList.Add('Win32_Product' + '=' + 'root\CIMV2');
   WMIList.Add('Win32_CDROMDrive' + '=' + 'root\CIMV2');
   WMIList.Add('Win32_BaseBoard' + '=' + 'root\CIMV2');

   for i := 0 to WMIList.Count - 1 do
      ComboBox1.Items.Add(WMIList.Names[i]);

   Memo1.ScrollBars := ssBoth;

end;

// Obtiene Información del Sistema por medio de WMI
procedure TForm1.Button1Click(Sender: TObject);
var
   ClassName, NameSpace : String;

begin
   ClassName := WMIList.Names[ComboBox1.ItemIndex];
   NameSpace := WMIList.ValueFromIndex[ComboBox1.ItemIndex];
   Button1.Enabled := False;
   GetSystemInformation(ClassName, NameSpace, Memo1.Lines);
   Button1.Enabled := True;
   Memo1.SelStart := 0;
   Memo1.SelLength := 0;
end;

// Libera recursos de la Aplicación
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   WMIList.Free;
   Action := caFree;
end;

end.
El código anterior en Delphi 7 bajo Windows 7 Professional x32, permite obtener información de varias clases de información de Windows por medio de WMI (Windows Management Instrumentation), como se muestra en la siguiente imagen:



Nota: Este ejemplo sigue la misma linea de resolución (Uso de WMI) que origino este hilo.

Revisa la siguiente información:
Espero sea útil :)

Nelson.

ecfisa 06-08-2014 04:41:46

Hola.

Casi me olvido... :o

No me hubiera perdonado dejar sin mención a la excelente biblioteca de componentes WMI, autoría de nuestro compañero Neftali: GLibWMI

Saludos :)

Edito: Creo que me pegó el alzheimer... Muy bueno el ejemplo Nelson ^\||/


La franja horaria es GMT +2. Ahora son las 18:11:03.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi