C#
- Identificador 'Digital' para o computador local
Que tal gerar um identificador para o seu computador local de forma que ele funcione como uma impressão digital e seja único ?
Neste artigo eu vou adaptar um projeto encontrado na web cujo objetivo é gerar um identificação única para um computador local.
É um projeto simples que precisa ser otimizado mas que dá uma ideia do que pode ser feito para poder identificar o hardware de um computador.
Eu vou usar o Visual C# 2010 Express Edition para criar o projeto exemplo.
Abra o Visual C# 2010 Express Edition e crie um novo projeto do tipo Windows Application com o nome IdentificacaoDigital:
A seguir inclua o formulário form1.cs um controle PictureBox(picId) , um controle Button(btnId) e um controle Label (lblId) conforme o leiaute abaixo:
![]() |
Vamos incluir uma referência ao namespace System.Management em nosso projeto.
O namespace System.Management fornece acesso a um rico conjunto de informações gerenciais e gestão de eventos sobre o sistema, dispositivos e aplicativos instrumentados para a infraestrutura do Windows Management Instrumentation (WMI).
Aplicativos e serviços podem consultar informações de gestão interessantes (como quanto espaço livre é deixado no disco, o que é a utilização da CPU atual, qual banco de dados de uma determinada aplicação está conectado, e muito mais), usando classes derivadas de ManagementObjectSearcher e ManagementQuery , ou podem se inscrever para uma variedade de eventos de gerenciamento usando a classe ManagementEventWatcher. Os dados acessíveis podem ser de ambos os componentes gerenciados e não gerenciados no ambiente distribuído.
No menu Project clique em Add Reference e na janela a seguir clique na aba .NET e selecione System.Management e clique no botão OK;
![]() |
A seguir no menu Project clique Add New Item -> Class e informe o nome Identifica.cs.
A seguir digite o código abaixo nesta classe:
using System.Management; namespace IdentificacaoDigital
{
class Identifica
{
//obtem os valores e empacota em uma string única
public string Valor()
{
return empacota(cpuId()
+ biosId()
+ diskId()
+ baseId()
+ videoId()
+ macId());
}
//Retorna o identificador do hardware
private string identificador(string wmiClass, string wmiProperty, string wmiMustBeTrue)
{
string resultado = "";
ManagementClass mc = new ManagementClass(wmiClass);
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
if (mo[wmiMustBeTrue].ToString() == "True")
{
//pega somente o primeiro
if (resultado == "")
{
try
{
resultado = mo[wmiProperty].ToString();
break;
}
catch
{
}
}
}
}
return resultado;
}
private string identificador(string wmiClass, string wmiProperty)
///Retorna o identificador do hardware
{
string resultado = "";
ManagementClass mc = new ManagementClass(wmiClass);
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
//pega somente o primeiro
if (resultado == "")
{
try
{
resultado = mo[wmiProperty].ToString();
break;
}
catch
{
}
}
}
return resultado;
}
private string cpuId()
{
//Usa o primeiro identificador da CPU na ordem de preferencia
//Não pega todos os identificadores, pois demora muito tempo
string retVal = identificador("Win32_Processor", "UniqueId");
if (retVal == "") //Se não obter o UniqueID, usa o ProcessorID
{
retVal = identificador("Win32_Processor", "ProcessorId");
if (retVal == "") //Se não pegar o ProcessorId, usa o Name
{
retVal = identificador("Win32_Processor", "Name");
if (retVal == "") //Se não pegar o Name, usa o Manufacturer
{
retVal = identificador("Win32_Processor", "Manufacturer");
}
//Adiciona o clock speed por segurança
retVal += identificador("Win32_Processor", "MaxClockSpeed");
}
}
return retVal;
}
private string biosId()
//identifica a BIOS
{
return identificador("Win32_BIOS", "Manufacturer")
+ identificador("Win32_BIOS", "SMBIOSBIOSVersion")
+ identificador("Win32_BIOS", "IdentificationCode")
+ identificador("Win32_BIOS", "SerialNumber")
+ identificador("Win32_BIOS", "ReleaseDate")
+ identificador("Win32_BIOS", "Version");
}
private string diskId()
//ID do principal disco rigido
{
return identificador("Win32_DiskDrive", "Model")
+ identificador("Win32_DiskDrive", "Manufacturer")
+ identificador("Win32_DiskDrive", "Signature")
+ identificador("Win32_DiskDrive", "TotalHeads");
}
private string baseId()
//ID da Motherboard
{
return identificador("Win32_BaseBoard", "Model")
+ identificador("Win32_BaseBoard", "Manufacturer")
+ identificador("Win32_BaseBoard", "Name")
+ identificador("Win32_BaseBoard", "SerialNumber");
}
private string videoId()
//ID do controlador de video primário
{
return identificador("Win32_VideoController", "DriverVersion")
+ identificador("Win32_VideoController", "Name");
}
private string macId()
//ID da rede habilitada
{
return identificador("Win32_NetworkAdapterConfiguration", "MACAddress", "IPEnabled");
}
private string empacota(string text)
//Empacota a string para 8 digitos
{
string retVal;
int x = 0;
int y = 0;
foreach (char n in text)
{
y++;
x += (n * y);
}
retVal = x.ToString() + "00000000";
return retVal.Substring(0, 8);
}
}
}
|
Agora no evento Click do botão de comando btnId inclua o código abaixo:
| private void btnId_Click(object sender, EventArgs e) { Identifica id = new Identifica(); lblId.Text = id.Valor().ToString(); } |
Executando o projeto e clicando no botão de comando teremos o número gerado que servirá para identificar o computador como uma impressão digital.
![]() |
É óbvio que se o computador for formatado um novo número diferente será gerado. Leve isso em conta.
O processo de geração do número poderá ser um tanto lento dependendo da forma de aplicação e isto pode ser otimizado.
Simples e funcional como só o C# consegue ser...
Pegue o projeto completo
aqui:
IdentificacaoDigitalCSharp.zip
Mar 1:39
Foi, então, por toda a Galiléia, pregando nas sinagogas deles e expulsando os demônios.Mar 1:40
E veio a ele um leproso que, de joelhos, lhe rogava, dizendo: Se quiseres, bem podes tornar-me limpo.Mar 1:41
Jesus, pois, compadecido dele, estendendo a mão, tocou-o e disse-lhe: Quero; sê limpo.Mar 1:42
Imediatamente desapareceu dele a lepra e ficou limpo.Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
http://msdn.microsoft.com/en-us/library/system.management.aspx
ASP .NET - Gerenciando serviços como System ... - Macoratti.net