... Pague apenas R$67,00 uma única vez e tenha acesso por 1 ano aos vídeos e arquivos exemplos do site ...

Clique aqui e obtenha mais detalhes.


Obtendo o MAC da placa de rede

Toda a placa de rede possui um endereço fixo, conhecido como MAC (Media Access Control), que é gravado em um dos seus chips.   Esse endereço possui 12 dígitos, com o seguinte formato: 02-00-54-B5-4E-01.  Convém destacar que não existem duas placas de rede com o mesmo endereço, o que torna para nós, programadores, um instrumento de identificação exclusiva do computador do usuário.  A principal utilidade, consiste na geração de uma chave de segurança, contra a pirataria, para os nossos aplicativos, e que você poderá se aprofundar no tutorial sobre Sistema Shareware, aqui do site.

Até bem pouco tempo, vinha  usando o número do HD (que também é uma boa opção) como forma de identificar a máquina do usuário, porque o código para a extração desse endereço MAC que eu tinha, era complicado e não confiável, pois falhava em alguns modelos de placas.

Acabei que em minhas andanças pelos fóruns, encontrei um código, que capturava o IP da máquina e achei então que esse código poderia ser adaptado para capturar o MAC.  A adaptação deu certo e o código ficou bem simples.  

O seu computador possui um velho sistema operacional, chamado de DOS e que é muito utilizado até hoje pelo pessoal da área de manutenção, pois existem vários comandos úteis e dentre eles está o que captura o número MAC da placa de rede.    Para abrir a tela do DOS ,  basta rodar o comando CMD pelo executar do Windows.

Veja a tela do DOS abaixo:

CMD

Observe que foi digitado o comando GETMAC /NH /FO CSV para se obter as informações do MAC da Placa de Rede.

Pois bem, é possível, através do VBA, acionar essa tela do DOS, executar o comando GETMAC e extrair o endereço MAC.

Leia com atenção os comentários do código utilizado!

Function fncMAC() As String
Dim strResultado As String
Dim objFSO As Object
Dim objShell As Object
Dim objTempFile
Dim objTextFile
 
On Error GoTo TrataErro
 
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("Wscript.Shell")
 
'Cria um arquivo temporário para receber o resultado do comando GETMAC
objTempFile = objFSO.GetTempName

'Executa o comando GETMAC e transfere o resultado para o arquivo 
'temporário objTempFile
objShell.Run "cmd /c GETMAC /NH /FO CSV >" & objTempFile, 0, True
 
'Abre o arquivo temporário
Set objTextFile = objFSO.OpenTextFile(objTempFile, 1)

'Obtém o resultado do comando GETMAC, lido do arquivo temporário objTempFile
Do While objTextFile.AtEndOfStream <> True
   strResultado = strResultado & objTextFile.ReadLine
Loop

'Fecha o arquivo temporário
objTextFile.Close
'Deleta o arquivo temporário
objFSO.DeleteFile (objTempFile)
 
' O resultado é como este abaixo:
' "02-00-54-B5-4E-01","\Device\Tcpip_{1928A031-91CF-46DE-A1BD-BF82CA2CF397}"
' Extraindo o MAC com a função MID. 17 caracteres, a partir do 2º
fncMAC = Mid$(strResultado, 2, 17)
 
Sair:
   Set objShell = Nothing
   Set objFSO = Nothing
   Exit Function

TrataErro:
   MsgBox "Não foi identificado a placa de rede...",vbInformation,"Aviso"
   Resume Sair
End Function

Segue o arquivo exemplo, com o código apresentado. Ofereço também uma codificação para transformar essa seqüência hexadecimal , em um número padronizado.

Bom estudo!


 

 


14 comentário(s)

MARCIO MELO - RJ   11/06/2011 17:55:59

Executei o cód. no cmd / DOS funcionou, pegou a MAC mesmo c a placa de rede desconectada, não funcionou no ex. em access, e também não retornou nenhum erro. Irei análisar mais pra frente o que aconteceu, mais uma fonte de serial, forte abraço a todos...

Jairo William Meireles Iglesias   12/06/2011 19:58:09

Também testei esse exemplo e não funcionou no Access.
No DOS funcionou perfeitamente.

Sabe dizer o porque de não ter funcionado?

Alessandro Batistuti   13/06/2011 08:59:40

Testei o cód acima e também não retornou nenhum valor.

Avelino Sampaio   14/06/2011 05:47:53

Jairo e Alessandro,

informe a versão do Windows. Xp, Vista ou 7 ?

verifiquem se a macro de segurança do Access está ativa.

No aguardo

Jairo William Meireles Iglesias   14/06/2011 10:20:43

Estou usando Windows XP com SP3.
A macro de segurança está desativada totalmente.

Avelino Sampaio   15/06/2011 07:49:17

Jairo,

obrigado pela sua informação. Hoje mesmo estarei testando o código no Windows Xp e darei um retorno. Acredito que estaja faltando um tempo de espera no código para capturar o valor objTempFile.

Avelino Sampaio   16/06/2011 04:54:12

Jairo,

fiz uma modificação no código. Por favor, baixe o exemplo novamente e faça o teste.

caso não resolva, entre em contato pela seção "contato" aqui do site para eu me comunicar com você.

no aguardo

Jairo William Meireles Iglesias   24/06/2011 21:11:33

Avelino Sampaio,

Funcionou agora ^^

Otimo trabalho. Obter o endereço de MAC do computador do cliente ajuda em um bom codigo de registro do sistema.

Obrigado.

DILTON LAGO   29/06/2011 21:07:47

Ola, gostaria de saber se tem uma dica simples como essa para obter o IP da maquina.

Avelino Sampaio   06/07/2011 07:52:27

Dilton,

Com algumas modificações , você pode utilizar o código acima , usando o comando IPConfig.

Outra solução bem simples seria usando o WMI. Abra o VBA, rode a função abaixo e veja o resultado na janela imediata.

Public Sub IP()
Dim objWMIService As Object
Dim strComputer As String
Dim IPConfigSet
Dim IPConfig
Dim i
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set IPConfigSet = objWMIService.ExecQuery _
("Select * from Win32_NetworkAdapterConfiguration Where IPEnabled=TRUE")

For Each IPConfig In IPConfigSet
If Not IsNull(IPConfig.IPAddress) Then
For i = LBound(IPConfig.IPAddress) To UBound(IPConfig.IPAddress)
Debug.Print IPConfig.IPAddress(i)
Next
End If
Next
End Sub

Sucesso!

Marcondes Souza   13/08/2011 10:03:21

Avelino, bom dia,

Gostaria de saber se tem uma possibilidade de gerar um código sequencial a partir do momento quando os caracteres forem diferentes caso contrário gere o código sequencial 001;

Avelino Sampaio   13/08/2011 12:23:59

Marcondes,

não conesgui captar bem o que vc deseja. Entre em contato pela seção Contato aqui do site e me forneça mais detalhes.

No aguardo

Alessandra   26/04/2012 23:05:56

Boa Noite Avelino

E se eu precisar pegar o número do hd também usando o windows 7.

Grata

Avelino Sampaio   27/04/2012 09:01:20

Alessandra,

vá na seção "Tutorias" aqui do site e abra o tutorial sobre "Shareware". Lá tem o código para o HD

Bom estudo!


Envie seu comentário: