Serial HD

Delphi

13/10/2012

Ja sei que este assunto é batido,mas ja conseguiram um código para capturar o serial(HArd)de um HD SATA?
Vtrx

Vtrx

Curtidas 1

Melhor post

Alisson Santos

Alisson Santos

15/10/2012

Tentou utilizar o comando que captura o serial normal???
Deu algum erro??
GOSTEI 1

Mais Respostas

Vtrx

Vtrx

13/10/2012

O comum só captura de Hds IDE.
GOSTEI 1
Vtrx

Vtrx

13/10/2012

Ja tenho oque precisava.
Capturar serial físico de HD IDE,SATA,SCSI para controle de Software.
Se alguem interessar pasoo o procedimento.
GOSTEI 0
Singular Ti

Singular Ti

13/10/2012


Ja tenho oque precisava.
Capturar serial físico de HD IDE,SATA,SCSI para controle de Software.
Se alguem interessar pasoo o procedimento.


Legal amigo que bom que conseguiu... Se puder compartilhar com toda a galera aqui sera interessante. Eu mesmo tenho interesse em conhecer. Abraços!!
GOSTEI 0
Vtrx

Vtrx

13/10/2012

Segue link com projeto Delphi 7.
Sei que que para Delphi 2010 e posterior,vai ter que alterar as variaveis que usam String.
http://www.4shared.com/rar/dQMz1vs1/smart.html
No meu caso eu fiz a rotina com apenas oque me interesava,o numero serial.
Na função principal, 0 é o HD C/;,1 é D/; etc.
Testado com SATA,IDE.
GOSTEI 0
Vtrx

Vtrx

13/10/2012

[url]http://www.4shared.com/rar/dQMz1vs1/smart.html[/url]
GOSTEI 0
Vtrx

Vtrx

13/10/2012

Como não dá para editar,to relembrando.
Para Win 7,tem que executar como ADM(mouse direito).
GOSTEI 0
Luiz Eduardo

Luiz Eduardo

13/10/2012

Como não dá para editar,to relembrando.
Para Win 7,tem que executar como ADM(mouse direito).



Parabéns pelo códido amigo, e muito obrigado por compartilhá-lo conosco. Realmente funciona!! Aliás o único que ja vi que tanto funciona pra IDE'S quanto pros SATA.

Agora me diz uma coisa:

eu andei pesquisando muito na tentativa de achar um source que me mostrasse exatamente o serial físico, nessa busca frustrada acabei encontrando apenas um que mostra o serial lógico, pros HD SATA, o que não convem >>


                   ¬   VOL.HARD DISKS SATA 


