Página 1 de 4

Obter o numero serial do HD indepente do Windows... Testem

Enviado: 30 Ago 2007 13:45
por ANDRIL
Boa tarde,

Sempre q preciso obter um dado externo, especificamente o serial do HD, uso o comando VOL C: > ARQX.TXT e leio o arquivo a procura do mesmo.

O problema que em alguns XPs e agora no VISTA START EDITION nao consigo dentro do programa obter tal informacao ( gera o arquivo em branco ).

Nao uso a funcao VOLSERIAL() da CT,CTP porque sempre retorna -1 no meu micro (WIN98) entao nao a considero segura.


Bom criei uma funcao para tentar obter este dado independente da versao do WINDOWS e no 9x, ME, XP (PROFISSIONAL) funcionou.

Agora queria q alguem q tenha o VISTA (se possivel em todas as suas versoes) testassem o codigo.

Código: Selecionar todos



/*
  compilar:  clipper and.prg
  linkar..:  rtlink fi and  ou blinker fi and

*/


cls
@01,01 say"O numero serial desta maquina: "+myvolserial("C")
inkey(0)


FUNCTION MyVolSerial(par1)
*---------------------------------------------------------------------------
*par1 = C letra da unidade
*funcao = exibir o numero do volume independente do windows utilizado
*uso  MyVolSerial("C")
*---------------------------------------------------------------------------
local tela, string,tela1:=savescreen(00,00,24,79)


     if empty(par1)=.t.
     par1="C"
     endif

     *--limpa a tela antes
     cls

     volcomand="vol "+left(par1,1)+":"
     *--se nao usa o blinker
     run &volcomand

     *--se usa o blinker
     *Swpruncmd("&volcomand",0,"","")

     tela=savescreen(00,00,03,79)
     cls
     memowrit("and.txt",strtran(tela,chr(7),""))
     string=memoread("and.txt",80)
     ferase("and.txt")
     restscreen(00,00,24,79,tela1)

return substr(string,at("-",string)-4,4)+substr(string,at("-",string),5)




Se utilizarem o blinker basta acertarem o codigo fonte,


Fico no Aguardo...

Enviado: 30 Ago 2007 15:11
por diogenes_varela
Andril, eu postei a pouco um problema parecido, no Win 2000 que gerava um arquivo em branco. Acredite, mas no meu caso era apenas o CASE SENSITIVE, criava o arquivo em maiúsculo e não o considerava em minúsculo. Chegou ao absurdo de criar dois arquivos com o mesmo nome, um maíusculo e outro minúsculo.

Enviado: 30 Ago 2007 17:38
por Maligno
Apenas quero lembrar que a biblioteca WAPI tem uma função para recuperar o número de série de fábrica do primeiro HD da máquina. Funciona muito bem em kernel NT. Não vejo por quê não funcionaria no Vista. Aliás, o problema desta função é com Windows 95, 98 e Me. Ou seja, kernel não-NT.

Enviado: 30 Ago 2007 18:00
por ANDRIL
Acho que o CASE SENSITIVE não pode ser, porque gero o nome do arquivo com a funcao TempFile() da ctp.lib e esta utiliza só numeros.

Maligno, justamente a respeito dos problemas ora em Win9x e ME ou outras funcoes q funcionam em Win9x e ME e nao funcionam em KERNEL NT e vice-versa que estou buscando uma forma de padronizar.

Acho q tem algumas libs que possuam tal funcao mais nao queria colocar libs extras apenas por causa de 1 funcao.


Gostaria apenas que alguem testasse no VISTA, NT, WIN 2000 para ver se o resultado é o esperado, pois se for, pode-se criar novas funcoes seguindo esta logica como para ver a VERsao do Windows e etc, embora sei que a WAPI tem funcao p/ tal.


Agradeço a vcs os comentarios,

Enviado: 30 Ago 2007 18:08
por Maligno
Vou dar uma olhada mais de perto a respeito do número de série de volume. Se for fácil resolver, incluo isso pra você. Mas aí você teria o número de série de formatação, mas não o de fábrica. Se resolver,...

Enviado: 30 Ago 2007 18:12
por sygecom
Não tenho Vista para Testar, apenas uma dica simples que funciona em todos Windows e que vc pode compilar no xharbour um EXE pequeno para fazer esse serviço pra vc !!!

Código: Selecionar todos

