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:
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
'Cria um arquivo temporário para receber o resultado do comando GETMAC
'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
'Obtém o resultado do comando GETMAC, lido do arquivo temporário 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)
MsgBox "Não foi identificado a placa de rede...",vbInformation,"Aviso"
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.
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.
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
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
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ê.
Jairo William Meireles Iglesias 24/06/2011 21:11:33
Funcionou agora ^^
Otimo trabalho. Obter o endereço de MAC do computador do cliente ajuda em um bom codigo de registro do sistema.
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
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()
Debug.Print IPConfig.IPAddress(i)
Marcondes Souza 13/08/2011 10:03:21
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
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.