Function GetSerialID: string;
var
lpVolumeNameBuffer : PChar;
lpFileSystemNameBuffer : PChar;
nVolumeNameSize : DWORD;
lpVolumeSerialNumber : DWORD;
lpMaximumComponentLength : DWORD;
lpFileSystemFlags : DWORD;
nFileSystemNameSize : DWORD;
begin
Result := '';
GetMem( lpVolumeNameBuffer, MAX_PATH + 1 );
GetMem( lpFileSystemNameBuffer, MAX_PATH + 1 );
try
nVolumeNameSize := MAX_PATH + 1;
nFileSystemNameSize := MAX_PATH + 1;
if GetVolumeInformation( PChar( 'C:\' ), lpVolumeNameBuffer,
nVolumeNameSize,
@lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags,
lpFileSystemNameBuffer, nFileSystemNameSize ) then
begin
result := IntToStr(lpVolumeSerialNumber);
end;
finally
FreeMem( lpVolumeNameBuffer );
FreeMem( lpFileSystemNameBuffer );
end;
end;

Procedure TForm1.FormCreate(Sender: TObject);
begin
Label1.Caption := (GetSerialID);
end;

end.



UMA CURIOSIDADE:

No caso da função acima eu teria como chamá-la por exemplo em um IdMessge1.Boby.Add(function);

Nesse seu código que você disponibilizou pra galera, qual nome da função e em qual arquivo a mesma se encontra naquele ZIP, a qual eu também possa chamá-la no IdMessage1?

E uma outra coisa que queria saber que já houvi falar foi em serial da placa mãe como uma outra medida de segurança pra aplicação. Afinal, existe mesmo uma função pra limitar o programa a placa mãe do usuário?

Abração a a todos e valeu!!
GOSTEI 0
Vtrx

Vtrx

13/10/2012

Olá.
Voce poderia tentar assim;
.....
var
  Form1: TForm1;

Const
  DISCO  = '123456';

.......
procedure TForm1.Button1Click(Sender: TObject);
var
    errinfo, model, serial: string ;
    diskbytes: int64 ;
    SmartResult: TSmartResult ;
begin
    if MagWmiSmartDiskInfo (0, errinfo, model, serial, diskbytes) then begin
            if DISCO <> Serial then  begin
          MessageBox(Application.Handle ,'Hardware não Habilitado','Erro',MB_OK + MB_ICONINFORMATION );
            exit;
            end;
      end
        else
          MessageBox(Application.Handle ,'Hardware Habilitado','Confirmação',MB_OK + MB_ICONINFORMATION );
          Label2.Caption:='Numero serial:' + serial;
        exit ;

end;


Crie um outro projeto com os mesmos arquivos do exemplo,e coloque apenas um Button e um Label.
A Constante 'DISCO',é o número serial que voce capturou do PC que vai rodar o programa.
Um observação é que quando voce fizer um pequeno programinha para capturar o serial do HD da máquina,voce tem que capturar o serial e colocar num Edit,pois de outro modo na hora de comparar,indica que não é igual.
Não sei se insere espaços ou outro simbolo não visível.
Eu fiz um programainha que captura o serial e grava num arquivo txt num pendriver.
Esse exemplo do botão não capturar drivers 'Scsi',para pegá-los tem que ver o código completo do exemplo que postei.
Ele verifica se é IDE/SATA,se não for a rotina MagWmiScsiDiskInfo captura.
Na verdade voce pode capturar todas as informações do Hardware,mas aí fica muito longo...
GOSTEI 0
Vtrx

Vtrx

13/10/2012

Relembrando.
MagWmiSmartDiskInfo (0, errinfo, model, serial, diskbytes) 

0 é o driver C(raiz),1,2 etc são os outros por ordem.
model é o Modelo do HD.
serial ja sabe...
duskbytes é a capacidade do HD (tamanho).
GOSTEI 0
Luiz Eduardo

Luiz Eduardo

13/10/2012

Olá.
Voce poderia tentar assim;
.....
var
  Form1: TForm1;

Const
  DISCO  = '123456';

.......
procedure TForm1.Button1Click(Sender: TObject);
var
    errinfo, model, serial: string ;
    diskbytes: int64 ;
    SmartResult: TSmartResult ;
begin
    if MagWmiSmartDiskInfo (0, errinfo, model, serial, diskbytes) then begin
            if DISCO <> Serial then  begin
          MessageBox(Application.Handle ,'Hardware não Habilitado','Erro',MB_OK + MB_ICONINFORMATION );
            exit;
            end;
      end
        else
          MessageBox(Application.Handle ,'Hardware Habilitado','Confirmação',MB_OK + MB_ICONINFORMATION );
          Label2.Caption:='Numero serial:' + serial;
        exit ;

end;


VTRX, o seu código acima deu um monte de erro de compilação, acho que foi por conta daqueles exit's que vc havia colocado rsrs.

Agora tá dando o seguinte >>

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var
errinfo, model, serial: string ;
diskbytes: int64 ;
SmartResult: TSmartResult ;

begin
if MagWmiSmartDiskInfo (0, errinfo, model, serial, diskbytes) then
begin
if DISCO <> Serial then begin
MessageBox(Application.Handle ,'Hardware não Habilitado','Erro',MB_OK + MB_ICONINFORMATION );
end;
MessageBox(Application.Handle ,'Hardware Habilitado','Confirmação',MB_OK + MB_ICONINFORMATION );
end;
Label1.Caption:='Numero serial:' + serial;
 end;
end.
 


[Error] Unit1.pas(35): Undeclared identifier: 'TSmartResult'

[Error] Unit1.pas(38): Undeclared identifier: 'MagWmiSmartDiskInfo'

REFERENTE AO CÓDIGO ACIMA, DEPOIS QUE EU ORGANIZEI MAIS ELE.

Poderia dá uma forcinha aí parcero?

Valeu!!
GOSTEI 0
Claudia Nogueira

Claudia Nogueira

13/10/2012

Eduardo baixa esse arquivo [url]http://www.cdnweb.com.br/magwmi53.zip[/url] descompacta, adiciona as units smartapi, WbemScripting_TLB, magwmi e magsubs1 ao projeto. Instancia as units no magwmi, magsubs1 no uses do form.

O código inteiro do form para o exemplo ficou assim:

unit Unit1;

interface

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

Const
  DISCO = '123456';

type
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    Label2: TLabel;
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

Uses magwmi, magsubs1;

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
Var
  errinfo, model, serial: string;
  diskbytes: int64;
  SmartResult: TSmartResult;
begin
  if MagWmiSmartDiskInfo (0, errinfo, model, serial, diskbytes) then
  begin
    if DISCO <> Serial then
    begin
      MessageBox(Application.Handle ,'Hardware não Habilitado','Erro',MB_OK + MB_ICONINFORMATION );
      Exit;
    end;
  end
  else
    MessageBox(Application.Handle ,'Hardware Habilitado','Confirmação',MB_OK + MB_ICONINFORMATION );
  Label2.Caption:='Numero serial:' + serial;
end;

end.

GOSTEI 0
Luiz Eduardo

Luiz Eduardo

13/10/2012

Eduardo baixa esse arquivo [url]http://www.cdnweb.com.br/magwmi53.zip[/url] descompacta, adiciona as units smartapi, WbemScripting_TLB, magwmi e magsubs1 ao projeto. Instancia as units no magwmi, magsubs1 no uses do form.

O código inteiro do form para o exemplo ficou assim:

unit Unit1;

interface

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

Const
  DISCO = '123456';

type
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    Label2: TLabel;
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

Uses magwmi, magsubs1;

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
Var
  errinfo, model, serial: string;
  diskbytes: int64;
  SmartResult: TSmartResult;
begin
  if MagWmiSmartDiskInfo (0, errinfo, model, serial, diskbytes) then
  begin
    if DISCO <> Serial then
    begin
      MessageBox(Application.Handle ,'Hardware não Habilitado','Erro',MB_OK + MB_ICONINFORMATION );
      Exit;
    end;
  end
  else
    MessageBox(Application.Handle ,'Hardware Habilitado','Confirmação',MB_OK + MB_ICONINFORMATION );
  Label2.Caption:='Numero serial:' + serial;
end;

end.




Brigadão Claudia! deu certo!!

Agora tem como fazer disso uma função tipo String, tirar este Label e substituir por um IdMessage.Body.Add(função);

??

Valeu.
GOSTEI 0
Benedito Assis.

Benedito Assis.

13/10/2012

Claudia.

Segue seu exemplo, esta dando erro hardware não habilitado.
GOSTEI 0
Benedito Assis.

Benedito Assis.

13/10/2012

Claudia.

Estou confuso, executando não teria que dar o serial do hd.
GOSTEI 0
Luiz Eduardo

Luiz Eduardo

13/10/2012

Claudia.

Estou confuso, executando não teria que dar o serial do hd.



Caro Bene, segue abaixo as modificações que fiz depois de colocar as units necessárias na mesma pasta do projeto (bem como a Claudia falou acima), não tem erro!! >>


¬ Serial Hard Disk Physical

Uses: (magwmi, magsubs1);

            var
  Form1: TForm1;
  Const
DISCO = '123456';

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

Var
errinfo, model, serial: string;
diskbytes: int64;
SmartResult: TSmartResult;
begin
if MagWmiSmartDiskInfo (0, errinfo, model, serial, diskbytes) then
begin
if DISCO <> Serial then
begin
Label1.Caption:='Numero serial:' + serial;
end;
end;
end;
end.



Se depois de salvar der aparecer que a variável SmartResult: TSmartResult; está ali mas nunca foi usada pela procedure Button, simplesmente ignore e compile mais um vez, que vai.

Espero que tenha lhe ajudado.
GOSTEI 0
Vtrx

Vtrx

13/10/2012

Eu postei o pequeno exemplo do botão,baseado no projeto que disponibilizei no link,isto quer dizer que teria que ter refeito o projeto retirando as partes não usadas e não começando do zero.
GOSTEI 0
Vtrx

Vtrx

13/10/2012

Bene,voce leu todo o post?
Verifique se a unidade que quer ler o HD é a C:
Se não for,tem que mudar o numero zero da função para 1 ou 2 etc (leia observações acima).
GOSTEI 0
Luiz Eduardo

Luiz Eduardo

13/10/2012

VTRX,

Eu transformei o seu exemplo acima em uma função tipo String pra poseriormente ser chamada em uma outra parte do código, só que aqui no meu caso eu tenho uma procedure relacionada a Webcam, e depois que eu fiz essa transformação ficou assim >>


Uses: Magwmi, Magsubs1;

var 

  Form1: TForm1;

   Const
DISCO = '123456';


Function SerialHD: String;

 var
errinfo, model, serial: string;
diskbytes: int64;
SmartResult: TSmartResult;
begin
if MagWmiSmartDiskInfo (0, errinfo, model, serial, diskbytes) then
begin
if DISCO <> Serial then
begin
Result:='Numero serial:' + serial;
end;
 end;
   end;



Só que agora está dando um erro de compilação nessa parte do código da Webcam >>


procedure TForm1.Camera ((Sender: TObject);

begin

   if hWndC <> 0 then exit;
  hWndC := capCreateCaptureWindowA('WebCam no Turbo Delphi',WS_CHILD or WS_VISIBLE    // << Linha que marca como erro   ,Panel1.Left,Panel1.Top,320,240,Form1.Handle,0);



O erro é esse >>

[Error] Unit1.pas(509): Left side cannot be assigned to


Isso tem jeito de concertar eu eu serei obrigado abrir de mão do código da Cam?

Aguardo retorno.
GOSTEI 0
Claudia Nogueira

Claudia Nogueira

13/10/2012

Isso "hWndC" é uma variável ou uma constant? Por que essa mensagem quer dizer que não é possível atribuir um valor.
GOSTEI 0
Vtrx

Vtrx

13/10/2012

Aqui funcionou.
Verifique se existe erro de sintase;
hWndC := capCreateCaptureWindowA('WebCam no Turbo Delphi',WS_CHILD or WS_VISIBLE,Panel1.Left,Panel1.Top,320,240,Form1.Handle,0);


Não esqueça que a rotina que postou do serial não está comparando ela.
Voce deve definir em;
Const
  DISCO  = '123456';

Defina o numero serial que voce quer liberar o seu programa.
GOSTEI 0
Luiz Eduardo

Luiz Eduardo

13/10/2012

Isso "hWndC" é uma variável ou uma constant? Por que essa mensagem quer dizer que não é possível atribuir um valor.



Isso "hWndC" é uma variável global >>


var

hWndC : THandle = 0;



GOSTEI 0
Luiz Eduardo

Luiz Eduardo

13/10/2012

Isso "hWndC" é uma variável ou uma constant? Por que essa mensagem quer dizer que não é possível atribuir um valor.



Isso "hWndC" é uma variável global >>


var

hWndC : THandle = 0;





PESSOAL JA RESOLVI AQUI!!! VALEU!
GOSTEI 0
Humberto Sa

Humberto Sa

13/10/2012

programo em cobol e preciso ler a numero de serie do hd para seguranca do sistema vc tem esta rotina
GOSTEI 0
POSTAR