FUNCTION wn_hdserial(p_hddrive)
// Funcao...: Executar a leitura do numero de serie do HD -------------------.
STATIC vhdserial
vhdserial := HdGetSerial(p_hddrive)
vhdserial := IIF(VALTYPE(vhdserial) == 'N',ALLTRIM(STR(vhdserial)),vhdserial)  //hb_NumToHex(vhdserial)
vhdserial := SUBSTR(vhdserial,1,4) + SUBSTR(vhdserial,5,4)
RETURN(vhdserial)
// Fim da funcao de leitura de serie de HD ----------------------------------.
// --------------------------------------------------------------------------.
// Funcao...: Fun‡Æo em "C" para ler o numero serial do HD ------------------. 
#pragma BEGINDUMP
#define HB_OS_WIN_32_USED
#include <windows.h>
#include "winbase.h"
#include "winuser.h"
#include "item.api"
#include "hbapi.h"
HB_FUNC (HDGETSERIAL)
{
unsigned long SerialNumber;
GetVolumeInformation(hb_parc(1),NULL,0,&SerialNumber,NULL,NULL,NULL,0);
hb_retnl(SerialNumber);
}
#pragma enddump
// Fim da funcao em "C" para ler numero serial de HD 
Peguei essa função rodando na NET...uso ela e funciona que é uma blz...

Abraços
Leonardo Machado

Enviado: 30 Ago 2007 18:43
por Maligno
Exato! Foi essa função GetVolumeInformation() que acabei de encontrar no MSDN. Como é coisa simples, vou incluir na WAPI.

Enviado: 01 Set 2007 10:49
por TerraSoftware
Caro colega Sygecom.

Sua função funcionou perfeitamente. Aliás, muito obrigado por suas valiosas contribuições.

Mas eu gostaria ainda de saber o seguinte: Do que exatamente se trata o número retornado? Número de serie (fabricante)? Número da formatação?
Este número nunca muda mesmo formatando? Em quais versões do windows vai funcionar? O número não se repete em outros fabricantes de HD?

Enviado: 01 Set 2007 11:21
por sygecom
Buenas, de uma olhada no link abaixo, onde explica tudo...

http://support.microsoft.com/kb/139547/pt-br

Obs:Funciona em Tudo que é Windows...

Abraços
Leonardo Machado

Enviado: 01 Set 2007 13:21
por Maligno
Este número nunca muda mesmo formatando?
O número é de formatação. Portanto, ao formatar o HD, novo número é gerado. Ele pode, inclusive, ser alterado em Windows com kernel não-NT (Win 95/98/Me). Tenho função pra isso na minha págna. Com o número de série de fábrica já é diferente. Ele não pode ser alterado, já que vem de fábrica. Mas para recuperá-lo alguns requisitos precisam ser satisfeitos: a motherboard precisa suportar a tecnologia S.M.A.R.T., os HDs precisam também suportá-la e para funcionar em Windows com kernel não-NT, será necessário um upgrade (VxD), que nem sempre funciona. Fora isso, beleza. :)

Aliás, a biblioteca WAPI tem função para recuperar o número de série de fábrica. A função mencionada pelo Leonardo não serve pra isso. É uma coisa bem mais complexa.

Enviado: 01 Set 2007 16:27
por sygecom
Rene, esse codigo eu uso para seguranças em meu sistemas, ..alias é o numero gerado por ele, vez outro dividos por outros !!!...e gravo em um DBF caso o sistema não ache internet On-line no micro....caso ele ache eu gravo em um MYSQL on-line ...agora se vc quer o numero de série do fabricante do HD...de uma porcura no link abaixo um codigo em .C e compile no xharbour..

http://www.codeproject.com

Obs:Depois dou uma procurada melhor se eu achar algo volto aqui e posto.

Abraços
Leonardo Machado

Enviado: 01 Set 2007 16:34
por Eolo
Pessoal, eu não sei como é que dá esses problemas todos com vocês, porque, comigo, sempre usei (e continuo usando) RUN VOL > C:\A no 98, ME, XP e VistaUlt, nos meus PCs e em todos os clientes, em Clipper52e/Blinker5ou7 e xHarbour, e em nenhum micro nunca tive problema algum...

Quanto ao Win2000, não tenho nenhum cliente usando, mas mandei um programa meu para um colega que o usa, pra testar exatamente essas "amarrações", e rodou normal.

Estranho...

Enviado: 01 Set 2007 17:40
por Maligno
agora se vc quer o numero de série do fabricante do HD...de uma porcura no link abaixo um codigo em .C e compile no xharbour..
Se for assim, mais fácil: pegue o fonte do WAPI.C no meu site. Está lá também pra isso.

Enviado: 01 Set 2007 17:42
por Maligno
sempre usei (e continuo usando) RUN VOL > C:\A
Pois é, Eolo. Não uso, nem testei o Vista, mas não consigo imaginar o por quê disso não funcionar. Muito embora, pra obter o número de série de formatação do HD, eu preferiria usar aquela função da API do Windows.

Enviado: 05 Set 2007 17:35
por sygecom
Estava eu aqui arrumando uma segurança para os meus sistemas onde o cliente não tem Internet....e me deparei que com o link abaixo...volume do HD nem pensar....o negocio é amarrar numero de serie do HD mais BIOS...e algumas coisa a mais !!!...
http://www.microsoft.com/technet/sysint ... umeId.mspx

Abraços
Leonardo Machado